Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Spalten automatisch an Tabellenbreite anpassen (https://www.delphipraxis.net/93857-spalten-automatisch-tabellenbreite-anpassen.html)

DataNess 12. Jun 2007 13:31


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

matashen 12. Jun 2007 13:45

Re: Spalten automatisch an Tabellenbreite anpassen
 
Hallo,

hab ich mal irgendwo gefunden

Delphi-Quellcode:
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;
Viel Spaß damit

DataNess 12. Jun 2007 14:16

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 :|

alzaimar 12. Jun 2007 15:07

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:
  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.

joehd 17. Feb 2016 10:00

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 03:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz