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;