Avatar billede nih Novice
21. november 2001 - 11:09 Der er 5 kommentarer og
1 løsning

db til stringGrid

I mit TstringGrids onDrawCell har jeg følgende kode:

day := encodeDate( strToint(edtaar.Text),
                      cmboMaaned.itemindex+1 ,
                      strToInt(SGrMndKal.cells[Acol,1]) );
  if (DayOfWeek(day) = 1) or (DayOfWeek(day) = 7) then
      SGRMndKal.canvas.Brush.Color := clYellow;

Mit kalenderGrid får altså gule weekender! Min db har en tabel: \'helligdage\' - HVORDAN kan jeg nemmest tegne helligdagene gule også ???

Niels
Avatar billede nih Novice
21. november 2001 - 11:11 #1
PS..

Jeg har prøvet at definere en type Thelligdage = set of TDateTime;

Den virker ikke HVORFOR ??

Niels
Avatar billede hreiff Nybegynder
22. november 2001 - 11:00 #2
Når du bruger \'Set of\' skal det være en ordinal type (integer, char osv) - TDateTime = Float duer ikke.

Du kan lave:    Helligdage: array[0..100]
og konvertere dine helligdage:

for i := 0 to 100 do
  Helligdage[i] := 0;    {nulstiller array indhold}
Helligdage[0] := EncodeDate(2001,11,22)
Helligdage[1] := ....


og så undersøge
Hellig := false:
for i := 0 to 100 do
  if day = Helligdage[i] then Hellig := True;

if (DayOfWeek(day) = 1) or (DayOfWeek(day) = 7) or Hellig then
  SGRMndKal.canvas.Brush.Color := clYellow;

//hreiff

Avatar billede nih Novice
22. november 2001 - 23:27 #3
Det virker nu :)

Det er lavet på flg måde:
  I et datamodul med et globalt Array
  DataModulet indeholder en procedure der sætter Arrayet op når programmet starter.
  Datamodulet indeholder en function \'ErHellig(Adato : tDateTime) : boolean\' (den minder om din hreiff)

Derefter ser min if del således ud:

if (DayOfWeek(day) = 1) or (DayOfWeek(day) = 7) or data.erHelligdag(day)  then
      SGRMndKal.canvas.Brush.Color := clYellow;

Spørgsmålet er om dette er en optimal løsning med alle de functionskald til mit datamodul, eller er der en mere optimal måde.

Niels (Nybegynderen)
Avatar billede hreiff Nybegynder
23. november 2001 - 09:30 #4
Funktionskaldene er ikke særlig dyre tidsmæssigt, da DayOfWeek er en ret simpel funktion (noget med MOD 7), men du kan da bruge:
if (DayOfWeek(day) in [1,7]) or  osv.
Så sparer du et enkelt kald.
Det er nok vigtigere at minimere din helligdagsarray, så der ikke skal laves så mange sammenligninger, eller allerbedst: lave en Quickfind procedure: Da helligdagene nok er sorteret, kan man spare mindst 75% af sammenligningerne. Der findes oceaner af den type sorterings/genfindings-rutiner. Typisk er det noget med at gå ind midt i array\'et og undersøge størrelsen. Afhængig om det er større eller mindre, vælger man så midt i nederste hhv. øverste halvdel af array\'et osv.
Jeg har ikke lige et eksempel her, men de findes i stort set alle programmeringsbøger. Du kan også spørge Eksperten, så får du garanteret et svar i løbet af et øjeblik.
Muligvis findes der standard-procedurer i delphi ??

//hreiff
Avatar billede nih Novice
23. november 2001 - 10:03 #5
Tak for hjælpen - og din sidste kommentar.

Jeg har lavet en del i VBA - Access, men synes efterhånden at jeg var noget begrænset af mikrosoft, så derfor har jeg kastet mig over Delphi.
Så i må have lidt tålmodighed med mine dumme spørgsmål ;)

Niels
Avatar billede hreiff Nybegynder
23. november 2001 - 10:55 #6
Jeg biksede lige denne her sammen:
(du kan bruge den hvis du ikke finder eller laver noget bedre)

const
  FlArr: array[1..5] of double = (1.234,2.345,3.456,4.567,5.678);

function QuickFind(x: double):boolean;
var
  stop : boolean;
  i,j,k: integer;
begin
  stop := false;
  Result := false;
  i := low(FlArr);
  k := high(FlArr);
  j := (i+k) div 2;
  repeat
    if x = FlArr[j] then
    Begin
      Result := True;
      Stop := true;
    end
    else
    Begin
      if k-i<=1 then
      begin
        if x = FlArr[k] then
          Result := true;
        stop := true;
      end;
      if x > FlArr[j] then
        i := j
      else
        k := j;
      j := (i+k) div 2;
    end;
  until stop;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  if QuickFind(2.345) then
    label1.caption := \'Ok\'
  else
    label1.caption := \'Findes ikke\';
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