![]() |
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 |
Re: Feld in Stringgrid färben
Stichwort OwnerDraw
|
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...
|
Re: Feld in Stringgrid färben
Dann such mal nach
![]() |
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:
wo liegt mein fehler ? ich finde ihn nicht :(
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; schonmal vielen dank |
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; |
Re: Feld in Stringgrid färben
:wiejetzt: was du geschrieben hast passt weder in den quellcode noch verstehe ich was du damit erreichen willst
|
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.
|
Re: Feld in Stringgrid färben
also wenn ich das so einfüge
Delphi-Quellcode:
dann bekomme ich die Fehlermeldung das es keine überladene version von TryStrToFloat gibt, die man mit diesen argumenten aufrufen kann ....
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; |
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; |
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 ?
|
Re: Feld in Stringgrid färben
Du musst den Text mit TextOut nochmal neuzeichnen.
Grüße Klaus |
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:
schonmal vielen Dank
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; euer Manu |
Re: Feld in Stringgrid färben
Delphi-Quellcode:
( sender as TStringGrid).TextOut(Acol,Arow, ( sender as TStringGrid).cells[Acol,Arow]);
|
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; |
Re: Feld in Stringgrid färben
Setzt mal explizit die gewünschte Textfarbe
|
Re: Feld in Stringgrid färben
Versuche es einmal so:
Delphi-Quellcode:
Grüße
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; Klaus |
Re: Feld in Stringgrid färben
Ich meinte egentlich
Delphi-Quellcode:
( sender as TStringGrid).Canvas.Font.Color := clBlack;
|
Re: Feld in Stringgrid färben
hmm nein leider auch nicht :( :?:
|
Re: Feld in Stringgrid färben
Acol und Arow sind auch nur die Indizes für die Zellen und nicht deren Position!
|
Re: Feld in Stringgrid färben
Vielleicht kannst Du dir diese Funktion zu Nutze machen:
Delphi-Quellcode:
Grüße
Returns the screen coordinates of a cell in the grid.
function CellRect(ACol, ARow: Longint): TRect; Klaus |
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:
[/edit]
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; |
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:
Und das geht definitiv. Die Bedingung "= 1" lässt sich ja wohl leicht anpassen. 8)
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 |
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.
|
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)
|
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