AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TMonthCalendar + Tage Fett markieren + Schleife

Ein Thema von PTB · begonnen am 6. Dez 2012 · letzter Beitrag vom 10. Dez 2012
Antwort Antwort
PTB

Registriert seit: 6. Dez 2012
4 Beiträge
 
#1

TMonthCalendar + Tage Fett markieren + Schleife

  Alt 6. Dez 2012, 14:53
Delphi-Version: XE
Hallo zusammen,

ich bin neu in diesem Forum und nicht sicher ob ich das richtige "Abtei" benutze ,falls nicht sry.

Nun zu meinem Problem:

Ich benutze (wie oben im Titel erwähnt) die Komponente TMonthCalendar und möchte bestimmte Tage, welche ich aus einer Datenbank beziehe Fett markieren.
Das klaptt soweit auch, allerdings haben ich das Problem das ich wenn ich das Schleifen basierend mache (da ich ich immer eine unbestimmte menge an Tagen nacheinander habe aber nie mehr als 15) das diese nicht Fett dargestellt werden.

Hier mal der Code damit ihr meine Problematik besser nachvollziehen könnt:

Delphi-Quellcode:
procedure TFormHotelbuchungsassistent.MonthCalendar1Click(Sender: TObject);
var
  sl_date: TStringList;
  s_day: string;
  s_year: string;
  s_sql: string;
  i_i1: integer;
  i_anzahl_tage: integer;
  i_i2: integer;
  MonthBoldInfo: Cardinal;
begin

  sl_date := TStringList.Create;
  sl_date.Delimiter := '.';
  sl_date.StrictDelimiter := True;
  sl_date.DelimitedText := DateToStr(MonthCalendar1.Date);

  s_day := sl_date[0];
  s_month := sl_date[1];
  s_year := sl_date[2];

  s_sql := 'SELECT datum_start,buchungszeitraum FROM hotelbuchungsassistent.buchung WHERE EXTRACT(MONTH FROM datum_start) = '
    + s_month;

  PSQLQuery1.Close;
  PSQLQuery1.SQL.Clear;
  PSQLQuery1.SQL.Add(s_sql);
  PSQLQuery1.Open;

  for i_i1 := 0 to PSQLQuery1.RecordCount - 1 do
  begin
    sl_date.DelimitedText := PSQLQuery1.FieldByName('datum_start').AsString;

    i_start_datum := StrToInt(sl_date[0]);
    i_anzahl_tage := PSQLQuery1.FieldByName('buchungszeitraum').AsInteger;

    for i_i2 := i_start_datum to (i_anzahl_tage + i_start_datum) - 1 do
    begin
      SetLength(a_day, Length(a_day) + 1);
      a_day[Length(a_day) - 1] := i_i2;
    end;
  end;
  MonthCalendar1GetMonthInfo(MonthCalendar1, StrToInt(sl_date[1]),
    MonthBoldInfo);
end;

procedure TFormHotelbuchungsassistent.MonthCalendar1GetMonthInfo
  (Sender: TObject; Month: Cardinal; var MonthBoldInfo: Cardinal);
begin
  if Length(a_day) <> 0 then
  begin
    MonthCalendar1.BoldDays(a_day, MonthBoldInfo);
    SetLength(a_day, 0);
  end;
end;
Falls unklarheiten vorhanden sind einfach sagen , ich drücke mich gern mal etwas ungenau aus.

Danke im vorraus

ps: Bin auch noch anfänger also bitte seid gnädig

