Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Monatswechsel im TMonthCalendar (https://www.delphipraxis.net/151765-monatswechsel-im-tmonthcalendar.html)

mtm2502 31. Mai 2010 22:09


Monatswechsel im TMonthCalendar
 
Hallo zusammen.

Ich beschäftige mich seit neuestem mit Delphi (Version 7). Finde es super. Komme von der VB-Seite. Jetzt bin ich aber bei einem kleinen Progrämmchen auf ein Problem gestoßen.

Ich benutze dabei die Komponente TMonthCalendar. Im Gegensatz zum Monthview-Control bei VB gibt es hier keine Möglichkeit zu unterscheiden, ob man auf ein Datum clickt, oder nur einen Monat vor-, bzw. zurückblättert.
Wie kann ich die Komponente erweitern um diesen Unterschied feststellen zu können.

Danke im Voraus
mtm2502

ConstantGardener 1. Jun 2010 05:31

Re: Monatswechsel im TMonthCalendar
 
Herzlich willkommen erstmal in der DelphiPraxis :dp:

Das Control TMonthCalendar kapselt ja nur ein WindowsControl. Da Du dieses Teil aber auch zur Anzeige von mehreren Monaten "missbrauchen" kannst wird das mit dem Monatswechsel direkt etwas schwieriger. Du willst ja wahrscheinlich nur den Klick auf die oberen Pfeile abfangen, oder? Ich würde mir das aktuelle Datum einfach merken und beim OnChange-Event des TMonthCalendar das Datum mit DecodeDateTime zerlegen und schauen ob sich da was geändert hat. Das Jahr mit vergleichen nicht vergessen !!

mfg

cg

himitsu 1. Jun 2010 07:39

Re: Monatswechsel im TMonthCalendar
 
Willst du nur wissen wann der Monat gewechselt wird
oder willst du es verhindern?


Wissen:
> aktuell eingerstellten Monat merken
> im OnChange vergleichen und neuen Monat merken

Verhindern:
> .MinDate und .MaxDate setzen

Delphi-Quellcode:
// z.B. für diesen Monat
MonthCalendar1.MinDate := EncodeDate(2010, 05, 01);
MonthCalendar1.MaxDate := EncodeDate(2010, 05, 30);

// aktueller Monat
var Y, M, D: Word;
DecodeDate(Now, Y, M, D);
MonthCalendar1.MinDate := Now - D + 1;
MonthCalendar1.MaxDate := Now - D + MonthDays[IsLeapYear(Y), M];

mtm2502 1. Jun 2010 11:08

Re: Monatswechsel im TMonthCalendar
 
Danke schon mal.

Da ich nur wissen wollte, ob der Monat gewechselt wird oder ein Datum angeclickt wird habe ich es über den Vergleich von Monat und Jahr hinbekommen.
Ich hatte gedacht, dass man die Komponente evtl. um ein Event erweitern könnte und da habe ich nicht so die Erfahrung. Aber so geht's natürlich auch.

trotzdem Danke

mtm2502

P.S. :
@ConstantGardener :
Wie Du schon angedeutet hast, funzt das bei Anzeige eines einzelnen Monats ganz gut, wenn aber mehrere Monate angezeigt werden, klappt das nicht.

himitsu 1. Jun 2010 11:14

Re: Monatswechsel im TMonthCalendar
 
Erweitern könnte man diese Komponente schon
- neue Komponente von dieser ableiten
- intern die Änderungsmeldung abfangen
- auswerten/vergleichen und dann das neu eingerichtete Event auslösen
- neue Komponente über ein DesignTime-Pakage registrieren, damit man sie über den FormEditor nutzen kann

mtm2502 1. Jun 2010 15:39

Re: Monatswechsel im TMonthCalendar
 
Soweit war mir das schon klar.
Ich hatte gehofft, dass hier schon mal jemand mit diesem Problem zu tun hatte und vielleicht schon einen Lösungsansatz hat.

Ich habe es schon mal so angefangen
Das Problem ist die Änderungsmeldung. Ich habe im Internet mal nachgeschaut und bin davon ausgegangen, dass die Komponente auf den 'Month Calender' von MS aufsetzt. Dieser hat auch einen NOTIFICATION CODE namens 'MCN_VIEWCHANGE'. Damit habe ich ein wenig rumprobiert, dieser ist aber nie aufgetreten (Mal ganz davon abgesehen, dass MCN_VIEWCHANGE nicht definiert ist).

Hier schon mal mein Versuch :

Delphi-Quellcode:
type
  TOnGetMonthInfoExtEvent = procedure(Sender: TObject; Month, Year: LongWord;
    var MonthBoldInfo: LongWord) of object;
  TOnChangeView = procedure(Sender:TObject) of Object;

  TMonthView = class(TMonthCalendar)
  private
    FOnGetMonthInfo: TOnGetMonthInfoExtEvent;
    FOnChangeView:TOnChangeView;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
  published
    property OnGetMonthInfo: TOnGetMonthInfoExtEvent read FOnGetMonthInfo write FOnGetMonthInfo;
    property OnChangeView:TOnChangeView read FOnChangeView write FOnChangeView;

  end;
Delphi-Quellcode:
procedure TMonthView.CNNotify(var Message: TWMNotify);
var
  I, MonthNo: Integer;
  CurState: PMonthDayState;
  YearAdd: integer;
begin
  inherited;

  with Message, NMHdr^ do
  begin
    case code of
      MCN_GETDAYSTATE:
      begin
        with PNmDayState(NMHdr)^ do
        begin
          FillChar(prgDayState^, cDayState * SizeOf(TMonthDayState), 0);
          if Assigned(FOnGetMonthInfo) then
          begin
            CurState := prgDayState;
            for I := 0 to cDayState - 1 do
            begin
              MonthNo := stStart.wMonth + I;
              if MonthNo > 12 then
              begin
                MonthNo := MonthNo - 12;
                YearAdd := 1;
              end
              else
              begin
                YearAdd := 0;
              end;
              FOnGetMonthInfo(Self, MonthNo, stStart.wYear+YearAdd, CurState^);
              Inc(CurState);
            end;
          end;
        end;
      end;
      MCN_VIEWCHANGE: // ist niemals aufgetreten
      begin
        if Assinged(FOnChangeView) then
        begin
          FOnChangeView(Self);
        end;
      end;
    end;
  end;
end;
Vielleicht kann mir da jemand weiterhelfen. Vielleicht hat sich hier auch ein kleiner Denkfehler meinerseits eingeschlichen.

Danke schon mal
mtm2502


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