DBGrid wurde entwickelt, um es einem Benutzer zu ermöglichen, Daten in einem tabellarischen Raster anzuzeigen und zu bearbeiten, und bietet mehrere Möglichkeiten, die Art und Weise anzupassen, wie es „Ihre“ Daten darstellt. Mit so viel Flexibilität kann ein Delphi- Entwickler immer neue Wege finden, um es leistungsfähiger zu machen.
Eine der fehlenden Funktionen in TDBGrid ist, dass es keine Option gibt, die Breite bestimmter Spalten automatisch anzupassen, um sie vollständig an die Breite des Rasters des Clients anzupassen. Wenn Sie die Größe der DBGrid-Komponente zur Laufzeit ändern, wird die Größe der Spaltenbreite nicht geändert.
Wenn die Breite des DBGrid größer ist als die Gesamtbreite aller Spalten, erhalten Sie direkt nach der letzten Spalte einen leeren Bereich. Wenn andererseits die Gesamtbreite aller Spalten größer als die Breite des DBGrid ist, wird eine horizontale Bildlaufleiste angezeigt.
DBGrid-Spaltenbreiten automatisch anpassen
Es gibt ein nützliches Verfahren, dem Sie folgen können, das die Breiten ausgewählter DBGrid-Spalten behebt, wenn die Größe des Rasters zur Laufzeit geändert wird.
Es ist wichtig zu beachten, dass normalerweise nur zwei oder drei Spalten in einem DBGrid automatisch in der Größe geändert werden müssen; alle anderen Spalten zeigen einige „statische Breiten“-Daten an. Beispielsweise können Sie für Spalten, die Werte von Datenfeldern anzeigen, die durch TDateTimeField, TFloatField, TIntegerField und dergleichen dargestellt werden, immer eine feste Breite angeben.
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. Mit einem untergeordneten Objekt von TField können Sie die Tag-Eigenschaft verwenden, um anzugeben, dass eine bestimmte Spalte, die Werte für dieses Feld anzeigt, automatisch in der Größe angepasst werden soll.
Hier ist die Idee: Wenn Sie möchten, dass eine Spalte automatisch in den verfügbaren Platz passt, weisen Sie der Tag-Eigenschaft des Nachkommen von TField 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 in der Größe geändert werden sollen, indem Sie der Tag-Eigenschaft des entsprechenden TField-Objekts einen Wert ungleich Null zuweisen.
Prozedur TForm1.FormCreate(Sender: TObject);
Beginnen Sie //mit dem Einrichten von Spalten mit automatischer Größenänderung, indem Sie
//Min Width in der Label-Eigenschaft zuweisen.
//mit festem Wert: 40 px
Table1.FieldByName('FirstName').Tag := 40;
//unter Verwendung des Wertes der Variablen: Breite des
//Standardtextes des Spaltentitels 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 Eigenschaft Table1.Table zeigt auf die Tabelle DBDemos Employee.
Wir haben die Spalten, die die Werte der Felder FirstName und LastName anzeigen, so markiert, dass sie automatisch in der Größe angepasst werden. Der nächste Schritt besteht darin, unsere FixDBGridColumnsWidth im OnResize-Ereignishandler für das Formular aufzurufen:
Prozedur TForm1.FormResize(Sender: TObject); FixDBGridColumnsWidth(DBGrid1)
beginnen ; Ende ;
Hinweis: Dies alles 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 für die FixDBGridColumnsWidth-Prozedur:
Prozedur FixDBGridColumnsWidth ( const DBGrid: TDBGrid);
var i : ganze Zahl; Gesamtbreite : ganze Zahl; VarWidth : ganze Zahl; ResizableColumnCount: integer; ASpalte : TSpalte;
start // Gesamtbreite aller Spalten vor Größenänderung
TotWidth := 0;
// wie man zusätzlichen Platz im Raster teilt
VarWidth := 0;
// Wie viele Spalten sollen automatisch angepasst werden
ResizableColumnCount := 0;
for i := 0 bis -1 + DBGrid.Columns.Count dobegin
TotWidth := TotWidth + DBGrid.Columns[i].Width;
JaDBGrid.Columns[i].Field.Tag 0 dann
Inc(ResizableColumnCount);
Ende ;
// 1px für die Spaltentrennlinie hinzufügen, wenn dgColLines in DBGrid.Options then
TotWidth := TotWidth + DBGrid.Columns.Count;
// Indikatorspaltenbreite hinzufügen if dgIndicator in DBGrid.Options then
TotWidth := TotWidth + IndicatorWidth;
//Breite ist "links"
VarWidth := DBGrid.ClientWidth - TotWidth; //VarWidth gleichmäßig //auf alle Spalten mit automatischer Größenänderung
verteilen
if ResizableColumnCount > 0 then
VarWidth := varWidth divResizableColumnCount ;
for i := 0 bis -1 + DBGrid.Columns.Count dobegin
AColumn := DBGrid.Columns[i];
wenn AColumn.Field.Tag 0 dann starte
AColumn.Width := AColumn.Width + VarWidth;
if AColumn.Width then
AColumn.Width := AColumn.Field.Tag;
Ende ;
Ende ;
Ende ; (*FixDBGridColumnsWidth*)