![]() |
Spalten automatisch an Tabellenbreite anpassen
Hallo,
Ich habe eine Tabelle die immer die gesammte Breite des Formulars benutzt. Doch leider passen sich die einzelnen Spalten nicht der Tabellenbreite an. Nun meine Fage: gibt es irgendeine Einstellung oder Funktion, die das übernimmt, oder muss ich bei einer Größenänderung des Fensters für jede Spalte eine neue Breite berechnen ? Danke im vorraus |
Re: Spalten automatisch an Tabellenbreite anpassen
Hallo,
hab ich mal irgendwo gefunden
Delphi-Quellcode:
Viel Spaß damit
procedure TForm1.AutoSizeGridColumn(Grid: TStringGrid; column, min, max: Integer);
{ Set for max and min some minimal/maximial Values} { Bei max and min kann eine Minimal- resp. Maximalbreite angegeben werden} var i: Integer; temp: Integer; tempmax: Integer; begin tempmax := 0; for i := 0 to (Grid.RowCount - 1) do begin temp := Grid.Canvas.TextWidth(Grid.cells[column, i]); if temp > tempmax then tempmax := temp; if tempmax > max then begin tempmax := max; break; end; end; if tempmax < min then tempmax := min; Grid.ColWidths[column] := tempmax + Grid.GridLineWidth + 3; end; |
Re: Spalten automatisch an Tabellenbreite anpassen
Hallo matashen,
ist ein guter Ansatz, aber hier werden die Zellen an die Inhalte in den Zellen angepasst, aber nicht an die Tabellenbreite. Danke trotzdem :| |
Re: Spalten automatisch an Tabellenbreite anpassen
Im Resize-Ereignis des Formulares (oder des Grids, wenn es denn eins hat), machst Du Folgendes:
Sei W[i] die Breite der Spalte #i, Sum(W) die Gesamtbreite aller Spalten und GridWidth die Breite des Gitters. Dann sind D = GridWidth-Sum(W) Pixel auf die einzelnen Spaltenbreiten W[i] zu verteilen, und zwar am Besten gewichtet:
Code:
Da wir mit ganzen Zahlen hantieren, ist das nicht ganz so einfach, aber im Prinzip sollte es so gehen:
W[i] := W[i] + D*W[i]/Sum(W)
Delphi-Quellcode:
Hingerotzt, ungetestet und basiert auf einem fiktiven Grid. Die Eigenschaften (Spaltenbreite, Anzahl) also noch anpassen. Es sollte so eigentlich prinzipiell funktionieren.
Procedure ResizeGrid (aGrid : TMyGrid);
Var Sgn, I, SumW, D, D0, Dx : Integer; Begin // Summe aller Spaltenbreiten ermitteln SumW := 0; For i:=0 To aGrid.ColumnCount - 1 do SumW := SumW + aGrid.Columns[i].Width; // D pixel sind zu verteilen D := aGrid.Width - SumW; If D >= 0 Then S:= 1 Else S:= -1; D0 := D; For i:=0 To aGrid.ColumnCount - 1 do Begin Dx := D0 * aGrid.Columns[i].Width/SumW; // Dx ist der Anzeil für Spalte #i, aber mindestens ein Pixel If Dx = 0 Then Dx := S; // und höchstens die noch verbleibenden Pixel. If Abs(Dx) > Abs(D) Then Dx := D; //Breite der Spalte #i anpassen aGrid.Columns[i].Width := aGrid.Columns[i].Width + Dx; // und verbleibende Pixel berechnen D := D - Dx; End; End; |
AW: Spalten automatisch an Tabellenbreite anpassen
Nur so das es auch komplett und fertig ist habe ich das mal überarbeitet und eine finale Version eingestellt. Es Passt zwar die Spalten nicht optimal in die Tabellenbreite aber es überarbeitet die Breite je nach Breite der Tabelle. Man könnte ggf noch die Spaltenbreiten optimal auf die Tabellenbreite anpassen. Aber das so hat mir gereicht.
Grüße Joe
Delphi-Quellcode:
Procedure ResizeGrid (aGrid : Tstringgrid); Var Sgn,S, I, SumW, D, D0, Dx : Integer; Begin // Summe aller Spaltenbreiten ermitteln SumW := 0; For i:=0 To aGrid.ColCount - 1 do SumW := SumW + aGrid.ColWidths[i]; // D pixel sind zu verteilen D := aGrid.Width - SumW; If D >= 0 Then S:= 1 Else S:= -1; D0 := D; For i:=0 To aGrid.Colcount - 1 do Begin Dx := D0 * aGrid.ColWidths[i] div SumW; // Dx ist der Anzeil für Spalte #i, aber mindestens ein Pixel If Dx = 0 Then Dx := S; // und höchstens die noch verbleibenden Pixel. If Abs(Dx) > Abs(D) Then Dx := D; //Breite der Spalte #i anpassen aGrid.ColWidths[i] := aGrid.ColWidths[i] + Dx; // und verbleibende Pixel berechnen D := D - Dx; End; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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