Avatar billede agg-zeus Nybegynder
16. februar 2004 - 09:50 Der er 12 kommentarer og
1 løsning

Forskellige farver tekst i Stringgrid

Kan man farve teksten i sine celler uafhængig af hinanden ?!
Jeg kan kun få lavet det sådan at al teksten i hele stringgrid'en har samme farve (stringgrid1.font.color:= clred f.eks.) ...
Avatar billede Slettet bruger
16. februar 2004 - 13:33 #1
Prøv det her:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid) do
  begin
    if (ACol = 1) and (ARow = 1) then
    begin
      Canvas.Font.Color := clRed;
      Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, cells[acol, arow]);
      Canvas.FrameRect(Rect);
    end;
  end;
end;

Det gør den første celle i Stringgrid'en rød.
Avatar billede stone Forsker
16. februar 2004 - 13:41 #2
bliver det ikke hveranden linie?
Avatar billede Slettet bruger
16. februar 2004 - 14:37 #3
stone -> Neej, det er kun den første celle, teksten bliver rød i :)
Avatar billede hatecaps Nybegynder
17. februar 2004 - 18:36 #4
to ting:

1. det bliver den anden celle i den anden række der bliver rød,

2. hvis man ikke husker at sætte defaultdrawing for stringgrid'et til false er der slet ingen celler der bliver røde ;)

ha' det godt
hatecaps
Avatar billede Slettet bruger
26. februar 2004 - 07:22 #5
hatecaps -> Er det ikke ligemeget om sætter DefaultDrawing til False, ved mig virker det ihvertfald aligevel, den eneste forskel der er, at den med DefaultDrawing kun tegner stegerne for celerne :o)
Avatar billede agg-zeus Nybegynder
05. marts 2004 - 10:59 #6
er der en anden måde at gøre det på, for det virker ikke for mig ? skal jeg køre proceduren nogen steder eller hvordan ?
Avatar billede agg-zeus Nybegynder
07. marts 2004 - 11:25 #7
hmm.. nu virker det... skulle jo bare lige lave det ordentligt, men skal egentlig have det i en funktion, for jeg er ved at lave en kalender der viser 3 måneder. 1 måned i hver række. Og det er så hver celle som indeholder søndag der skal have rød text, og da det jo ikke er samme celle i alle 3 rækker så kan jeg jo ikke bruge denne procedure... Nogen forslag ?
Avatar billede Slettet bruger
08. marts 2004 - 21:34 #8
Måske virker det her lidt bedre :o)

type
  TForm1 = class(TForm)
    ...
  private
    procedure SetCellTextColor(X, Y: Integer; Color: TColor);
    ...
  end;

var
  Form1: TForm1;
  Colors: array of array of TColor;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid) do
  begin
    Canvas.Font.Color := Colors[ACol, ARow];
    Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
    Canvas.FrameRect(Rect);
  end;
end;

procedure TForm1.SetCellTextColor(X, Y: Integer; Color: TColor);
begin
  Colors[X, Y] := Color;
  StringGrid1.Repaint;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I, J: Integer;
begin
  SetLength(Colors, StringGrid1.ColCount);
  for I := Low(Colors) to High(Colors) do
  begin
    SetLength(Colors[I], StringGrid1.RowCount);
    for J := Low(Colors[I]) to High(Colors[I]) do
      Colors[I, J] := clBlack;
  end;
end;

Så sætter du farven på en celle med f.eks. SetCellTextColor(1,2, clRed);.
Avatar billede agg-zeus Nybegynder
11. marts 2004 - 08:40 #9
det virker skide godt :) takker.. men kan man også lave det så man kan ændre baggrundsfarven i en bestemt celle ?
Avatar billede Slettet bruger
11. marts 2004 - 13:53 #10
Ja, det kan man :o)... Prøv det her:

type
  TForm1 = class(TForm)
    ...
  private
    procedure SetCellTextColor(X, Y: Integer; Color: TColor);
    procedure SetCellColor(X, Y: Integer; Color: TColor);
    ...
  end;

