![]() |
Stringgrid Spaltenbreite an Fenstergröße anpassen
Wie kann man verwirklichen damit sich die Spaltenbreite beim Maximieren/Wiederherstellen automatisch anpasst? Selbstverständlich sollte die Spaltenbreite dann realistisch angepasst werden, also nicht das eine Spalte zu groß wird....
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Du könntest StringGrid.Cols[X].Objects als Speicher für einen Prozentwert der Gridbreite verwenden und die Spaltenreiten bei Größenänderung entsprechend berechnen.
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Ist das auch mit nem DBGrid kompatibel?
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Zitat:
Ausserdem könnte es beim TDBGrid zu Performanceproblemen kommen, weil man über alle Datensätze gehen müsste um den längsten String in den jeweiligen Spalten zu finden. |
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Zitat:
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Du kannst das ja mal ausprobieren .....
Delphi-Quellcode:
Procedure FitGrid(Grid:TDBGrid);
//bummi 2013 Const C_Add=3; var ds:TDataset; bm:TBookmark; i:Integer; w:Integer; a:Array of Integer; begin ds := Grid.DataSource.DataSet; if Assigned(ds) then begin ds.DisableControls; bm := ds.GetBookmark; try ds.First; SetLength(a,Grid.Columns.Count); ZeroMemory(@a[0],SizeOf(Integer)*Length(a)); while not ds.Eof do begin for I := 0 to Grid.Columns.Count - 1 do begin if Assigned( Grid.Columns[i].Field) then begin w := Grid.Canvas.TextWidth( ds.FieldByName( Grid.Columns[i].Field.FieldName).DisplayText); if a[i] < w then a[i] := w + C_Add; end; end; ds.Next; end; for I := 0 to Grid.Columns.Count - 1 do Grid.Columns[i].Width := a[i]; ds.GotoBookmark(bm); finally ds.FreeBookmark(bm); ds.EnableControls; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin FitGrid(DBgrid1) end; |
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Es geht hier nicht darum die Spaltenbreite soweit zu ändern das der gesamte Text darin angezeigt werden kann!
Mein Form ist anfangs klein und das Grid passt perfekt mit den voreingestellten Breiten. Maximiere ich das Form, dann maximiert sich zwar das DBStringGrid weil align auf client steht. Die Spaltenbreite bleibt jedoch gleich und so entsteht rechts eine große Lücke wo nix steht. Und genau dies möchte ich nicht. |
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Was ist ein DBStringGrid?
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Sorry, ich meine DBGrid.
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Nur so eine Idee: Du merkst Dir je Spalte deren prozentuale Breite relativ zur Clientbreite des Grids. Nach dem Resize errechnest Du dann aus dieser Zahl die neue Breite.
|
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Da ich mit meiner ersten Antwort neben den Anforderungen lag, hier die zweite Runde, gegf. kannst Du noch ein wenig feintunen.
Delphi-Quellcode:
Procedure SetDBGridColWidthAuto(Grid: TDBGrid);
var i: Integer; ws, w: Integer; dpl: Integer; CArray: Array of Integer; Function cWidth(idx: Integer): Integer; var f: TField; begin f := Grid.Columns[idx].Field; if Assigned(f) then Result := f.DisplayWidth else Result := Grid.Columns[idx].Width; CArray[idx] := Result; end; begin ws := 0; w := Grid.ClientWidth; if dgColLines in Grid.Options then dpl := 1 else dpl := 0; if dgIndicator in Grid.Options then w := w - 12; SetLength(CArray, Grid.Columns.Count); for i := 0 to Grid.Columns.Count - 1 do ws := ws + cWidth(i); for i := 0 to Grid.Columns.Count - 1 do begin Grid.Columns[i].Width := Round(w / ws * CArray[i] - dpl); end; end; procedure TForm3.FormResize(Sender: TObject); begin SetDBGridColWidthAuto(DBGrid1); end; |
AW: Stringgrid Spaltenbreite an Fenstergröße anpassen
Das konnte ich verwenden. Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz