
A mellékelt példaprogram megnyitása előtt a DBGridSumRow.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Az új komponens használata nagyon egyszerű. A SumRowHeight property-ben adhatjuk meg, hogy az alsó, összesített adatokat tartalmazó sor milyen magas legyen. Az értéket pixelben kell megadni. A GridColor property-ben adhatjuk meg a DBGrid színét. A SumFields property tartalmazza az egyes oszlopokhoz tartozó mezőket. Ez egy TCollection-ból származtatott property, amelybe tetszőleges számú elemet vehetünk fel. Az elemek mindegyikéhez egy-egy DBText komponens tartozik, amely a ColumnIndex property-ben megadott sorszámú oszlop alatt jelenik meg. A property-kben megadhatjuk a betűtípust, az adatforrást, az adatmezőt, és az érték igazítását. Ha olyan ColumnIndex értéket adunk meg, ami nem létezik, akkor a DBText nem jelenik meg.
A komponenst (TDBGridSumRow) a TCustomPanel osztályból származtatjuk, ezen fogunk elhelyezni egy DBGrid komponenst. Ez a DBGrid viszont nem egy egyszerű DBGrid komponens, mivel néhány módosítást ebben is el kell végeznünk. A DBGrid komponensnek nincs eseménye arra, amikor a felhasználó az oszlop szélességét megváltoztatja, vagy a rácsot vízszintesen görgeti. Ez a két esemény pedig szükséges ahhoz, hogy a DBText komponensek mindig a pontosan megadott oszlop alatt helyezkedjenek el. Ezért hoztuk létre a DBGridSR osztályt a TDBGrid osztályból származtatva. Mivel a DBGrid osztály egyik őse a TCustomGrid, így ebben megtaláljuk azokat az eljárásokat, amiket fel kell használnunk az előbb említett események kezeléséhez. A ColWidthsChanged eljárás akkor fut le, amikor az oszlopok szélessége megváltozik, a TopLeftChanged eljárás pedig akkor, amikor a bal felső sarokban lévő cella helyére egy másik kerül, vagyis a rácsot vízszintesen vagy függőlegesen elgörgették. Mindkét eljárást felülírjuk az új osztályban, és mindkettőben csak annyit teszünk, hogy meghívjuk az FGridChanged változóban megadott eljárást. Ezt majd akkor állítjuk be, amikor a TDBGridSumRow komponens konstruktorában létrehozzuk a DBGrid-et. Ekkor a ColumnResized eljárást adjuk meg az FGridChanged változóban. A ColumnResized eljárás nem tesz mást, csak meghívja az AlignGrid eljárást. Ez az eljárás fogja a SumFields property-ben megadott DBText komponenseket a megfelelő oszlopok alá igazítani, illetve azt is ellenőrzi, hogy meg kell-e egyáltalán jeleníteni az adott DBText-et. Az eljárás beállítja továbbá a DBGrid magasságát is a komponens, és az SumRowHeight property értékétől függően.
procedure TDBGridSumRow.AlignGrid;
...
begin
FDBGrid.Width:=ClientWidth;
FDBGrid.Height:=ClientHeight-FSumRowHeight;
for i:=0 to FSumFields.Count-1 do begin
with FSumFields[i] do begin
v:=false;
if (Columns.Count-1>=FColumnIndex) and (FColumnIndex>=0) then begin
c:=FColumnIndex;
if dgIndicator in FDBGrid.Options then inc(c);
r:=FDBGrid.CellRect(c, FDBGrid.TopRow);
if not IsRectEmpty(r) then begin
with FDBText do begin
Parent:=self;
Left:=r.Left; Top:=FDBGrid.Height+1;
Width:=r.Right-r.Left; Height:=FSumRowHeight;
end;
v:=true;
end;
end;
FDBtext.Visible:=v;
end;
end;
end;
A DBtext helyét úgy tudjuk meghatározni, hogy a CellRect függvénnyel lekérdezzük az adott oszlop első látható sorának koordinátáit. Nekünk ebből csak a cella bal és jobb szélének koordinátáira lesz szükségünk. Az eredményt egy TRect típusú struktúrában kapjuk vissza. Ha az oszlop nem is látszik, akkor egy üres területet kapunk. Hogy üres területet kaptunk-e, azt az IsRectEmpty függvénnyel kérdezhetjük le. Amikor az oszlop koordinátáit kérdezzük le, akkor egy dolgot figyelembe kell vennünk. Ha a DBGrid Options property-jében a dgIndicator érték meg van adva, akkor az Indicator oszlop lesz a 0 indexű oszlop, holott a Columns property ezt nem tartalmazza.
Mivel a DBGrid property-jeit nem érhetjük el közvetlenül az Object Inspectorból, ezért létre kell hoznunk az új komponensben is ugyanezeket a property-ket úgy, hogy mindegyikhez egy Get függvény és egy Set eljárás tartozzon. Ezekben a DBGrid megfelelő property-jeinek értékeit olvassuk, illetve írjuk.