Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TMonthCalendar + Tage Fett markieren + Schleife (https://www.delphipraxis.net/171998-tmonthcalendar-tage-fett-markieren-schleife.html)

PTB 6. Dez 2012 14:53

Delphi-Version: XE

TMonthCalendar + Tage Fett markieren + Schleife
 
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 :wink:

DeddyH 6. Dez 2012 15:03

AW: TMonthCalendar + Tage Fett markieren + Schleife
 
Hallo und Willkommen in der DP :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;

PTB 6. Dez 2012 15:30

AW: TMonthCalendar + Tage Fett markieren + Schleife
 
Erst mal danke für die Hilfe,

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

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

PTB 7. Dez 2012 14:37

AW: TMonthCalendar + Tage Fett markieren + Schleife
 
Das Problem hat sich erledigt:-D:-D

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 :wink:)

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

Sir Rufo 7. Dez 2012 16:05

AW: TMonthCalendar + Tage Fett markieren + Schleife
 
In deiner Methode MarkingDays baust du dir (exorbitant umständlich) aus einem Datum
Delphi-Quellcode:
MC1.Date
zwei String Werte und weist diese beiden Stringwerte dann wieder
Delphi-Quellcode:
MC1.Date
zu.

Das ist ja wohl eine Zuweisung zuviel ... ;)

shmia 7. Dez 2012 16:27

AW: TMonthCalendar + Tage Fett markieren + Schleife
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

PTB 10. Dez 2012 13:39

AW: TMonthCalendar + Tage Fett markieren + Schleife
 
@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:).


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 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