[gelöst] TStringGrid Titelzeilenhöhe

Rund um die LCL und andere Komponenten
Antworten
VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

[gelöst] TStringGrid Titelzeilenhöhe

Beitrag von VB_Lazarus »

Hallo,

gibt es eine Möglichkeit die Höhe einer Titelzeile eines Stringgrid manuell festzulegen?
Ich möchte einen mehrzeiligen Text in der Titelzeile darstellen.
Das mehrzeilige, habe ich gelöst. Nur die Höhe passt sich nicht an.
Ich habe im Internet und in der Suche von diesem Forum leider nichts gefunden.
Danke.
Gruß
Zuletzt geändert von VB_Lazarus am So 7. Feb 2016, 16:53, insgesamt 1-mal geändert.

AndreasMR
Beiträge: 98
Registriert: Di 4. Aug 2015, 15:29
OS, Lazarus, FPC: Linux, Raspbian, Windows
CPU-Target: 64/32 Bit

Re: TStringGrid Titelzeilenhöhe

Beitrag von AndreasMR »

Hallo VB_Lazarus,

vom Opa TCustomDrawGrid werden die Eigenschaften GridHeight und RowHeights nach TStringGrid vererbt.

Wenn Du die betreffende Zeile auswählst und dann die Eigenschaft auf den gewünschten Wert setzt, dann sollte es funktionieren.

Beste Grüße

Andreas
Zuletzt geändert von AndreasMR am So 7. Feb 2016, 17:55, insgesamt 1-mal geändert.
Ubuntu 14.04 LTS / Raspbian / Windows: Lazarus ab 0.9 bis 3.0

wp_xyz
Beiträge: 4890
Registriert: Fr 8. Apr 2011, 09:01

Re: TStringGrid Titelzeilenhöhe

Beitrag von wp_xyz »

Vielleich willst du noch wissen, wie die Höhe der Titelzeile anzusetzen ist? Immerhin gibt es kein "AutoRowHeights".

Code: Alles auswählen

 
uses
  LCLIntf, LCLType, Math;
 
function CalcWrappedTextHeight(ACanvas: TCanvas; const AText: String; AWidth: Integer): integer;
var
  R: TRect;
begin
  R := Rect(0, 0, AWidth, 0);
  LCLIntf.DrawText(ACanvas.Handle, PChar(AText), Length(AText), R, DT_WORDBREAK or DT_CALCRECT);
  Result := R.Bottom - R.Top;
end
 
procedure AutoTitleRowHeight(AGrid: TStringGrid);
var
  c, w, h : Integer;
begin
  h := AGrid.RowHeights[0];
  for c := 0 to AGrid.ColCount-1 do
  begin
    with AGrid.CellRect(c, 0) do w := Right - Left;
    h := Max(h, CalcWrappedTextHeight(AGrid.Canvas, AGrid.Cells[c, 0], w) + 2*constCellPadding);
  end;
  AGrid.RowHeights[0] := h;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Cells[1, 0] := 'Zeile 1'#13'Zeile 2';
  StringGrid1.Cells[2, 0] := 'Test';
  StringGrid1.Cells[3, 0] := 'Zeile 1'#13'Zeile 3'#13'Zeile 3';
  AutoTitleRowHeight(StringGrid1);
end;
 
{ Event handler für OnPrepareCanvas, damit der Zeilenumbruch aktiviert wird. }
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var
  ts: TTextStyle;
begin
  if (aRow = 0) then
  begin
    ts := StringGrid1.Canvas.TextStyle;
    ts.WordBreak := True;
    ts.SingleLine := false;
    StringGrid1.Canvas.TextStyle := ts;
  end;
end;
 

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: TStringGrid Titelzeilenhöhe

Beitrag von VB_Lazarus »

Danke, an euch beiden.

Die Lösung von wp_xyz war genau das, was ich gesucht habe.
Perfekt.

Antworten