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 StringGrid: ColWidth nach längsten Eintrag ausrichten (https://www.delphipraxis.net/2996-stringgrid-colwidth-nach-laengsten-eintrag-ausrichten.html)

Gummibärchen 17. Feb 2003 14:44


StringGrid: ColWidth nach längsten Eintrag ausrichten
 
Hi,
bin Newbie und arbeite mich gerade in Delphi ein.
Ich habe mittlerweile ein StringGrid gefüllt und will nun, dass die Spaltenbreite sich dem längsten Eintrag anpasst.
Habe bisher nichts gefunden, falls das Thema schon durchgekaut wurde wäre ich für einen Link dankbar :wink:
THX!

jbg 17. Feb 2003 14:50

Re: StringGrid: ColWidth nach längsten Eintrag ausrichten
 
Zitat:

Zitat von Gummibärchen
falls das Thema schon durchgekaut wurde

Nicht das ich wüsste.

Eine vorgefertige Funktion gibt es dafür nicht. Du musst also selbst alle Zellen der Spalte(n) durchlaufen und ColWidths[] entsprechend setzen.

Ungetestet:
Delphi-Quellcode:
for Col := 0 to Grid.ColCount - 1 do
begin
  len := 20; // min. Breite
  for Row := 0 to Grid.RowCount - 1 do
  begin
    if len < Grid.Canvas.TextWidth(Grid.Cells[Row, Col]) then
      len := Grid.Canvas.TextWidth(Grid.Cells[Row, Col]);
  end;
  Grid.ColWidths[Col] := len;
end;

Gummibärchen 17. Feb 2003 15:10

Besten Dank, habe den Code überarbeitet und es läuft :D

Delphi-Quellcode:
  for Col := 0 to Grid.ColCount - 1 do
  begin
    len2 := 0;
    len := 20; // min. Breite
    for Row := 0 to Grid.RowCount - 1 do
    begin
      if len < Grid.Canvas.TextWidth(Grid.Cells[Col, Row]) then
      len := Grid.Canvas.TextWidth(Grid.Cells[Col, Row]);
      if len2 < len then
        len2 := len;
    end;
    Grid.ColWidths[Col] := len2;
  end;

Sharky 17. Feb 2003 15:38

Eventuell ist es jetzt auch noch sinnvol beim hinzufügen eines Eintrages zu überpüfen ob dieser breiter ist als die aktuelle Breite der Spalte und wenn ja die Spaltenbreit gleich zu setzen.

Dann muss nicht jedesmal das gesamte Grid durchlaufen werden.

Gummibärchen 17. Feb 2003 15:49

Stimmt, kann man noch einbauen. In meinem Fall wird das Grid nur einmal aus der Datenbank gefüllt, dafür reicht es :wink:
*grübel* mal schauen... :coder:

eddy 17. Feb 2003 22:22

Hallo Leute,

ich habe das Ganze mal noch auf ein DBGrid umgesetzt (und damit ein vorhandene Prozedur um 70 % geschrumpft).

Delphi-Quellcode:
procedure TFBrowser.Tabellenspaltenminimieren1Click(Sender: TObject);
const
  chkanz = 300; // CHecK ANZahl von Datensätzen zur Beschränkung des Zeitaufwandes
  maxfldanz = 100; // max. Anz. der Felder, die betrachtet werden
  minwidth = 20; // min. Breite
  korrwidth = 10; // Korr. der Spaltenbreite wg. besserer Optik
var
  i,
  fcnt,  // Field-Count
  aktrec,
  len : integer;
  farr : array[0..maxfldanz] of integer;
begin
  // Tab1 - TTable
  if not Tab1.Active then exit;
  Tab1.DisableControls;

  aktrec := Tab1.RecNo;
  zel := 0;
  for i:=0 to maxfldanz do farr[i] := minwidth;

  Tab1.First;
  fcnt := Tab1.FieldCount;
  if fcnt > maxfldanz then fcnt := maxfldanz;
  while (not Tab1.EOF) and (zel < chkanz) do begin
    for i:=0 to fcnt-1 do begin
      len := dbg1.Canvas.TextWidth(dbg1.Columns.Grid.Fields[i].Text);
      if len > farr[i] then farr[i] := len;
    end;
    Tab1.Next;
    inc(zel);
  end;
  // dbg1 - TDBGrid
  for i := 0 to fcnt-1 do dbg1.Columns[i].Width := farr[i] + korrwidth;

  Tab1.RecNo := aktrec;
  Tab1.EnableControls;
end;
Statt zel könnte man sicher auch RecNo verwenden, habe aber nicht getestet, ob's auch bei gefilterten Tabellen noch funktioniert.

mfg
eddy

Zaubermaus 18. Jun 2003 13:31

Hallöchen,

habe in einem Formular ein StringGrid, welches vom Hauptformular aus mit Daten gefüllt und anschließend angezeigt wird.
Der Code zum Anpassen von ColWidth (siehe oben) funktioniert an sich wunderbar - aber immer erst beim zweiten Öffnen des entsprechenden Formulars! :(

Was kann ich tun, damit die Ansicht schon beim ersten Aufruf stimmt?

die Zaubermaus

Armageddon 5. Nov 2003 18:20

Re: StringGrid: ColWidth nach längsten Eintrag ausrichten
 
Hi Leute,

würde das Beispiel auch gern verwenden. Ich hab aber keinen blaßen Schimmmer in welches Ereignis ich es einfügen muß damit es funktioniert! Und vielleicht kann auch noch einer erklären welche Variablen und wo vor allem ich setzen muß!


Danke Arma.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 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