21. november 2001 - 11:09Der 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å ???
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.
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 ??
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 ;)
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;
Synes godt om
Ny brugerNybegynder
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.