Problemă cu dbcombobox

Buna ziua tuturor! Astăzi voi vorbi despre DBComboBox. dar dacă adevărul nu este destul despre el. Voi vorbi despre cum să îl înlocuiți. Esența lucrării este următoarea: probabil că înțelegeți DBComboBox - o componentă de lucru cu bazele de date. Și se părea că, conform ideii pe care ar trebui să o faceți, să specificați doar sursa de date și câmpurile pe care doriți să le introduceți în listă și va exista o listă derulantă cu opțiuni. Dar când am înțeles nu cu mult timp în urmă cu această componentă, nu am putut obține rezultatul dorit.






Configurați DBComboBox. iar în câmpul Text sa înregistrat prima valoare din eșantion. Când faceți clic pe "bifați", lista este goală. Există un alt punct: atunci când introduceți o valoare în câmp (ar trebui compilată o listă de valori adecvate), câmpul din baza de date este actualizat. Ie se pare că adaug o nouă valoare la listă - componenta a actualizat pur și simplu rândul din baza de date la valoarea pe care am introdus-o. Așa puteți descrie esența problemei cu DBComboBox.
Prima metodă de rezolvare a problemei cu lucrul cu DBComboBox a fost de a oferi următoarea schemă de implementare.

Problemă cu dbcombobox
Algoritmul de înlocuire pentru DBComboBox

Locuri slabe.
- Cu o conexiune slabă (de exemplu, se va conecta la server printr-o conexiune VPN, o conexiune la Internet printr-un modem). Imaginați-vă o situație în care utilizatorul introduce un cuvânt lung cu fiecare caracter introdus va fi trimis o cerere către baza de date și în timp ce răspunsul este primit, se formează o listă în ciclu - aceasta este tot timpul.
- Dacă accesați frecvent lista Elemente, componenta începe să eșueze. Și am prins un bug atât pe Delphi 7, cât și pe Delphi XE 4.
Din motivele enumerate, a trebuit să refuz această implementare. Dar vă mulțumesc prietenului și profesorului Format_C_eft (CHEREDNICHENKO OG). Codul în sine este în așteptare cu el.
Pentru noua implementare folosim următoarele componente: TListBox și TEdit. Algoritmul în sine rămâne același. Lungimea șirului => 3 caractere, acesta este motivul pentru care nu se fac solicitări în așteptare la baza de date, când o mulțime de înregistrări se potrivesc cu condiția de selecție. Și aceasta este o povară suplimentară pentru legătura cu nordul și, prin urmare, pierderea timpului pentru utilizatorul final. Prin experimente, sa concluzionat că această sumă ar fi condiția minimă și suficientă pentru funcționarea normală. Această implementare a fost testată pe versiunea 2G a Internetului mobil, în principiu funcționează și deja de mai mult de un an. Pentru totdeauna, nu au existat probleme grave.







Problemă cu dbcombobox
Schița implementării DBcombox-ului său

După cum puteți vedea în imagine, TListBox este responsabil pentru afișarea listei de opțiuni. și TEdit pentru câmpul de intrare. Între opțiunile pe care le puteți muta cu săgețile. Când selectați un element, textul este copiat în câmpul de introducere. Așa se întâmplă, cum ar fi DBComboBox. doar mai abrupt. De fapt, du-te la cod.
Vă voi da un exemplu bazat pe domeniul de alegere a cetățeniei. În baza de date există o placă de date, din care vom lua opțiuni pentru listă. Sub articol, vă voi da link-uri pentru a descărca masa de rezervă.
Să începem cu TListBox ...

Toate explicațiile sunt deja în cod și mai sus am considerat algoritmul. Prin urmare, fără cuvinte inutile, continuăm să descriem în continuare soluția la problema cu DBComboBox.
Iată codul pentru TEdit ...

Am observat că aveți pe site, foarte des codul este amestecat cu Delphi și SQL. Și eu am o asemenea nenorocire. Acum, toate metodele care se referă la baza de date, încerc să o pun într-un DM separat și să obțin rezultatul de acolo apelând procedurile corespunzătoare.
Și totuși, nu știu cum se întâmplă cu componentele dvs., dar multe interogări dacă se deschid și apoi se transformă în RecordCount pot returna o sumă greșită, deoarece În mod normal, toate datele nu sunt eșantionate. Trebuie să facem ultima dată și apoi să obținem RecordCount, deși poate am avut ghinion cu componenta sau a avut un set greșit.

Problema descrisă nu a fost întâlnită niciodată ... Și despre amestecarea codului SQL și Delhi. Am găsit următoarea soluție: De exemplu, am nevoie pentru a prelua date de la două sau trei mese, dar este flori, și, de exemplu, vor fi sub-interogări, și, recent, a scris o cerere de conectat trei tabele, și chiar trei versiuni ale interogării conectate prin UNION..Pri acest lucru I Proiectul este dinamic, iar condițiile se schimbă adesea o dată pe săptămână. Așa că m-am dus într-un mod simplu ... Ia-o cerere-l împinge la vizualizarea și toate ... În codul pur și simplu apelează de obicei cererea «SELECT * predstavlenie` din`“.
În plus, această abordare este că, dacă schimbați logica de interogare sau nume de tabel nu contează, nu va trebui să rescrie codul programului, ci pur și simplu schimbare are nevoie de introducere. Voi dezvolta chiar acest subiect pe măsură ce mi-am dat seama de proiectul meu din statică (toate cererile au fost scrise direct în cod) și am făcut-o dinamică. A fost o plăcere să lucrezi, nu a fost nevoie să căutați unde a fost eroarea în cod, ci pur și simplu să lucrați cu baza de date.
Și încă un mic plus, "actualizarea" ajunge la utilizatorul final în câteva secunde. Comparativ cu faptul că nu are nevoie să actualizeze programul. Aici cumva ...

SELECT * FROM `view` este o opțiune bună. Și am văzut multe astfel de abordări. Lucrează pe ura. Cu toate acestea, principalul lucru nu este acela de a abuza, în loc de o reprezentare, magazinul este folosit și cu o logică destul de complexă. Totul este stocat în baza de date. Poate funcționa rapid, dar dacă aveți nevoie să schimbați ceva, este greu de făcut.

Și despre naboleshego nu perzhivay ... .Moe dorința de a menține acest blog și a pus codul și ideile sale stângace pentru toate pentru a vedea - este o oportunitate de a obține feedback. Comentariile nu vazzhno lăudabil sa plâns de polzakov lui Blunt și răspândirea menya..Vazhno l obrpatnaya conexiune și numai de dragul este necesar să se scrie aceste articole și să-l dețină. Și am folosit să cred că pentru a scrie un articol ... .acum gunoi în cap o mulțime de idei, dar tot scrie rezultate bune, uneori peste raboat a stat timp de aproape două zile. Apoi, un alt tovarăș citește și din nou corectați bloturile. Deci, eu sunt doar un blogger pentru oricine care comentează despre mediocritatea mea))))







Articole similare

Trimiteți-le prietenilor: