Avatar billede jetzen Nybegynder
05. januar 2005 - 13:57 Der er 1 kommentar

Markere datoer med fed i TMonthCalendar

Jeg har nogle datoer fra en acces database i formatet
eks: 02-11-2004, 05-01-2005, 22-05-2005

Hvordan får jeg markeret disse datoer?!?
Avatar billede tolderlund Nybegynder
06. januar 2005 - 09:39 #1
Man skal bruge det event der GetMonthInfo, der er et eksempel i hjælpen.
Der kan man bestemme hvilke dage i måneden der skal vises med fed.
GetMonthInfo eventen kaldes hver gang brugeren bladrer til en anden måned.
Der er bare et "lille" problem:
I Eventen kan man kun se hvilken måned der skal vises, ikke hvilket år den måned ligger i!!!
Det virker som om det er beregnet til at vise de samme dage i en måned med fed uanset hvilket år der er tale om, og det er vist ikke lige det du har brug for.
Så kigger man på TMonthCalendar Date property, men denne windows control er lettere hjernedød for Date er altid forkert: Den opdateres først til den nye måned EFTER at GetMonthInfo eventen slutter.
Derfor må man prøve at gætte sig til hvilken år/måned som kalenderen vil vise.
Nedenfor er mit forsøg på at gøre det:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    MonthCalendar1: TMonthCalendar;
    procedure MonthCalendar1GetMonthInfo(Sender: TObject; Month: Cardinal;
      var MonthBoldInfo: Cardinal);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FedeDage: array of TDate;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  DateUtils;

procedure TForm1.MonthCalendar1GetMonthInfo(Sender: TObject;
  Month: Cardinal; var MonthBoldInfo: Cardinal);
var
  Fede: array of Cardinal;
  i: Integer;
  Start, Stop: TDate;
begin
// Problem: Denne event kaldes FØR MonthCalendar1.Date ændres,
// så vi ser en gammel dato i.s.f. en dato i den nye måned der skal vises.

  Start := StartOfTheMonth(MonthCalendar1.Date);
  // Problem: MonthCalendar1.Date opdateres først EFTER denne event
  // Vi må derfor gætte os til den korrekte dato
  if MonthOf(Start) = Month then
  begin  // valgt samme måned i enten samme år eller et andet år (vi gætter på samme år)
    // Start er uændret
    Stop := EndOfTheMonth(Start);
  end
  else
  if MonthOf(IncMonth(Start, 1)) = Month then
  begin  // bruger har valgt næste måned (eller en måned i et andet år)
    Start := IncMonth(Start, 1);
    Stop := EndOfTheMonth(Start);
  end
  else
  if MonthOf(IncMonth(Start, -1)) = Month then
  begin  // bruger har valgt forrige måned (eller en måned i et andet år)
    Start := IncMonth(Start, -1);
    Stop := EndOfTheMonth(Start);
  end
  else
  begin // Der er valgt en måned i et ukendt år (vi gætter på samme år)
    Start := RecodeMonth(Start, Month);
    Stop := EndOfTheMonth(Start);
  end;

  SetLength(Fede, 0);
  for i := 0 to High(FedeDage) do
    if (FedeDage[i] >= Start) and (FedeDage[i] <= Stop) then
    begin
      SetLength(Fede, Length(Fede)+1);
      Fede[High(Fede)] := DayOf(FedeDage[i]);
    end;
  if Length(Fede) > 0 then
    MonthCalendar1.BoldDays(Fede, MonthBoldInfo);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(FedeDage, 1);
  FedeDage[0] := EncodeDate(2004, 11, 2);
  SetLength(FedeDage, Length(FedeDage)+1);
  FedeDage[1] := EncodeDate(2005, 1, 5);
  SetLength(FedeDage, Length(FedeDage)+1);
  FedeDage[2] := EncodeDate(2005, 5, 22);
end;

end.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester