Einzelnen Beitrag anzeigen

CmdrRicK

Registriert seit: 19. Aug 2004
Ort: Augsburg
5 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Daten bei TMonthCalendar markieren

  Alt 9. Mär 2009, 10:53
Da ich grade mit einem ähnlichen Problem beschäftigt bin und über diesen Thread gestolpert bin, wollte ich kurz hinterlassen was ich bereits als mögliche Lösung entdeckt habe. Auf QualityCentral findet man folgenden Workaround:

http://qc.embarcadero.com/wc/qcmain.aspx?d=26318

Delphi-Quellcode:
//Edit ComCtrls.pas to change the TOnGetMonthInfoEvent type definition:

TOnGetMonthInfoEvent = procedure(Sender: TObject; Month, Year: LongWord; var MonthBoldInfo: LongWord) of object;

//and change the (private) TMonthCalendar.CNNotify method adding the lines with comments:

procedure TMonthCalendar.CNNotify(var Message: TWMNotifyMC);
var
  ST: TSystemTime;
  I, MonthNo, YearNo: Integer; // Add year
{$IF DEFINED(CLR)}
  DayState: TNMDayState;
  CurState: TMonthDayStateArray;
{$ELSE}
  DayState: PNMDayState;
  CurState: PMonthDayState;
{$IFEND}
begin
  with Message, NMHdr{$IFNDEF CLR}^{$ENDIF} do
  begin
    case code of
      MCN_GETDAYSTATE:
        begin
          DayState := NMDayState;
          with DayState{$IFNDEF CLR}^{$ENDIF} do
          begin
{$IF DEFINED(CLR)}
            SetLength(CurState, cDayState);
{$ELSE}
            FillChar(prgDayState^, cDayState * SizeOf(TMonthDayState), 0);
{$IFEND}
            if Assigned(FOnGetMonthInfo) then
            begin
{$IF DEFINED(CLR)}
              CurState := TMonthDayStateArray(NativeBufToArray(prgDayState, CurState));
{$IFEND}
              for I := 0 to cDayState - 1 do
              begin
                YearNo := stStart.wYear; // Get year
                MonthNo := stStart.wMonth + I;
                if MonthNo > 12 then
                begin
                  Inc(YearNo); // Update year
                  MonthNo := MonthNo - 12;
                end;
{$IF DEFINED(CLR)}
                FOnGetMonthInfo(Self, MonthNo, YearNo, CurState[I]); // Pass year
{$ELSE}
                FOnGetMonthInfo(Self, MonthNo, YearNo, CurState^); // Pass year
                Inc(CurState);
{$IFEND}
              end;
            end;
{$IF DEFINED(CLR)}
            prgDayState := ArrayToNativeBuf(CurState, prgDayState);
            NmDayState := DayState;
{$IFEND}
          end;
        end;
      MCN_SELECT, MCN_SELCHANGE:
        with NMSelChange{$IFNDEF CLR}^{$ENDIF} do
        begin
          ST := stSelStart;
          if not IsBlankSysTime(ST) then
            FDateTime := SystemTimeToDateTime(ST);
          if FMultiSelect then
          begin
            ST := stSelEnd;
            if not IsBlankSysTime(ST) then
              FEndDate := SystemTimeToDateTime(ST);
          end;
        end;
    end;
  end;
  inherited;
end;
anstatt die VCL Quellen zu überschreiben kann man natürlich einfach eine eigene Komponente ableiten...

entschuldigt bitte die Threadnekromantie, aber anderen Suchenden ist damit evtl geholfen
  Mit Zitat antworten Zitat