Autor Beitrag
sparky
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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:
ausblenden 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 user profile iconNarses: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am So 01.11.2009 um 00:17
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
sparky Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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:
ausblenden 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
ausblenden 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 user profile iconNarses: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 01.11.09 19:35 
Hallo,

user profile iconsparky hat folgendes geschrieben Zum zitierten Posting springen:
...
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 )