AGB  ·  Datenschutz  ·  Impressum  







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

Monatswechsel im TMonthCalendar

Offene Frage von "mtm2502"
Ein Thema von mtm2502 · begonnen am 31. Mai 2010 · letzter Beitrag vom 1. Jun 2010
Antwort Antwort
mtm2502

Registriert seit: 23. Apr 2010
Ort: Köln
16 Beiträge
 
Delphi XE5 Architect
 
#1

Monatswechsel im TMonthCalendar

  Alt 31. Mai 2010, 22:09
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
Der größte Bug sitzt immer vor dem Bildschirm
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Monatswechsel im TMonthCalendar

  Alt 1. Jun 2010, 05:31
Herzlich willkommen erstmal in der DelphiPraxis

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
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#3

Re: Monatswechsel im TMonthCalendar

  Alt 1. Jun 2010, 07:39
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];
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mtm2502

Registriert seit: 23. Apr 2010
Ort: Köln
16 Beiträge
 
Delphi XE5 Architect
 
#4

Re: Monatswechsel im TMonthCalendar

  Alt 1. Jun 2010, 11:08
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.
Der größte Bug sitzt immer vor dem Bildschirm
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.167 Beiträge
 
Delphi 12 Athens
 
#5

Re: Monatswechsel im TMonthCalendar

  Alt 1. Jun 2010, 11:14
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mtm2502

Registriert seit: 23. Apr 2010
Ort: Köln
16 Beiträge
 
Delphi XE5 Architect
 
#6

Re: Monatswechsel im TMonthCalendar

  Alt 1. Jun 2010, 15:39
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
Der größte Bug sitzt immer vor dem Bildschirm
  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 10:28 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