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:
W[i] := W[i] + D*W[i]/Sum(W)
Da wir mit ganzen Zahlen hantieren, ist das nicht ganz so einfach, aber im Prinzip sollte es so gehen:
Delphi-Quellcode:
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;
Hingerotzt, ungetestet und basiert auf einem fiktiven Grid. Die Eigenschaften (Spaltenbreite, Anzahl) also noch anpassen. Es sollte so eigentlich prinzipiell funktionieren.