Delphi: DBGrid-Spaltenbreiten automatisch anpassen

Entwickelt, damit ein Benutzer Daten in einem tabellarischen Raster anzeigen und bearbeiten kann DBGrid bietet verschiedene Möglichkeiten zum Anpassen der Darstellung "seiner" Daten. Mit so viel Flexibilität, a Delphi Entwickler können immer neue Wege finden, um es leistungsfähiger zu machen.

Eine der fehlenden Funktionen von TDBGrid besteht darin, dass es keine Option gibt, die Breite bestimmter Spalten automatisch an die Clientbreite des Rasters anzupassen. Wenn Sie die Größe der DBGrid-Komponente zur Laufzeit ändern, wird die Größe der Spaltenbreiten nicht geändert.

Wenn die Breite des DBGrid größer als die Gesamtbreite aller Spalten ist, wird direkt nach der letzten Spalte ein leerer Bereich angezeigt. Wenn andererseits die Gesamtbreite aller Spalten größer als die Breite des DBGrid ist, wird eine horizontale Bildlaufleiste angezeigt.

Passen Sie die DBGrid-Spaltenbreiten automatisch an

Es gibt eine praktische Vorgehensweise, mit der Sie die Breite ausgewählter DBGrid-Spalten korrigieren können, wenn die Größe des Rasters zur Laufzeit geändert wird.

instagram viewer

Es ist wichtig zu beachten, dass normalerweise nur zwei bis drei Spalten in einem DBGrid automatisch in der Größe geändert werden müssen. In allen anderen Spalten werden einige Daten mit "statischer Breite" angezeigt. Beispielsweise können Sie immer eine feste Breite für Spalten angeben, in denen Werte aus Datenfeldern angezeigt werden, die mit TDateTimeField, TFloatField, TIntegerField und ähnlichem dargestellt werden.

Darüber hinaus werden Sie wahrscheinlich (zur Entwurfszeit) persistente Feldkomponenten mit dem Feldeditor erstellen, um die Felder im Dataset, ihre Eigenschaften und ihre Reihenfolge anzugeben. Bei einem TField-Nachkommenobjekt können Sie mithilfe der Tag-Eigenschaft angeben, dass eine bestimmte Spalte, in der Werte für dieses Feld angezeigt werden, automatisch angepasst werden muss.

Dies ist die Idee: Wenn eine Spalte den verfügbaren Speicherplatz automatisch anpassen soll, weisen Sie der Tag-Eigenschaft des TField-Nachkommen einen ganzzahligen Wert zu, der die Mindestbreite der entsprechenden Spalte angibt.

Die FixDBGridColumnsWidth-Prozedur

Bevor Sie beginnen, in der OnCreate-Ereignis Geben Sie für das Formularobjekt, das das DBGrid enthält, an, welche Spalten automatisch in der Größe geändert werden müssen, indem Sie der Tag-Eigenschaft des entsprechenden TField-Objekts einen Wert ungleich Null zuweisen.

Verfahren TForm1.FormCreate (Absender: TObject);
Start
// Autoresizable-Spalten durch Zuweisen einrichten
// Breite in der Tag-Eigenschaft minimieren.

// mit festem Wert: 40 px
Table1.FieldByName ('FirstName'). Tag: = 40;
// mit variablem Wert: Breite der
// Standardspaltentiteltext
Table1.FieldByName ('LastName'). Tag: = 4 + Canvas. TextWidth (Table1.FieldByName ('LastName'). DisplayName);
Ende
;

Im obigen Code ist Tabelle1 eine TTable-Komponente, die mit a verknüpft ist DataSource-Komponente, die mit dem DBGrid verknüpft ist. Die Table1.Table-Eigenschaft verweist auf die DBDemos Employee-Tabelle.

Wir haben die Spalten markiert, in denen die Werte für die Felder Vorname und Nachname angezeigt werden, damit die Größe automatisch geändert werden kann. Der nächste Schritt besteht darin, unsere FixDBGridColumnsWidth im OnResize-Ereignishandler für das Formular aufzurufen:

Verfahren TForm1.FormResize (Absender: TObject);
Start
FixDBGridColumnsWidth (DBGrid1);
Ende
;

Hinweis: All dies ist sinnvoll, wenn die Align-Eigenschaft des DBGrid einen der folgenden Werte enthält: alTop, alBottom, alClient oder alCustom.

Schließlich ist hier der Code der Prozedur FixDBGridColumnsWidth:

Verfahren FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: ganze Zahl; TotWidth: Ganzzahl; VarWidth: Ganzzahl; ResizableColumnCount: integer; AColumn: TColumn;
Start
// Gesamtbreite aller Spalten vor der Größenänderung
TotWidth: = 0;
// wie man zusätzlichen Platz im Raster teilt
VarWidth: = 0;
// Wie viele Spalten müssen automatisch in der Größe geändert werden?
ResizableColumnCount: = 0;
zum i: = 0 zu -1 + DBGrid. Säulen. Anzahl Dobegin
TotWidth: = TotWidth + DBGrid. Spalten [i] .Breite;
wenn DBGrid. Spalten [i] .Feld. Tag 0 dann
Inc (ResizableColumnCount);
Ende;
// 1px für die Spaltentrennlinie hinzufügenwenn dgColLines in DBGrid. Optionen dann
TotWidth: = TotWidth + DBGrid. Säulen. Anzahl;
// Indikatorspaltenbreite hinzufügenwenn dgIndicator in DBGrid. Optionen dann
TotWidth: = TotWidth + IndicatorWidth;
// Breite Tal "links"
VarWidth: = DBGrid. ClientWidth - TotWidth;
// VarWidth gleichmäßig verteilen
// zu allen Spalten mit automatischer Größenänderung
wenn ResizableColumnCount> 0 dann
VarWidth: = varWidth div ResizableColumnCount;
zum i: = 0 zu -1 + DBGrid. Säulen. Anzahl Dobegin
AColumn: = DBGrid. Spalten [i];
wenn Eine Kolumne. Feld. Tag 0 dann fang an
Eine Kolumne. Breite: = AColumn. Breite + VarWidth;
wenn Eine Kolumne. Breite dann
Eine Kolumne. Breite: = AColumn. Feld. Etikett;
Ende;
Ende;
Ende
; (* FixDBGridColumnsWidth *)