Avatar billede tknudsen Nybegynder
29. maj 2000 - 13:00 Der er 4 kommentarer og
1 løsning

canvas i stringgrid

Jeg vil gerne ændre farven i en celle afhængig af værdien i en anden celle
Avatar billede sjensen Nybegynder
29. maj 2000 - 13:26 #1
du skal bruge stringriddens "onDraw" event. I denne (der aktiveres hvergang en celle skal vises) skal du teste på om den celle der er den aktive er den du vil ændre. Hvis det er sætter du grid.canvas.color := clDiTFarveValg; og ellers til den farve cancassen ellers har.

NB! Tænk på at denne event bliver kaldt for hver celle i gridden, og hver gang bare en af cellerne bliver ændret. Det er derfor vigtigt at du huske at teste på at det er den celle du vil ændre, og at du husker at sætte farver til default hvis det ikke er. Fordi det du gør er at ændre hele griddens canvas farve, men du kun gør det mens det er den celle du vil skifte farve på der er aktiv.

Det lyder måske som noget volapyk, men det virker. Desuden findes der en lang række 3-parts komponenter der bl.a. tilbyder farvede (db-)grids.

Hvis du ikke kan finde ud af det så sig til, så kan jeg vise dig et eks. jeg bruger til bl.a. at ændre på overskriftsteksternes formattering og baggrundsfarve.
Avatar billede tknudsen Nybegynder
29. maj 2000 - 13:30 #2
bliver onDraw ikke kun kaldt for hver celle hvis det nødvendig - feks ved en restore efter minimize ?
Avatar billede tknudsen Nybegynder
29. maj 2000 - 13:32 #3
jeg bruger CellRect for at få korrdinaterne på netop den celle jeg vil ændre - men det virker kun hvis jeg ændrer den celle jeg også editerer
Avatar billede sjensen Nybegynder
29. maj 2000 - 13:53 #4
om den kun bliver kaldt for den celler der bliver ændret vil jeg ikke afvise, selvom jeg mener at det gælder for alle synlige. Det burde selvfølggeligt kun være de celler der skifter udseende der er berørt. Men det kan du jo løse ved at sætte den ønskede celles værdi og du kan jo bare sætte det til den samme værdi som den allerede har.

Nedenstående den ondraw event jeg bruger:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Longint;
  Rect: TRect; State: TGridDrawState);
const
  FmtCentered = DT_SINGLELINE or DT_VCENTER or DT_NOCLIP or DT_CENTER;
  FmtLeft    = DT_SINGLELINE or DT_VCENTER or DT_NOCLIP or DT_LEFT;
  FmtRight    = DT_SINGLELINE or DT_VCENTER or DT_NOCLIP or DT_RIGHT;
var
  TempString : array[0..80] of char;
  acol  : integer absolute col;
  arow  : integer absolute row;
  format : integer;
begin
  with StringGrid1 do
  begin
    canvas.font := font;
    if arow = 0 then
    begin
      format := FmtCentered;
      canvas.font.color  := clWindowText;
      canvas.brush.color := clbtnface;
    end else
    begin
      format := FmtLeft;
      if state = [gdSelected, gdFocused] then
      begin
        canvas.font.color  := clHighLightText;
        canvas.brush.color := clHighLight;
      end else
      begin
        canvas.font.color  := clWindowText;
        canvas.brush.color := clWindow;
      end;
    end;
    canvas.fillrect(rect);
    rect.right := rect.right -3;
    rect.left  := rect.left  +3;
    strpcopy(@(TempString[0]),stringgrid1.cells[acol,arow]);
    drawtext(canvas.handle, TempString, -1, rect, format);
  end;
end;

Avatar billede tknudsen Nybegynder
29. maj 2000 - 15:27 #5
jow tak - det virkede hvis jeg en den case hvor den editerede celle blev opdateret tilskrev den celle jeg ønskede at ændre - og alle celler bliver kun opdateret hvis det er nødvendig - ellers opdateres kun ændrede celler  (delphi5)
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