Es gibt ja im StringGrid bereits eine Menge vorgefertigte Funktionalität, beispielsweise die Möglichkeit, die erste fixierte Spalte automatisch nummerieren zu lassen (goFixedRowNumbering). Lässt man nach dem Befüllen des StringGrids dann jedoch die Spalten nach dem "längsten" Eintrag automatisch in der Breite optimieren, indem man alle Einträge auf ihre Weite prüft und sich die größte Weite merkt, kommt leider die Erkenntnis, dass in diesem Fall in Spalte 0 an der Stelle StringGrid.Cells[0, n]. nicht wirklich etwas steht, was sich mit StringGrid.Canvas.TextWidth(tringGrid.Cells[0, n]) auslesen lässt. Wo zum Teufel versteckt StringGrid diese doch sichtbaren Zeichen und wie kann ich deren Weite feststellen? (Mein Workaraound ist, dass ich momentan goFixedRowNumbering auf False lasse und beim Befüllen die fixierte Spalte einfach mit einem Zähler überschreibe, aber das kann's doch nicht auf Dauer sein!)
Also: hat jemand damit (goFixedRowNumbering=True & ColumnWidthResize per Code) bereits Erfahrungen gesammelt? (Möglichst erfolgreicher als ich?)
Zur Demo hänge ich mal mein Testprojekt an (Unit1...
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Btn: TButton;
Grid: TStringGrid;
procedure BtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
procedure AutoSizeStringGridCol(sg: TStringGrid; column: integer);
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
aStr: string;
begin
AutoSizeStringGridCol(Grid, 0);
for i := 1 to Grid.RowCount - 1 do
begin
aStr := Grid.Cells[0, i];
Grid.Cells[1, i] := aStr;
end;
end;
procedure TForm1.BtnClick(Sender: TObject);
begin
Grid.Options := Grid.Options - [goFixedRowNumbering];
Update;
AutoSizeStringGridCol(Grid, 0);
end;
procedure TForm1.AutoSizeStringGridCol(sg: TStringGrid; column: integer);
var
j, W, WMax: integer;
begin
WMax := 0;
for j := 0 to (sg.RowCount - 1) do
begin
W := sg.Canvas.TextWidth(sg.Cells[column, j]);
if W > WMax then
WMax := W;
end;
sg.ColWidths[column] := WMax + 7;
end;
end.
Code: Alles auswählen
object Form1: TForm1
Left = 481
Height = 240
Top = 462
Width = 327
Caption = 'Form1'
ClientHeight = 240
ClientWidth = 327
OnCreate = FormCreate
LCLVersion = '1.0.8.0'
object Btn: TButton
Left = 0
Height = 25
Top = 215
Width = 327
Align = alBottom
Caption = 'goFixedRowNumbering aus und AutoSize Col 0'
OnClick = BtnClick
TabOrder = 0
end
object Grid: TStringGrid
Left = 0
Height = 215
Top = 0
Width = 327
Align = alClient
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing, goRowSelect, goThumbTracking, goDblClickAutoSize, goSmoothScroll, goFixedRowNumbering, goHeaderHotTracking, goHeaderPushedLook, goFixedColSizing]
TabOrder = 1
end
end
Aldicek