AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fragen zum Färben einer Stringgrid-Zeile

Ein Thema von stefankr · begonnen am 20. Apr 2015 · letzter Beitrag vom 21. Apr 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

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;
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fragen zum Färben einer Stringgrid-Zeile

  Alt 20. Apr 2015, 22:34
Himitsu,

ja, das stimmt schon, man sollte sicher mehr grundsätzliches erklären (deswegen habe ich ja zumindest auch ein paar allgemeine Erklärungen zum malen auf den Canvas gegeben und auch den Hinweis, nicht direkt die Stringgrid-Variable im Event zu nutzen auch den Bezug zur Formvariable entfernt).

Daher hier in diesem Sinne vielleicht noch ein Tipp: In den (von mir so geschätzen und geliebten) Doberenz Büchern wird (letzte Fassung zu Delphi 7) ab Seite 337 (Kapitel 7.1 "Das Canvas-Object") alles wissenswerte zum Zeichnen auf dem Canvas erklärt. Im Kapitel "How To: Oberfläche", wird ab Seite 1040 noch einiges zum OnDrawCell-Event erläutert, etwa wie man Text mehrzeilig in einer Zelle ausgibt oder rechtsbündig zeichnet.

Bei Amazon kann man die Doberenz Bücher sogar noch kaufen.
  Mit Zitat antworten Zitat
stefankr

Registriert seit: 9. Mai 2010
24 Beiträge
 
#3

AW: Fragen zum Färben einer Stringgrid-Zeile

  Alt 21. Apr 2015, 08:41
Hallo Harry und Himitsu,

vielen Dank für Eure hilfreichen Antworten. Das Auf-die-Finger-hauen habe ich schon verkraftet, ich als Anfänger lerne eben durch "Trial and Aua"!

Ich arbeite als freiberuflicher Übersetzer und nicht als Entwickler, programmiere erst seit ein paar Monaten nebenbei. Ich habe mir ein Programm geschrieben, mit dem ich meine Kunden und Aufträge erfassen und Rechnungen drucken kann. Es funktioniert echt gut, obwohl einige sicher bei bestimmten Stellen im Code die Hände überm Kopf zusammenschlagen würden... Dieses Programm erweitere ich Schritt für Schritt, und das mit der markierten Zeile soll eben dazugehören.

Harry, das von dir genannte Buch habe ich übrigens, und es hat mir schon einige Male geholfen. Aber ich bin jemand, der wenig im Voraus liest, sondern lieber mit einem konkreten Projekt anfängt und daran lernt und bei Bedarf etwas nachschlägt. Das mit dem Canvas werde ich demnächst mal nachlesen. Leider bin ich heute und morgen außer Haus, kann also von den genannten Vorschlägen noch nichts umsetzen. Aber ich freue mich schon darauf, bald weitermachen zu können. Danke nochmal für all die Tipps, die ich von euch bekomme!
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fragen zum Färben einer Stringgrid-Zeile

  Alt 21. Apr 2015, 23:22
@Stefankr

Du hast in Deinem letzten posting etwas erwähnt, wozu ich Dir eine private Nachricht mit einer Frage gesendet habe. Schau da bitte bei Gelegenheit mal rein.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 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