Delphi - TDBGrid tartalmának rendezése a fejlécre való kattintás után

forráskód letöltése
A Windows Intézőjében a részletes nézet esetén, ha a fejlécen kattintunk valamely elemen (állomány név, méret, dátum, stb.), akkor a szerint lesz rendezett a táblázat, ha még egyszer rákattintunk ugyanarra az elemre, akkor szintén ezen oszlop szerint történik meg a rendezés, de most már csökkenő sorrendben.

Ha van egy tetszőleges adatbázisunk és ehhez megjelenítésképpen egy TDBGrid-et kapcsolunk, akkor jó lenne a fent leírt funkciót is hozzárendelni, így a felhasználó bármelyik mező szerint rendezetté tehetné az adatbázist akár növekvő, akár csökkenő sorrendben.

Ennek megvalósítására azonban minden mezőhöz létre kellene hoznunk egy növekvő és egy csökkenő indexet is. Ez viszont feleslegesen megnövelné az adatbázis méretét és jelentősen csökkentené is annak kezelési sebességét, mivel az indexeket állandóan karban kellene tartani az adatbázis tartalmának a változásakor.

Mellékelt példában egy olyan megoldást mutatunk be, mely egyetlen index nélkül megvalósítja a fent leírt funkciót egy tetszőleges szerkezetű adatbázis esetén. A Windows Intézőjében a részletes nézet esetén, ha a fejlécen kattintunk valamely elemen (állomány név, méret, dátum, stb.), akkor a szerint lesz rendezett a táblázat, ha még egyszer rákattintunk ugyanarra az elemre, akkor szintén ezen oszlop szerint történik meg a rendezés, de most már csökkenő sorrendben.

Ha van egy tetszőleges adatbázisunk és ehhez megjelenítésképpen egy TDBGrid-et kapcsolunk, akkor jó lenne a fent leírt funkciót is hozzárendelni, így a felhasználó bármelyik mező szerint rendezetté tehetné az adatbázist akár növekvő, akár csökkenő sorrendben.

Ennek megvalósítására azonban minden mezőhöz létre kellene hoznunk egy növekvő és egy csökkenő indexet is. Ez viszont feleslegesen megnövelné az adatbázis méretét és jelentősen csökkentené is annak kezelési sebességét, mivel az indexeket állandóan karban kellene tartani az adatbázis tartalmának a változásakor.

Mellékelt példában egy olyan megoldást mutatunk be, mely egyetlen index nélkül megvalósítja a fent leírt funkciót egy tetszőleges szerkezetű adatbázis esetén.



Első probléma ott adódik, hogy a TDBGrid fejlécén nem tudunk kattintani úgy, hogy az nyomógombként viselkedjen.

Ezért a TDBGrid eredeti fejlécét letiltjuk (Options dgTitles) és egy THeaderControl komponenst helyezünk el a Form-on, ahol induláskor (Form.OnCreate) létrehozunk annyi elemet, ahány oszlopa van a TDBGrid-nek.

A legelső elemre egy X-et teszünk. Ha ezt nyomja le a felhasználó, akkor állítjuk majd vissza az adatbázis eredeti sorrendjét.

A megfelelő sorrendet egy TQuery-vel való lekérdezéssel valósítjuk meg. A lekérdezésnél nem adunk meg semmilyen feltételt, így megkapjuk az egész adatbázist, csupán annyit teszünk, hogy a kiválasztott mezőt felhasználva rendezzük a rekordokat növekvő, illetve csökkenő sorrendbe.

Ennek a módszernek is van azért egy nagy hátránya, mégpedig az, hogy ha nagyon nagy méretű az adatbázis, vagy csak a felhasználó gépe nem túl erős, akkor ez a rendezés elég lassú lehet.

Egy kis háromszög kirajzolásával jelezzük is a felhasználónak, hogy aktuálisan melyik mező szerint és milyen irányba történt meg a rendezés. Ehhez a THeaderControl OnDrawSection eseményét használjuk fel.

Az OnSectionResize esemény figyelésével pedig megvalósítjuk azt, hogy ha a felhasználó méretezi az egyes oszlopok szélességét, akkor ezt a TDBGrid komponens is kövesse.