Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Feld in Stringgrid färben (https://www.delphipraxis.net/112103-feld-stringgrid-faerben.html)

5etH 15. Apr 2008 08:55


Feld in Stringgrid färben
 
Hallo Zusammen,

ich würde gerne ein einzelnes feld in einem grid ab einem bestimmten wert rot färben und wollte fragen ob es möglich ist oder ob ich eine andere komponente brauch und, wenn es möglich ist was ich dazu brauch.

Schonmal vielen Dank
euer Manu

mkinzler 15. Apr 2008 09:00

Re: Feld in Stringgrid färben
 
Stichwort OwnerDraw

5etH 15. Apr 2008 09:36

Re: Feld in Stringgrid färben
 
sorry aber ich hab mich jetzt durch einige threads und die hilfe gelesen doch finde nichts was mir wirklich hilft...

DeddyH 15. Apr 2008 09:39

Re: Feld in Stringgrid färben
 
Dann such mal nach Hier im Forum suchenDrawColumnCell

5etH 15. Apr 2008 10:23

Re: Feld in Stringgrid färben
 
also meine schleife sieht jetzt so aus nur in der zeile wo der wert über 200 ist färbt er die zeile nicht rot was er eigentlich machen sollte ...

Delphi-Quellcode:
procedure TKndT.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var i : Integer;
  begin
for I := 1 to stringgrid2.rowcount - 1 do
begin
if StrToFloat(Stringgrid2.Cells[4,i]) >= 200 then begin
    StringGrid1.Canvas.Brush.Color := clred;
    StringGrid1.Canvas.FillRect(Rect);
end;
end;
end;
wo liegt mein fehler ? ich finde ihn nicht :(

schonmal vielen dank

mkinzler 15. Apr 2008 10:31

Re: Feld in Stringgrid färben
 
Die (Callback)-Methode wird für jede Zelle aufgerufen, es mach deshalb wenig Sinn, jedesmal das ganze Grid zu zeichnen.

Delphi-Quellcode:
procedure TKndT.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
    w: Extended;
begin
    if TryStrToFloat( ( sender as TStringGrid).Cells[ ACol, ARow]), w) then
    if w > 200 then
        begin
        ...
        end;

5etH 15. Apr 2008 10:44

Re: Feld in Stringgrid färben
 
:wiejetzt: was du geschrieben hast passt weder in den quellcode noch verstehe ich was du damit erreichen willst

mkinzler 15. Apr 2008 10:51

Re: Feld in Stringgrid färben
 
Warum passt es nicht zum Quellcode? Du hast das Prinzip nicht verstanden: Die Methode wird für jede Zelle aufgerufen; für ein Grid von 4x4 also 16-mal. du zeichnest also 16 mal alles.

5etH 15. Apr 2008 11:03

Re: Feld in Stringgrid färben
 
also wenn ich das so einfüge

Delphi-Quellcode:
procedure TKndT.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var i : Integer;
      w : extended;
  begin
    if TryStrToFloat( ( sender as TStringGrid).Cells[ ACol, ARow]), w) then
    if w > 200 then
        begin
         StringGrid2.Canvas.Brush.Color := clred;
         StringGrid2.Canvas.FillRect(Rect);
        end;

end;
dann bekomme ich die Fehlermeldung das es keine überladene version von TryStrToFloat gibt, die man mit diesen argumenten aufrufen kann ....

mkinzler 15. Apr 2008 11:20

Re: Feld in Stringgrid färben
 
Dann speichern wir halt zwischen:

Delphi-Quellcode:
procedure TKndT.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var i : Integer;
      w : extended;
      s : string;
  begin
    s := ( sender as TStringGrid).Cells[ ACol, ARow]);
    if TryStrToFloat( s , w) then
    if w >= 200 then
        begin
         ( sender as TStringGrid).Canvas.Brush.Color := clred;
         ( sender as TStringGrid).Canvas.FillRect(Rect);
        end;

end;

5etH 15. Apr 2008 11:29

Re: Feld in Stringgrid färben
 
okay super danke nachdem ich es leich umgeschrieben hatte funktioniert es .. nur kann ich den inhalt des textes nichtmehr lesen wenn er es färbt -.-" ... wie kann ich das ändern ?

Klaus01 15. Apr 2008 12:06

Re: Feld in Stringgrid färben
 
Du musst den Text mit TextOut nochmal neuzeichnen.

Grüße
Klaus

5etH 15. Apr 2008 12:49

Re: Feld in Stringgrid färben
 
also habe das nun so gelöst aber der text ist immernoch nicht sichtbar hab ich vill den rückgabewert oder sowas vergessen ?
Delphi-Quellcode:
procedure TKndT.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
   Rect: TRect; State: TGridDrawState);
  var i : Integer;
      w : extended;
      s : string;
  begin
    s := ( sender as TStringGrid).Cells[ ACol, ARow];
    if TryStrToFloat( s , w) then
    if w >= 200 then
        begin
         ( sender as TStringGrid).Canvas.Brush.Color := clred;
         ( sender as TStringGrid).canvas.TextOut(Acol,Arow, stringgrid1.cells[Acol,Arow]);        
         ( sender as TStringGrid).Canvas.FillRect(Rect);
         
        end;

end;
schonmal vielen Dank
euer Manu

mkinzler 15. Apr 2008 12:51

Re: Feld in Stringgrid färben
 
Delphi-Quellcode:
( sender as TStringGrid).TextOut(Acol,Arow, ( sender as TStringGrid).cells[Acol,Arow]);

5etH 15. Apr 2008 12:52

Re: Feld in Stringgrid färben
 
geht so auch nicht

Delphi-Quellcode:
    if TryStrToFloat( s , w) then
    if w >= 200 then
        begin
         ( sender as TStringGrid).Canvas.Brush.Color := clred;

         ( sender as TStringGrid).Canvas.FillRect(Rect);

         ( sender as TStringGrid).canvas.TextOut(Acol,Arow, ( sender as TStringGrid).cells[Acol,Arow]);

        end;

mkinzler 15. Apr 2008 12:56

Re: Feld in Stringgrid färben
 
Setzt mal explizit die gewünschte Textfarbe

Klaus01 15. Apr 2008 12:58

Re: Feld in Stringgrid färben
 
Versuche es einmal so:

Delphi-Quellcode:
procedure TKndT.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
   Rect: TRect; State: TGridDrawState);
  var i : Integer;
      w : extended;
      s : string;
  begin
    s := ( sender as TStringGrid).Cells[ ACol, ARow];
    if TryStrToFloat( s , w) then
    if w >= 200 then
        begin
         ( sender as TStringGrid).Canvas.Brush.Color := clred;
         ( sender as TStringGrid).Canvas.FillRect(Rect);         // erst füllen
         ( sender as TStringGrid).Canvas.Brush.Color := clblack; // wie mkinzler schreibt
         ( sender as TStringGrid).canvas.TextOut(Acol,Arow,s);   // dann reinschreiben
         
        end;

end;
Grüße
Klaus

mkinzler 15. Apr 2008 13:01

Re: Feld in Stringgrid färben
 
Ich meinte egentlich
Delphi-Quellcode:
( sender as TStringGrid).Canvas.Font.Color := clBlack;

5etH 15. Apr 2008 13:03

Re: Feld in Stringgrid färben
 
hmm nein leider auch nicht :( :?:

mkinzler 15. Apr 2008 13:06

Re: Feld in Stringgrid färben
 
Acol und Arow sind auch nur die Indizes für die Zellen und nicht deren Position!

Klaus01 15. Apr 2008 13:12

Re: Feld in Stringgrid färben
 
Vielleicht kannst Du dir diese Funktion zu Nutze machen:

Delphi-Quellcode:
Returns the screen coordinates of a cell in the grid.

function CellRect(ACol, ARow: Longint): TRect;
Grüße
Klaus

DeddyH 15. Apr 2008 13:23

Re: Feld in Stringgrid färben
 
Das sollte doch bereits in Rect stehen, oder?

[edit] Ich habe Folgendes gerade mal unter D5 ausprobiert:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i,j: integer;
begin
  Randomize;
  for i := StringGrid1.FixedRows to Pred(StringGrid1.RowCount) do
    for j := StringGrid1.FixedCols to Pred(StringGrid1.ColCount) do
      StringGrid1.Cells[i,j] := IntToStr(Random(150) + 101);
end;

//Für Delphi 5 selbst implementiert
function TryStrToInt(const s: string; out i: integer): Boolean;
begin
  Result := true;
  try
    i := StrToInt(s);
  except
    Result := false;
    i := 0;
  end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var wert: integer;
begin
  //fixe Spalten/Zeilen ausgenommen
  if ((ACol) >= (Sender as TStringGrid).FixedCols) and
     ((ARow) >= (Sender as TStringGrid).FixedRows) then
    begin
      //je nach Wert Hintergrundfarbe setzen
      if TryStrToInt((Sender as TStringGrid).Cells[ACol,ARow],wert) and
         (StrToInt((Sender as TStringGrid).Cells[ACol,ARow]) > 200) then
        (Sender as TStringGrid).Canvas.Brush.Color := clRed
      else
       (Sender as TStringGrid).Canvas.Brush.Color := clWhite;

     //Zelle füllen
     (Sender as TStringGrid).Canvas.FillRect(Rect);

     //Text mittig ausgeben
     DrawText((Sender as TStringGrid).Canvas.Handle,
              PChar((Sender as TStringGrid).Cells[ACol,ARow]),
              Length((Sender as TStringGrid).Cells[ACol,ARow]),
              Rect,
              DT_CENTER or DT_VCENTER or DT_SINGLELINE);
  end;
end;
[/edit]

Hansa 15. Apr 2008 14:51

Re: Feld in Stringgrid färben
 
Geht das immer noch nicht ? Das hier (steht im OnDrawCell) zeichnet alle Zellen in denen 1 steht weiß auf dunkelblau :

Delphi-Quellcode:
      if ACol = 1 then begin
        if IntoStr (Cells [ACol,ARow] = 1 then begin
          canvas.Font.Size:= 8;
          canvas.Font.Color:= clwhite;
          canvas.brush.Color := clNavy;
          canvas.TextOut(rect.Left,rect.bottom-canvas.Textheight('X')-1,
                         Cells [ACol,ARow]);
        end;
      end
Und das geht definitiv. Die Bedingung "= 1" lässt sich ja wohl leicht anpassen. 8)

DeddyH 15. Apr 2008 15:05

Re: Feld in Stringgrid färben
 
Wenn Du aus Inttostr Strtoint machst, könnte das funktionieren :zwinker: . Außerdem hast Du uns ein with verschwiegen, so macht der Code keinen Sinn.

Hansa 15. Apr 2008 15:13

Re: Feld in Stringgrid färben
 
Das soll ein Denkanstoß für SEIN Programm sein. In meinem geht die OnDrawCell-Prozedur über 2 DIN A 4 Seiten. Soll ich die etwa posten ? :shock: Wenn er die durch Abkürzen verursachten Schreibfehlerchen nicht bemerkt/versteht, dann macht das ganze Thema keinen Sinn ! Dann soll er besser die Finger davon lassen. 8)

mkinzler 15. Apr 2008 15:22

Re: Feld in Stringgrid färben
 
Dann hättest du auch nicht noch eine Lösung Posten müssen.
@5etH: wir könnten dies hier abkürzen, wenn du versuchen würdest die geposteten Lösungen zu verstehen und ggf. die Hilfe zu konsultieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz