Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#5

AW: Fragen zum Färben einer Stringgrid-Zeile

  Alt 20. Apr 2015, 22:04
Nja, er hatte Glück, daß es zufällig fast funktiniert.

Genauso darf man gerne verkehrtrum auf der falschen Spur über die Autobahn rauschen.
Selbst wenn man dabei mit 120 km/h rückwärts fährt, bleibt es dennoch falsch und man darf sowas einfach nicht machen.

Also besser jetzt gleich ausmärtzen und es richtig machen, bevor es sich noch einbürgert.

In 20 Jahren schreibt er vielleicht mal die Firmware für die Herzlungenmaschine, an der ich später hänge und dann möchte ich nicht, daß sich darin grob fahrlässiger Code befindet.
Genauso hätte man es viel früher rigeros durchsetzen sollen, daß Programme nicht in ihr Programmverzeichnis schreiben.




Das mit den Fingern gilt nur für böse globale Variablen, if B = true then , leere Try-Except-Blöcke und Dergleichen.
Der Rest ist zwar dennoch falsch, aber das kann ja mal passieren und lässt sich reparieren.

DrawCell zeichnet nunmal nur die eine Zelle, für die der Aufruf gilt
und bei späteren Aufrufen sollte genau das selbe Verhalten erhalten bleiben, um bei eventuellen Repaints die Anzeige wiederherstellen zu können.

Delphi-Quellcode:
procedure TForm3.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  if {(ClickedRow <> -1) and } (ClickedRow = ARow) then
    StringGrid1.Canvas.Brush.Color := clGreen
  else
    StringGrid1.Canvas.Brush.Color := clWhite;
  StringGrid1.Canvas.FillRect(Rect);
  StringGrid1.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+5, StringGrid1.Cells[ACol, ARow]);
end;


// Wenn die Zeile markiert werden soll, dann
ClickedRow := StringGrid1.Row;
StringGrid1.Invalidate; // oder StringGrid1.Repaint;

// und später, wenn die Bearbeitung fertig ist, wieder auf -1 setzen.

PS: Viele Komponenten besitzen Eigenschaften wie RowSelect und/oder HideSelection, um ein vergleichbares und vorallem einheitliches Standardverhalten hinzubekommen.



Bei vielen "ordentlichen" Grid-Komponenten kann man auch Folgendes machen, wo einfach nur die Hintergrundfarbe für das nachfolgende DefaultDrawing gesetzt wird.
Leider sind die delphieigenen Grids echt bescheiden. (in Delphi wirkt sich das nur auf den FocusRect aus)
So muß man hier auch noch den State manuell behandeln, weil hier nur "entweder" alles selber oder automatisch (Defaultverhalten) funktioniert.
Delphi-Quellcode:
// mit DefaultDrawing=True
procedure TForm3.StringGrid1CustomDrawCell(Sender: TObject; ACanvas: TCanvas: ACol, ARow: Integer; ARect: TRect; AValue: string; AState: TGridDrawState);
begin
  if {(ClickedRow <> -1) and } (ClickedRow = ARow) then
    ACanvas.Brush.Color := clGreen;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Apr 2015 um 22:16 Uhr)
  Mit Zitat antworten Zitat