So korrigieren Sie die DBGrid-Spaltenbreite automatisch

DBGrid wurde entwickelt, um Benutzern das Anzeigen und Bearbeiten von Daten in einem Tabellenraster zu ermöglichen. 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 ist, dass es keine Option gibt, die Breite bestimmter Spalten automatisch so anzupassen, dass sie vollständig der Clientbreite des Rasters entspricht. Wenn Sie die Größe der DBGrid-Komponente zur Laufzeit ändern, wird die Spaltenbreite nicht geändert.

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

DBGrid-Spaltenbreiten automatisch anpassen

Es gibt ein praktisches Verfahren, mit dem Sie die Breite ausgewählter DBGrid-Spalten festlegen können, wenn die Größe des Rasters zur Laufzeit geändert wird.

Es ist wichtig zu beachten, dass in der Regel nur zwei bis drei Spalten in einem DBGrid automatisch angepasst werden müssen. In allen anderen Spalten werden 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 Felder-Editor erstellen, um die Felder im Dataset, ihre Eigenschaften und ihre Reihenfolge anzugeben. Mit einem TField-Nachkommenobjekt können Sie mit der Tag-Eigenschaft angeben, dass für eine bestimmte Spalte, in der Werte für dieses Feld angezeigt werden, die Größe automatisch angepasst werden muss.

Dies ist die Idee: Wenn eine Spalte den verfügbaren Platz 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, geben Sie im OnCreate-Ereignis für das Form-Objekt, das das DBGrid enthält, an, welche Spalten automatisch angepasst 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
// Minimale Breite in der Tag-Eigenschaft.

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

Im obigen Code ist Table1 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 ist das Aufrufen unserer FixDBGridColumnsWidth im OnResize-Ereignishandler für das Formular:

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: Integer; ResizableColumnCount: integer; AColumn: TColumn;
Start
// Gesamtbreite aller Spalten vor der Größenänderung
TotWidth: = 0;
// wie man zusätzlichen Platz im Gitter teilt
VarWidth: = 0;
// Wie viele Spalten müssen automatisch angepasst werden?
ResizableColumnCount: = 0;
zum i: = 0 zu -1 + DBGrid.Columns.Count Dobegin
TotWidth: = TotWidth + DBGrid.Columns [i] .Width;
wenn DBGrid.Columns [i] .Field.Tag 0 dann
Inc (ResizableColumnCount);
Ende;
// 1px für die Spaltentrennlinie hinzufügenwenn dgColLines in DBGrid.Options dann
TotWidth: = TotWidth + DBGrid.Columns.Count;
// Indikatorspaltenbreite hinzufügenwenn dgIndicator in DBGrid.Options dann
TotWidth: = TotWidth + IndicatorWidth;
// width vale "left"
VarWidth: = DBGrid.ClientWidth - TotWidth;
// Verteile VarWidth gleichmäßig
// zu allen Spalten mit automatischer Größenänderung
wenn ResizableColumnCount> 0 dann
VarWidth: = varWidth div ResizableColumnCount;
zum i: = 0 zu -1 + DBGrid.Columns.Count Dobegin
AColumn: = DBGrid.Columns [i];
wenn AColumn.Field.Tag 0 dann fange an
AColumn.Width: = AColumn.Width + VarWidth;
wenn AColumn.Width dann
AColumn.Width: = AColumn.Field.Tag;
Ende;
Ende;
Ende
; (* FixDBGridColumnsWidth *)