Autor |
Beitrag |
sparky
Hält's aus hier
Beiträge: 12
|
Verfasst: Sa 31.10.09 20:08
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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
sparky 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
|