Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - StringGrid Zeilenhöhe der texthöhe anpassen
sparky - Sa 31.10.09 20:08
Titel: StringGrid Zeilenhöhe der texthöhe anpassen
Hi,
ich habe eine TStringGrid Komponente und möchte, dass wenn ich einen zeilenumbruch im StringGrid habe, sich auch automatisch die Zeilenhöhe der texthöhe anpasst. Ich habe das deswegen ins Forum Grafik gemacht, weil ich dazu wohl das 'OnDrawCell' Ereignis der StringGrid benutzen muss!
Mein Code bisher:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol, ARow]), length(StringGrid1.Cells[ACol, ARow]), Rect, DT_WordBreak); end; |
Moderiert von
Narses: Quote- durch Delphi-Tags ersetztModeriert von
Narses: Topic aus Multimedia / Grafik verschoben am So 01.11.2009 um 00:17
Lannes - Sa 31.10.09 20:38
Hallo,
mittels DrawText und der Konstante DT_CALCRECT kann man die benötigte Zeilenhöhe berechnen. Ist die Konstante DT_CALCRECT gesetzt, wird kein Text ausgegeben.
Die Berechnung und die Veränderung der Zeilenhöhe kann man in OnDrawCell vornehmen. Beachte aber das mehrere Zellen in der Zeile sind, die jeweils eventuell dann wiederum Berechnungen über DrawCell vornehmen.
Man kann sich damit eine saubere Endlosschleife(Flackern) einhandeln :wink:
sparky - So 01.11.09 11:07
Hi Lannes, danke für den Hinweis, aber ich habe leider keine Ahnung, wie ich das in meinen Code einbauen soll!
Mein Code bisher:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin StringGrid1.Canvas.FillRect(Rect); DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol, ARow]), length(StringGrid1.Cells[ACol, ARow]), Rect, DT_WordBreak); end; |
und wie er wohl sein sollte mit DT_CALCRECT
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin StringGrid1.Canvas.FillRect(Rect); DrawText(StringGrid1.Canvas.Handle, PChar(StringGrid1.Cells[ACol, ARow]), length(StringGrid1.Cells[ACol, ARow]), Rect, DT_CALCRECT or DT_WordBreak); end; |
(das eingefügte "DT_CALCRECT or" letzte Zeile vor end;) aber so funktioniert es nicht, dann zeigt der mir im StringGrid GAR nichts mehr an :(
---
Moderiert von
Narses: Beiträge zusammengefasst---
Okay hier die Lösung:
Der OnDrawCell - Event bleibt so wie er zu erst war und das DT_CALCRECT wird beim einfügen in die StringGrid einfach berechnet und dann gesetzt
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| DrawText(self.Canvas.Handle, PChar(meinstring), length(meinstring), aRect, DT_CalcRect or DT_WordBreak or DT_NoClip);
StringGrid1.RowHeights[1]:=aRect.Bottom-15; |
Lannes - So 01.11.09 19:35
Hallo,
sparky hat folgendes geschrieben : |
...
Okay hier die Lösung:
Der OnDrawCell - Event bleibt so wie er zu erst war und das DT_CALCRECT wird beim einfügen in die StringGrid einfach berechnet und dann gesetzt ... |
ja, wenn das Grid nur zur Anzeige gebraucht wird, dann ist es ok. Soll das Grid editierbar sein ist es vorteilhaft den Code in den DrawCell-Eventhandler zu verlagern, damit sich die Zeilenhöhe automatisch anpasst.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!