var
  Form1: TForm1;
  Colors: array of array of TColor;
  Colors2: array of array of TColor;

implementation

{$R *.dfm}

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid) do
  begin
    Canvas.Font.Color := Colors[ACol, ARow];
    Canvas.Brush.Color := Colors2[ACol, ARow];
    Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
    Canvas.FrameRect(Rect);
  end;
end;

procedure TForm1.SetCellTextColor(X, Y: Integer; Color: TColor);
begin
  Colors[X, Y] := Color;
  StringGrid1.Repaint;
end;

procedure TForm1.SetCellColor(X, Y: Integer; Color: TColor);
begin
  Colors2[X, Y] := Color;
  StringGrid1.Repaint;

procedure TForm1.FormCreate(Sender: TObject);
var
  I, J: Integer;
begin
  SetLength(Colors, StringGrid1.ColCount);
  for I := Low(Colors) to High(Colors) do
  begin
    SetLength(Colors[I], StringGrid1.RowCount);
    for J := Low(Colors[I]) to High(Colors[I]) do
      Colors[I, J] := clBlack;
  end;

  SetLength(Colors2, StringGrid1.ColCount);
  for I := Low(Colors2) to High(Colors2) do
  begin
    SetLength(Colors2[I], StringGrid1.RowCount);
    for J := Low(Colors2[I]) to High(Colors2[I]) do
      Colors2[I, J] := clBlack;
  end;
end;

Har ikke haft mulighed for at teste det, men tror det virker :o)
Avatar billede agg-zeus Nybegynder
12. marts 2004 - 11:30 #11
kanon det virker perfekt.. kan du ikke lige smide et par kommentarer til linierne så jeg helt ved hvad der sker hvis jeg nu skulle forklare det til en anden ?

Ellers så smid et svar så får du point.
Avatar billede Slettet bruger
20. marts 2004 - 13:12 #12
Du må undskylde jeg har været lidt langsom, men overså mailen med dit indlæg :(

Har prøvet at foreklare lidt af koden, hvis der er noget du ikke forstår kan du bare spørge. De fleste af funktionerne kan du finde en forklaring på, i Delphi' hjælp :o)

  Colors: array of array of TColor;//Et multidimensional array til at holde tekst farven på alle cellerne
  Colors2: array of array of TColor;//Et multidimensional array til at holde baggrundsfarven på alle cellerne

implementation

{$R *.dfm}

//DrawCell bliver kaldt hver gang en celle bliver "tegnet"
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid) do
  begin
    Canvas.Font.Color := Colors[ACol, ARow];    //Sætter farven på skriften
    Canvas.Brush.Color := Colors2[ACol, ARow];    //Sætter baggrundfarven
    Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]); //Tegner teksten i cellen med den nye farve
    Canvas.FrameRect(Rect);    //Tegner en ramme omkring cellen
  end;
end;

procedure TForm1.SetCellTextColor(X, Y: Integer; Color: TColor);
begin
  Colors[X, Y] := Color;
  StringGrid1.Repaint;//Opdatere stringgrid'en
end;

procedure TForm1.SetCellColor(X, Y: Integer; Color: TColor);
begin
  Colors2[X, Y] := Color;
  StringGrid1.Repaint;//Opdatere stringgrid'en
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I, J: Integer;
begin
  SetLength(Colors, StringGrid1.ColCount);
  for I := Low(Colors) to High(Colors) do
  begin
    SetLength(Colors[I], StringGrid1.RowCount);
    for J := Low(Colors[I]) to High(Colors[I]) do
      Colors[I, J] := clBlack;//Sætter standard tekst farven til sort
  end;

  SetLength(Colors2, StringGrid1.ColCount);
  for I := Low(Colors2) to High(Colors2) do
  begin
    SetLength(Colors2[I], StringGrid1.RowCount);
    for J := Low(Colors2[I]) to High(Colors2[I]) do
      Colors2[I, J] := clWhite;//Sætter standard baggrundsfarven til hvid
  end;
end;
Avatar billede agg-zeus Nybegynder
25. marts 2004 - 08:55 #13
skide godt :) takker
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