Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Spalten automatisch an Tabellenbreite anpassen

  Alt 12. Jun 2007, 15:07
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat