![]() |
Was ist TGridDrawState
Hi,
ich will nur den Text einer bestimmten Zeile in einem StringGrid in einer anderen Farbe darstellen. Dazu habe ich bereits folgendes gefunden:
Delphi-Quellcode:
Nun hab ich aber Probleme, wie ich diese Prozedur aufrufen soll.
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin StringGrid1.Canvas.Brush.Color:=clGreen; StringGrid1.Canvas.FillRect(Rect); end; Habe das hier geschrieben:
Delphi-Quellcode:
Allerdings kommt dann diese Fehlermeldung:
StringGrid1DrawCell(Form1, StringGrid1.Col, StringGrid1.Row, Rect(0,StringGrid1.Row,StringGrid1.ColCount,0), gdFixed);
Zitat:
Delphi-Quellcode:
Aber irgendwie funzts nich richtig...
type TGridDrawState = set of (gdSelected, gdFocused, gdFixed);
Was muss ich sonst bei TGridDrawState angeben? Oder wie kann ich sonst die Prozedur aufrufen, um die Textfarbe einer bestimmten Zeile zu ändern? Vielen Dank schon mal! |
Re: Was ist TGridDrawState
Die Eckigen Klammern nicht vergessen! Es gibt mehrere Möglichkeiten, ähnlich wie bei Locate, StringReplace usw.
Delphi-Quellcode:
StringGrid1DrawCell(Form1, StringGrid1.Col, StringGrid1.Row, Rect(0,StringGrid1.Row,StringGrid1.ColCount,0), [gdFixed]);
|
Textfarbe in einem StringGrid ändern (bestimmter Bereich)
Ja, danke.
Aber ich hab gerade festgestellt, dass diese Prozedur zum Ändern der Textfarbe absoluter Schwachsinn ist. Sie ändert nämlich die Farbe im kompletten StringGrid. Wie kann man denn nur die Textfarbe ändern ? |
Re: Textfarbe in einem StringGrid ändern (bestimmter Bereich
Du hast da etwas falsch verstanden. Diese Prozedur soll ein Eventhandler für TStringGrid.OnDrawCell sein, du musst sie also im OI für das Event auswählen und nicht selbst aufrufen.
Zitat:
|
Re: Was ist TGridDrawState
Ja, ich hab's jetzt auch verstanden.
Ich will aber die Textfarbe nur für bestimmte Zellen ändern, und nicht für's ganze StringGrid ! Also so geht's leider nicht:
Delphi-Quellcode:
Wie könnte ich den obigen Code ändern, damit's funzt?
procedure TForm1.StringGrid1Click(Sender: TObject);
begin StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:='test'; end; procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin StringGrid1.Canvas.Font.Color:=clRed; end; Ich will, dass die Schrift der Zelle, auf die ich geklickt habe (also 'test'), rot wird! |
Textfarbe in einem StringGrid ändern (bestimmter Bereich)
Hab's jetzt selber rausgefunden, das geht so:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); begin If (ACol=5) and (ARow=5) then //für die Zelle 5,5 begin StringGrid1.Canvas.Font.Color:=clRed; DrawText(StringGrid1.Canvas.Handle,PChar(StringGrid1.Cells[ACol,ARow]),Length(StringGrid1.Cells[ACol,ARow]),Rect,0); end; end; |
Re: Was ist TGridDrawState
Das sollte aber auch ohne DrawText möglich sein, einfach nur die Fontfarbe verändern (und bei den anderen Zellen wieder auf schwarz stellen).
|
Re: Was ist TGridDrawState
Nein, das geht leider nicht (s. Beitrag #5)
Man könnte höchstens statt DrawText auch StringGrid1.Canvas.TextOut verwenden. |
Re: Textfarbe in einem StringGrid ändern (bestimmter Bereich
Zitat:
ich habe noch zwei Tips für deinen Code. Zum einen ist der Code leichter zu lesen wenn Du für den Text der aktuelle Zelle eine Hilfsvariable verwendest. Dann musst Du nicht immer mit Cells[ACol,ARow] arbeiten. Aber das ist nur "kosmetik". Wichtiger ist es die Verwendung von Objektnamen im Quellcode wenn immer möglich zu vermeiden und dafür den Sender der Methode zu verwenden. Wenn Du dein StringGrid einmal umbenennst musst Du auch den Namen in deinem Code ändern. Ausserdem könntest Du bei verwendung des Senders die selbe Methode für verschiedene StringGrids verwenden. Hier mal ein Beispiel für das was ich meine:
Delphi-Quellcode:
Wie Du siehst wird innerhalb der Methode der Name des StringGrids nicht mehr verwendet.
procedure TDemoForm.StringGrid1DrawCell(Sender: TObject; ACol, ARow: integer;
Rect: TRect; State: TGridDrawState); var celltext: string; begin with (Sender as TStringGrid) do // Sender ist ein TStringGrid begin celltext := Cells[ACol, ARow]; // Inhalt der aktuelle Zelle // Hier beginnt die Farb/Font Zuweisung if (ACol = 1) and (ARow = 1) then // Nur für Celle 1:1 begin canvas.Brush.Color := clred; // Hintergrundfarbe canvas.Font.Color := clblue; // Schriftfarbe end; if (ARow = 3) then // Für die dritte Zeile begin canvas.Font.Style := canvas.Font.Style + [fsBold]; end; if (ACol = 2) and (ARow > 0) then // Die zweite Spalte begin canvas.Brush.Color := clGreen; end; // Hier beginnt nun das Zeichnen: Canvas.FillRect(Rect); // Hintergrund zeichnen DrawText(Canvas.Handle, PChar(celltext), Length(celltext), Rect, DT_SINGLELINE); // Textausgeben // Optional kann der Text auch Zentriert werden. // dann mit diesem Parameter; // DT_SINGLELINE or DT_CENTER or DT_VCENTER // Für Rechtsbündige Ausgabe // DT_SINGLELINE or DT_RIGHT end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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