Computerwissenschaften

Delphi: DBGrid-Spaltenbreiten automatisch anpassen

Das DBGrid wurde entwickelt. um es einem Benutzer zu ermöglichen, Daten in einem tabellarischen Raster anzuzeigen und zu bearbeiten. Es bietet verschiedene Möglichkeiten zum Anpassen der Darstellung „seiner“ Daten. Mit so viel Flexibilität kann ein Delphi- Entwickler 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.

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 in der Größe angepasst werden muss.

Dies ist die Idee: Wenn eine Spalte automatisch an den verfügbaren Speicherplatz angepasst werden 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, geben Sie im  OnCreate-Ereignis 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.

Prozedur TForm1.FormCreate (Absender: TObject); 
Beginnen Sie mit dem
Einrichten von
// automatisch einstellbaren Spalten, indem Sie // Minimm Width in der Tag-Eigenschaft zuweisen.


// mit festem Wert: 40 px
Table1.FieldByName ('FirstName'). Tag:=40;
// Verwenden des Variablenwerts: Breite des
// Standardspaltentiteltextes
Table1.FieldByName ('LastName'). Tag:=4 + Canvas.TextWidth (Table1.FieldByName ('LastName'). DisplayName);
Ende
;

Im obigen Code ist Tabelle1 eine TTable-Komponente, die mit einer DataSource-Komponente verknüpft ist, 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:

Prozedur TForm1.FormResize (Absender: TObject); 
begin
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:

procedure FixDBGridColumnsWidth ( const DBGrid: TDBGrid); 
var
i: Ganzzahl; TotWidth: Ganzzahl; VarWidth: Ganzzahl; ResizableColumnCount: integer; AColumn: TColumn;
begin
// Gesamtbreite aller Spalten vor Größenänderung
TotWidth:=0;
// wie man zusätzlichen Platz im Gitter
teilt VarWidth:=0;
// Wie viele Spalten müssen automatisch in der Größe
geändert werden? ResizableColumnCount:=0;
für i:=0 bis -1 + DBGrid.Columns.Count dobegin
TotWidth:=TotWidth + DBGrid.Columns [i] .Width;
wenn DBGrid.Columns [i] .Field.Tag 0, dann
Inc (ResizableColumnCount);
Ende ;
// füge 1px für die Spaltentrennlinie hinzu, wenn dgColLines in DBGrid.Options dann
TotWidth:=TotWidth + DBGrid.Columns.Count;
// Indikatorspaltenbreite hinzufügen, wenn dgIndicator in DBGrid.Options dann
TotWidth:=TotWidth + IndicatorWidth;
// width vale "left"
VarWidth:=DBGrid.ClientWidth - TotWidth;
// Verteile VarWidth
// gleichmäßig auf alle Spalten mit automatischer Größenänderung,
wenn ResizableColumnCount> 0, dann
VarWidth:=varWidth div ResizableColumnCount;
für i:=0 bis -1 + DBGrid.Columns.Count dobegin
AColumn:=DBGrid.Columns [i];
wenn AColumn.Field.Tag 0, dann beginne
AColumn.Width:=AColumn.Width + VarWidth;
wenn AColumn.Width dann
AColumn.Width:=AColumn.Field.Tag;
Ende ;
Ende ;
Ende
; (* FixDBGridColumnsWidth *)

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.