Geändert von PTB ( 6. Dez 2012 um 15:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TMonthCalendar + Tage Fett markieren + Schleife

  Alt 6. Dez 2012, 15:03
Hallo und Willkommen in der DP ,

Du navigierst nicht durch Dein Dataset, sondern stehst immer auf demselben Datensatz. Statt einer For-Schleife bis RecordCount solltest Du es einmal so versuchen:
Delphi-Quellcode:
PSQLQuery1.Open;
while not PSQLQuery1.EOF do
  begin
    (* Datensatz verarbeiten *)
    PSQLQuery1.Next;
  end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
PTB

Registriert seit: 6. Dez 2012
4 Beiträge
 
#3

AW: TMonthCalendar + Tage Fett markieren + Schleife

  Alt 6. Dez 2012, 15:30
Erst mal danke für die Hilfe,

allerdings denke ich das ich es wieder geschafft habe mich falsch auszudrücken

die sachen von wegen immer 1.Datensatz das weiß ich und wollte ich auch noch ändern ist aber der zeit nicht mein problem:

also sagn wir mal ich habe das datum 10.12.2012 und bin am ende der inneren for-schleife angekommen

dann stehen im array a_day die korrekten daten:
[0]=10
[1]=11
[2]=12
[3]=13
[4]=14 (weil 5 tage einschließlich 10.12.2012)

diese tage rufe ich dann in MonthCalendar1.BoldDays(a_day,MonthBoldInfo) wieder auf (und auch da sind sie Korrekt)
werden aber nicht markiert

wenn ich allerding vor den start in eben dieser die daten vordefiniere (heißt ich habe sie vor dem start manuell gesetzt werden sie fett angezeigt also z.b. MonthCalendar1.BoldDays([1,3,6,9],MonthBoldInfo) (natürlich ohne if zeug)

danke im vorraus
  Mit Zitat antworten Zitat
PTB

Registriert seit: 6. Dez 2012
4 Beiträge
 
#4

AW: TMonthCalendar + Tage Fett markieren + Schleife

  Alt 7. Dez 2012, 14:37
Das Problem hat sich erledigt

Für die, die es interessiert hier meine Lösung:

Delphi-Quellcode:
procedure TForm16.GetMarkingDays();
var
  MonthBoldInfo: Cardinal;
  sl_date: TStringList;
  s_sql: string;
  i_i1: Integer;
  i_i2: Integer;
  s_day: string;
  s_month: string;
  s_year: string;
  i_start_date: Integer;
  i_amount_days: Integer;
begin

  sl_date := TStringList.Create;
  sl_date.Delimiter := '.';
  sl_date.StrictDelimiter := True;
  sl_date.DelimitedText := DateToStr(MC1.Date);

  s_day := sl_date[0];
  s_month := sl_date[1];
  s_year := sl_date[2];

  PSQLQuery1.Close;
  PSQLQuery1.SQL.Clear;
  s_sql := 'SELECT datum_start,buchungszeitraum '+
           'FROM hotelbuchungsassistent.buchung '+
           'WHERE EXTRACT(MONTH FROM datum_start) = ' + s_month + ' ' +
           'ORDER BY EXTRACT(DAY FROM datum_start)';
  PSQLQuery1.SQL.Add(s_sql);
  PSQLQuery1.Open;

  for i_i1 := 0 to PSQLQuery1.RecordCount - 1 do
  begin
    sl_date.DelimitedText := PSQLQuery1.FieldByName('datum_start').AsString;

    i_start_date := StrToInt(sl_date[0]);
    i_amount_days := PSQLQuery1.FieldByName('buchungszeitraum').AsInteger;

    for i_i2 := i_start_date to (i_amount_days + i_start_date) - 1 do
    begin
      SetLength(a_day, Length(a_day) + 1);
      a_day[Length(a_day) - 1] := i_i2;
    end;
    PSQLQuery1.Next;
  end;

  b_markieren := True;
  MC1.OnGetMonthInfo(MC1, 12, MonthBoldInfo);
  MarkingDays();
end;

procedure TForm16.MarkingDays();
var
  s_date1: string;
  s_date2: string;
  s_date_complete: string;
  sl_date: TStringList;
begin
  s_date_complete := DateToStr(MC1.Date);

  sl_date := TStringList.Create;
  sl_date.Delimiter := '.';
  sl_date.StrictDelimiter := True;
  sl_date.DelimitedText := s_date_complete;

  s_date1 := sl_date[0]+'.'+sl_date[1]+'.'+IntToStr(StrToInt(sl_date[2])+4);
  s_date2 := sl_date[0]+'.'+sl_date[1]+'.'+sl_date[2];

  MC1.Date := StrToDate(s_date1);
  MC1.Date := StrToDate(s_date2);
end;
Falls jemad was nicht versteht einfach fragen (bin zwar anfänger aber arbeite schon so lange an diesem Problem das ich genau sagen kann was wo passiert und warum )

Jatzt habe ich aber das Problem das ich diese Tage nicht wieder Normal bekomme, also das sie nicht mehr Fett sind.

Gibt es irgendwie eine möglichkeit das ich Objekt neu lade also das ich das wie beim start wiederfinde?

Danke im vorraus

Geändert von PTB ( 7. Dez 2012 um 14:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TMonthCalendar + Tage Fett markieren + Schleife

  Alt 7. Dez 2012, 16:05
In deiner Methode MarkingDays baust du dir (exorbitant umständlich) aus einem Datum MC1.Date zwei String Werte und weist diese beiden Stringwerte dann wieder MC1.Date zu.

Das ist ja wohl eine Zuweisung zuviel ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: TMonthCalendar + Tage Fett markieren + Schleife

  Alt 7. Dez 2012, 16:27
Ich hänge mal ein Demo zum MonthCalendar an.
Mit der Hilfsklasse in Unit UMonthBoldStorage kann man jeden einzelnen Tag eines
Jahres einzeln markieren und damit "fett" darstellen.
Angehängte Dateien
Dateityp: zip MonthCalendarDemo.zip (3,4 KB, 15x aufgerufen)
Andreas
  Mit Zitat antworten Zitat
PTB

Registriert seit: 6. Dez 2012
4 Beiträge
 
#7

AW: TMonthCalendar + Tage Fett markieren + Schleife

  Alt 10. Dez 2012, 13:39
@sir rufus

das mit dem zuweisen von date ist nur dami der die Änderung auch durchführt, sprich so das ich als Benutzer das auch sehen kann (habe das auch schon mit refresh, repaint und was es sonst noch so gibt versucht aber endweder mache ich was falsch oder das geht wirklich nicht)
weil man sonst einen Monat zurück bzw. vor muss.



@shmia

ich bin zwar dankbar für die Hilfe aber dennoch ändert sich die Tatsache nicht das ich anfänder bin
(auch wenn meine code vielleicht eine andere sprache spricht)
und nicht so recht verstehe was da genau passier und wie ich das ganze jetzt einbinden müsste.

und das Markieren geht ja Problemlos nur bekomme ich diese nicht mehr in Normalfigur.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz