Delphi: Automatycznie dostosuj szerokości kolumn DBGrid

Zaprojektowany, aby umożliwić użytkownikowi przeglądanie i edycję danych w siatce tabelarycznej DBGrid zapewnia różne sposoby dostosowywania sposobu, w jaki reprezentuje „swoje” dane. Przy tak dużej elastyczności, a Delfy deweloper zawsze może znaleźć nowe sposoby na zwiększenie jego mocy.

Jedną z brakujących cech TDBGrid jest to, że nie ma opcji automatycznego dostosowania szerokości określonych kolumn, aby całkowicie dopasować do szerokości klienta siatki. Podczas zmiany rozmiaru komponentu DBGrid w czasie wykonywania szerokość kolumn nie jest zmieniana.

Jeśli szerokość DBGrid jest większa niż całkowita szerokość wszystkich kolumn, otrzymasz pusty obszar tuż za ostatnią kolumną. Z drugiej strony, jeśli całkowita szerokość wszystkich kolumn jest większa niż szerokość siatki DBGrid, pojawi się poziomy pasek przewijania.

Automatycznie dostosuj szerokości kolumn DBGrid

Istnieje jedna przydatna procedura, którą można zastosować, która ustala szerokości selektywnych kolumn DBGrid, gdy rozmiar siatki jest zmieniany w czasie wykonywania.

instagram viewer

Ważne jest, aby pamiętać, że zwykle tylko dwie do trzech kolumn w DBGrid muszą być automatycznie skalowane; wszystkie pozostałe kolumny wyświetlają dane o „statycznej szerokości”. Na przykład zawsze możesz określić stałą szerokość dla kolumn wyświetlających wartości z pól danych reprezentowanych za pomocą TDateTimeField, TFloatField, TIntegerField i podobnych.

Co więcej, prawdopodobnie utworzysz (w czasie projektowania) trwałe komponenty pól za pomocą edytora pól, aby określić pola w zbiorze danych, ich właściwości i ich kolejność. W przypadku obiektu potomnego TField można użyć właściwości Tag, aby wskazać, że konkretna kolumna wyświetlająca wartości dla tego pola musi być automatycznie dopasowana.

Oto pomysł: jeśli chcesz, aby kolumna automatycznie dopasowywała się do dostępnego miejsca, przypisz wartość całkowitą dla właściwości Tag potomka TField, która wskazuje minimalną szerokość odpowiedniej kolumny.

Procedura FixDBGridColumnsWidth

Zanim zaczniesz, w Zdarzenie OnCreate dla obiektu Form zawierającego DBGrid określ, które kolumny należy automatycznie zmienić rozmiar, przypisując niezerową wartość właściwości Tag odpowiedniego obiektu TField.

procedura TForm1.FormCreate (Sender: TObject);
zaczynać
// skonfiguruj kolumny z możliwością autoresizowania, przypisując
// Minimalna szerokość we właściwości Tag.

// przy użyciu stałej wartości: 40 pikseli
Table1.FieldByName („FirstName”). Tag: = 40;
// przy użyciu wartości zmiennej: szerokość
// domyślny tekst tytułu kolumny
Table1.FieldByName („LastName”). Tag: = 4 + Canvas. TextWidth (Table1.FieldByName („LastName”). DisplayName);
koniec
;

W powyższym kodzie Tabela 1 jest składnikiem TTable połączonym z Składnik DataSource, który jest połączony z DBGrid. Właściwość Table1.Table wskazuje tabelę pracowników DBDemos.

Oznaczyliśmy kolumny wyświetlające wartości pól FirstName i LastName, aby można je było automatycznie zmieniać rozmiar. Następnym krokiem jest wywołanie naszego FixDBGridColumnsWidth w module obsługi zdarzeń OnResize dla formularza:

procedura TForm1.FormResize (Sender: TObject);
zaczynać
FixDBGridColumnsWidth (DBGrid1);
koniec
;

Uwaga: Wszystko to ma sens, jeśli właściwość Align DBGrid zawiera jedną z następujących wartości: alTop, alBottom, alClient lub alCustom.

Na koniec oto kod procedury FixDBGridColumnsWidth:

procedura FixDBGridColumnsWidth (const DBGrid: TDBGrid);
var
i: liczba całkowita; TotWidth: liczba całkowita; VarWidth: liczba całkowita; ResizableColumnCount: liczba całkowita; AColumn: TColumn;
zaczynać
// całkowita szerokość wszystkich kolumn przed zmianą rozmiaru
TotWidth: = 0;
// jak podzielić każdą dodatkową przestrzeń w siatce
VarWidth: = 0;
// ile kolumn należy automatycznie zmienić rozmiar
ResizableColumnCount: = 0;
dla i: = 0 do -1 + DBGrid. Kolumny Liczyć dobegin
TotWidth: = TotWidth + DBGrid. Kolumny [i] .Width;
gdyby DBGrid. Kolumny [i]. Pole. Tag 0 następnie
Inc (ResizableColumnCount);
koniec;
// dodaj 1px dla linii separatora kolumngdyby dgColLines w DBGrid. Opcje następnie
TotWidth: = TotWidth + DBGrid. Kolumny Liczyć;
// dodaj szerokość kolumny wskaźnikagdyby dgIndicator w DBGrid. Opcje następnie
TotWidth: = TotWidth + IndicatorWidth;
// szerokość vale „left”
VarWidth: = DBGrid. ClientWidth - TotWidth;
// Równie dystrybuuj VarWidth
// do wszystkich kolumn z możliwością zmiany rozmiaru
gdyby ResizableColumnCount> 0 następnie
VarWidth: = varWidth div ResizableColumnCount;
dla i: = 0 do -1 + DBGrid. Kolumny Liczyć dobegin
AColumn: = DBGrid. Kolumny [i];
gdyby Kolumna. Pole. Tag 0 wtedy zacznij
Kolumna. Szerokość: = AColumn. Szerokość + VarWidth;
gdyby Kolumna. Szerokość wtedy
Kolumna. Szerokość: = AColumn. Pole. Etykietka;
koniec;
koniec;
koniec
; (* FixDBGridColumnsWidth *)