Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#10

StringGrid-Inhalte vollständig darstellen

  Alt 1. Dez 2015, 14:54
Es gibt Situationen, in denen es hilfreich ist, den Abstand zum bearbeiteten Objekt etwas zu vergrößern – das altbekannte Wald-Bäume-Thema. Hier schient mir eine solche Situation zu bestehen. Erreicht werden soll, daß der Anwender beim Betrachten eines Stringgrids deren Inhalte auch dann vollständig sehen kann, wenn sie aufgrund der Spaltenbreite nicht vollständig dargestellt werden können. Die bereits vorgeschlagene Lösung, die Spaltenbreite der betreffenden Zeile ins schier Unendliche zu verbreitern, stößt dabei auf gewisse Probleme. Betrachten wir die anderen Optionen:

1. Möglichkeit: Hint einsetzen

Da es sich offenbar nur um eine problematische Spalte handelt, die zu lange Texte enthält, um vollständig darstellbar zu sein, könnte man beim Zeilenwechsel (z.B. in OnClick) die Hint-Eigenschaft des StringGrids dazu verwenden, den gesamten Text anzuzeigen. Nehmen wir an, es ist die vierte Spalte mit dem Index 3 (weil nullbasierend):
Delphi-Quellcode:
procedure TFormMain.GridClick(Sender: TObject);
begin
  Grid.Hint := Grid.Cells[3,Grid.Row];
end;
Das Property ShowHint der Grid-Komponente sollte dabei natürlich True sein. Einen Nachteil hat diese Lösung: Der Hint wird möglicherweise nicht lange genug angezeigt, um den gesamten Text lesen zu können.

2. Möglichkeit: WordWrap simulieren mit Text via Code in Zelle schreiben

Im Ereignis OnDrawCell der StringGrid-Komponente werden die Parameter Spalte (ACol) und Zeile (ARow) als Integerwerte übergeben sowie der Bereich, den die Zelle einnimmt: Integer; Rect: TRect. Nun kann man wie oben gezeigt den Text dieser Zelle daraufhin überprüfen, ob er in die Spaltenbreite hineinpaßt. Je nach Länge unterteilt man den Text dann in geeignete Teile und schreibt sie in der Zelle untereinander – ein selbstgebasteltes WordWrap also.

3. Möglichkeit: TjvDBGrid einsetzen

Das TjvDBGrid – die Jedi-Erweiterung des TDBGrid – bietet die Möglichkeit, Zeilen umzubrechen. Nun benötigt das TjvDBGrid jedoch eine Datenquelle. Diese kann man selbst erstellen, indem man ein TClientDataset verwendet und es entsprechend mit Daten befüllt. Nun weist man dem TClientDataset einfach ein DataSource zu, welches man als DataSource im entspreochenden TjvDBGrid-Property einträgt. Danach setzt man im OI das Property WordWrap auf True, wonach Zeilen, die zu lang sind, automatisch umbrochen werden. Ich hab's nicht getestet, aber das könnte der TE ja jetzt tun ...

Vielleicht gibt es noch weitere Möglichkeiten, dieses Problem zu lösen, mir fallen aber im Moment keine ein ...
  Mit Zitat antworten Zitat