Sortarea coloanelor din sursele dbgrid - delphi faq

Sunați-l pe utilizator pentru a-l susține.
- Bună ziua, acesta este un serviciu de asistență.
- Da.
- Am o problemă, modemul meu nu vrea să lucreze.
- Să vă oferim o linie pentru inițiere.






- Haideți.
- ATF1M5
- Mulțumesc. După 5 minute.
- Încă nu muncesc.
- Da. Să scriem o alta
- Ascult
- ATS10 = 100
- Mulțumesc!
E nevoie de încă 5 minute.
- La mine Modemul funcționează încă rău.
- Păi, scrieți încă o linie.
- Ascult.
- ATFB1A0S0 = 90
- Mulțumesc. Au trecut încă 5 minute.
- Buna ziua. Modemul meu a fost ars.
- Este păcat, dar încă mai am destule linii de inițializare rămase.

Multe aplicații profesionale afișează date în câmpurile grilă și vă permit să sortați orice coloană făcând clic pur și simplu pe antetul său. Ceea ce este prezentat aici nu este cel mai bun mod de a rezolva o problemă, această tehnologie nu este altceva decât o imitație simplă a comportamentului unui astfel de component.

Principalul obstacol în rezolvarea problemei este DBGrid în sine. Problema este că nu există evenimente OnClick sau OnMouseDown, care permit să răspundă la manipulările elementare cu antetul. Este adevărat că există un eveniment OnDoubleClick, dar în acest scop nu este prea elegant. Tot ce avem nevoie este să faceți un antet care să răspundă la un singur click de mouse. Să ne uităm la componenta THeaderControl.

THeaderControl este o componentă introdusă în paleta înapoi în Delphi 2.0 și oferind funcțiile de care avem nevoie. Principalul avantaj - reacția componentei când faceți clic pe panourile individuale, panourile oferă, de asemenea, un afișaj vizual ca un buton (poate fi apăsat și apăsat). Trebuie să conectăm THeaderControl la DBGrid. Iată cum:

Mai întâi, creați o nouă aplicație. Puneți THeaderControl pe formular. Se aliniază automat pe marginea superioară a formularului. Apoi, plasați-o pe formularul DBGrid și setați proprietatea Align la alClient. Apoi adăugați componentele TTable și TDataSource. În componenta TTable, setați proprietatea DatabaseName la DBDEMOS și proprietatea TableName la EVENTS.DB. În TDataSource, specificați proprietatea DataSet pentru componenta Table1 și în TDBGrid, în proprietatea DataSource pe DataSource1. Dacă proprietatea activă a componentei TTable a fost inactivă, activați-o (True). Acum, un pic pokolduem!







Să facem ca componenta THeaderControl să arate similar cu antetul componentei DBGrid. Faceți manipulările necesare în momentul creării formularului. Faceți dublu clic pe evenimentul OnCreate din formular și introduceți următorul cod:

După ce THeaderControl a înlocuit antetul standard DBGrid, mai întâi reinițializăm (setați la False) pavilionul dgTitles din proprietatea Opțiuni a componentei DBGrid. Apoi adăugăm o coloană la HeaderControl și setăm lățimea la 12. Aceasta va fi o coloană goală care are aceeași lățime ca și coloana din stânga a stării din DBGrid.

Apoi, trebuie să vă asigurați că tabela este deschisă pentru acces exclusiv (nu pot fi utilizați de alți utilizatori). Motivul pentru care voi explica un pic mai târziu.

Acum adăugați secțiunile la HeaderControl. Pentru fiecare coloană adăugată, vom crea același text în antet ca și în coloana DBGrid corespunzătoare. În buclă, trecem prin toate coloanele DBGrid și repetăm ​​textul coloanei și înălțimea acesteia. De asemenea, setăm valorile HeaderControl pentru proprietățile MinWidth și MaxWidth la lățimea coloanei corespunzătoare din DBGrid. Acest lucru va împiedica difuzoarele să își schimbe lățimea. Pentru redimensionarea coloanelor aveți nevoie de codificare suplimentară și am decis să nu vă lipsesc de această plăcere.

Acum, cel mai interesant. Vom crea un index pentru fiecare coloană din DBGrid. Numele indexului va fi același cu numele coloanei. Trebuie să închidem acest cod în construcția try..finally, deoarece există câmpuri care nu pot fi indexate (de exemplu, câmpurile Blob și Memo). O încercare de indexare a acestor câmpuri generează o excepție. Interceptăm această excepție și nu permitem clic pe această coloană. Aceasta înseamnă că coloanele care conțin câmpuri care nu sunt indexate nu vor răspunde la un click de mouse. Crearea acestor indexuri servește drept explicație pentru motivul deschiderii tabelului în modul de acces exclusiv. Și în cele din urmă închidem masa, aruncăm steagul de exclusivitate și din nou facem masa activă.

Ultimul pas. Când faceți clic pe HeaderControl, trebuie să activați indexul corect al tabelului. Creați un handler de evenimente OnSectionClick pentru componenta HeaderControl după cum se arată mai jos:

Asta e tot! După ce faceți clic pe titlul coloanei, valoarea proprietății tabelului IndexName devine egală cu antetul componentei HeaderControl.

Simplu și frumos, nu? Cu toate acestea, există o mulțime de locuri care trebuie îmbunătățite. De exemplu, un clic secundar ar trebui să reia ordinea de sortare. Sau abilitatea de a redimensiona coloanele. Încercați-l singur, nu este dificil!

Aici este codul îmbunătățit în comparație cu versiunea anterioară a "Consiliului", este de a folosi numele câmpului în loc de antet ca nume de index.

Acest lucru îmbunătățește flexibilitatea. Modificările sunt indicate cu caractere cursive.

Utilizați proprietatea FieldName a componentei DBGrid pentru a specifica un index cu același nume ca și numele câmpului.







Articole similare

Trimiteți-le prietenilor: