Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Was ist TGridDrawState (https://www.delphipraxis.net/56368-ist-tgriddrawstate.html)

Martin K 4. Nov 2005 16:28


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:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  StringGrid1.Canvas.Brush.Color:=clGreen;
  StringGrid1.Canvas.FillRect(Rect);
end;
Nun hab ich aber Probleme, wie ich diese Prozedur aufrufen soll.
Habe das hier geschrieben:
Delphi-Quellcode:
StringGrid1DrawCell(Form1, StringGrid1.Col, StringGrid1.Row, Rect(0,StringGrid1.Row,StringGrid1.ColCount,0), gdFixed);
Allerdings kommt dann diese Fehlermeldung:
Zitat:

[Error] Unit1.pas(69): Incompatible types: 'TGridDrawState' and 'Enumeration'
gdFixed hab ich aus der Delphi-Hilfe.
Delphi-Quellcode:
type TGridDrawState = set of (gdSelected, gdFocused, gdFixed);
Aber irgendwie funzts nich richtig...
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!

Union 4. Nov 2005 16:38

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]);

Martin K 4. Nov 2005 16:44

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 ?

Khabarakh 4. Nov 2005 16:53

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:

Zitat von Martin K
Wie kann man denn nur die Textfarbe ändern ?

Ich würde es mit Font.Color probieren :wink: .

Martin K 4. Nov 2005 17:01

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:
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;
Wie könnte ich den obigen Code ändern, damit's funzt?

Ich will, dass die Schrift der Zelle, auf die ich geklickt habe (also 'test'), rot wird!

Martin K 4. Nov 2005 17:24

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;

Khabarakh 4. Nov 2005 18:05

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).

Martin K 4. Nov 2005 18:30

Re: Was ist TGridDrawState
 
Nein, das geht leider nicht (s. Beitrag #5)

Man könnte höchstens statt DrawText auch StringGrid1.Canvas.TextOut verwenden.

Sharky 5. Nov 2005 07:05

Re: Textfarbe in einem StringGrid ändern (bestimmter Bereich
 
Zitat:

Zitat von Martin K
Hab's jetzt selber rausgefunden, ...

Hai Martin,

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:
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;
Wie Du siehst wird innerhalb der Methode der Name des StringGrids nicht mehr verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 Uhr.

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