utilizarea non-standard a componentelor - Articolul Blog Michael flonova

Foarte des, trebuie să se extindă unele posibilitatea unei anumite componente. M-am întâlnit de multe ori cu o astfel de problemă. Modul cel mai corect ar fi de a crea un nou descendent componente, în care să pună în aplicare acțiunile necesare. Corect, dar nu întotdeauna în mod eficient. Astăzi vom învăța să utilizeze componente nu sunt la fel de unchiul conceput Borman.

Dar, uneori, este posibil și chiar este necesară derogarea de la această regulă. De exemplu, în proiectul dvs. utilizează 100 de butoane TButton, și dintr-o dată am vrut să dea același buton o nouă proprietate. Dacă urmați metoda clasică de rezolvare a problemei, va trebui să creați mai întâi o nouă componentă, apoi alegeți una din cele două moduri:

1. Modificați manual în DFM și pas fișierul strămoș pentru fiecare componentă. Când au fost 100 de bucăți, procesul de schimbare poate fi amânată și va fi foarte obositor;

2. Re-crea toate butoanele. Cele mai vechi pentru a șterge și de a crea o nouă cheie din noua componenta. Acest proces va dura chiar mai mult, mai ales dacă nu utilizați acțiunea (TAction) și trebuie să recupereze fiecare proprietate și o tratare a evenimentului pentru buton.

orice modificări ale proiectului nu trebuie să facă mult mai ușor pentru a schimba un TButton standard de componente și mai mult. Pentru aceasta există două opțiuni - schimbare la nivel local și la nivel global. În orice caz, modificările sunt făcute la fel, singura diferență este modul de a face versiunea noastră Delphi compilat a noii componente.

Schimbarea componentă standard

Deci, pentru a primi o componentă descriere TButton și se adaugă o nouă procedură în public:

Nu avem nevoie de manipulări complicate, principala schimbare este o dovadă a unei componente standard a lucrării. Apăsați. Delphi pentru a crea un șablon pentru procedura. În această procedură, nu vom scoate în evidență, ci pur și simplu apel fereastra de mesaj, care este transmis ca parametru:

compilează corect

Acum aveți nevoie pentru a compila Delphi utilizat o versiune modificată a fișierului. În primul rând, ia în considerare metoda globală. Selectați Instrumente / Opțiuni de mediu. Înainte de a deschide fereastra de setări Delphi. Du-te la Biblioteca fila. Aici, în linia de cale Biblioteca arată calea unde compilatorul ar trebui să caute module. Faceți clic pe butonul cu trei puncte, cu atât mai bine pentru a vedea și edita lista de căi într-o fereastră specială.

utilizarea non-standard a componentelor - Articolul Blog Michael flonova

Proprietățile proiectului, Biblioteca fila

utilizarea non-standard a componentelor - Articolul Blog Michael flonova

Docker directoare pentru a căuta module

Să acorde o atenție la prima linie din caseta, în cazul în care este calea de $ (DELPHI) \ Lib. Primul lucru pe care compilatorul va căuta module în directorul \ lib, în ​​directorul în care ați instalat Delphi. Dacă fișierul pas dorit sau DCU în acest director nu poate fi găsit, ele vor fi văzute de către restul listei de directoare. Este clar ce vreau să spun? Dacă nu, citiți mai departe, și va continua să fie interesant.

Sarcina noastră este de a adăuga calea către directorul cu modulele VCL cod sursă și pentru a pune acest drum primul compilator pentru a utiliza acest director. Pentru a face acest lucru, efectuați următorii pași:

1. În caseta de introducere de mai jos lista de directoare, introduceți calea $ (DELPHI) \ Sursa \ VCL;

2. Faceți clic pe butonul Add pentru a adăuga calea;

3. Selectați calea nou adăugat, și săgeata în sus pentru a muta la prima linie;

4. Salvați modificările prin apăsarea butonului OK.

Acum puteți compila proiectul.

Așa că am schimbat setările la nivel global, iar acum toate VCL module director vor fi compilate. Nu, nu „absolut“ totul, iar cele utilizate în proiectul nostru. Dar acest lucru, vă spun, nu câteva. Chiar și un proiect mediocru utilizează cel puțin 20 de unități. Nu este foarte bun, pentru că ne-am schimbat doar un singur fișier StdCtrls.pas.

compilare locală

Pentru conectarea fișier local StdCtrls.pas, acesta trebuie să fie copiat în același director în cazul în care stocați codul sursă al proiectului. În acest caz, setările Delphi nimic nu este necesar să se schimbe, deoarece directorul de proiect este întotdeauna verificat mai întâi. Găsirea StdCtrls.pas director de fișiere \ lib nu va fi verificată, astfel încât compilatorul utilizează o versiune modificată a componentei TButton.

Încercați compilarea locală. Asta în cazul în care apar probleme. În primul rând, compilatorul va indica modul și de teme spun că modulul compilat cu Dialogs o altă versiune de TButton. În acest caz, problema este rezolvată ușor. Uite, modulul Teme conectat la secțiunea de implementare utilizări. Dacă mutați conexiunea la interfața secțiunii utilizări (la începutul modulului), eroarea va dispărea. Acest truc nu funcționează întotdeauna și este mai degrabă o excepție de la regula. Mai jos vom vedea o soluție mai robustă la această problemă.

Din nou, încercați să compilați un program, și o eroare apare din nou. Ar trebui să vedeți un mesaj care modulul ExtCtrls a fost compilat cu o componentă de altă versiune TButton. De ce s-a întâmplat? Când ne-am conectat fișierul modificat la nivel global, totul utilizat în modulele de program din directorul \ Source \ VCL recompilare. În acest caz, recompilat numai StdCtrls, în cazul în care TButton modificate. Dar vom folosi în proiect este, de asemenea, un ExtCtrls modul care:

  • Este luat din directorul \ lib;
  • Modulul utilizează stdctrls;
  • - Compilat cu o altă versiune de TButton.

Două componente diferite cu același nume nu poate exista în cadrul aceluiași proiect. Trucul, pe care am avut-o cu modul Temele nu va trece. Aici aveți nevoie de o soluție diferită. Și se află pe suprafață - și recompilați modulul ExtCtrls. Pentru a face acest lucru, este, de asemenea să copiați directorul cu proiectul sursă. Acum, acest modul este recompilat, și va folosi, de asemenea, un TButton modificat.

Că nu au existat mai multe probleme cu compilarea, copiați directorul cu proiectul sursă și fișierele Dialogs.pas Buttons.pas.

Asta nu e un mod inteligent, în urmă cu câțiva ani am decis să o problemă foarte mare. Într-una din versiunile de Delphi (nu-mi amintesc exact, dar se pare că a fost Delphi 4) în grila de StringGrid o metodă nu a funcționat destul de modul în care am avut. Am modificat și conectat la programul local.

Utilizați cea mai bună conexiune locală, pentru că nu există nici o garanție că o versiune modificată a unei componente necesare în toate celelalte proiecte. Da și compilează toate modulele standard din codul sursă nu are nici un sens atunci când există o versiune compilat în directorul \ lib.

Utilizarea metodelor particulare

Am observat de multe ori că dezvoltatorii Delphi ascund uneori în componentele private sau protected caracteristici foarte utile. Am înțeles că ei neagă accesul la proprietățile și metodele, manipulare incorectă, care ar putea duce la un accident. Și totuși, uneori, accesul la fructul interzis este o necesitate.

Cum de a avea acces la o variabilă sau o metodă care este închis? Luați în considerare problema de exemplu butoane. In componenta TButton are o SetButtonStyle metodă de interior. Această metodă este declarată în secțiunea protejată. Delphi cum să trișeze și să obțină acces la această metodă în mod direct? Dacă scrieți următorul cod în program, apare o eroare în timpul compilării:

La compilatorul Delphi are un dezavantaj (și, probabil, un avantaj, este greu de spus). Dacă două obiecte sunt declarate în același modul, toate proprietățile și metodele lor sunt disponibile unul cu altul. Nu contează în cazul în care aceste metode și proprietăți declarate, acestea sunt deschise sau închise. Astfel de obiecte sunt numite prietenos și pur fraternali de partajare toate caracteristicile sale.

Dar acest lucru nu este suficient, pentru că un buton și proiectul nostru declarat în diferite module, astfel încât capacitatea de a aparent inutile. Nu te grăbi. În programarea orientată pe obiecte are o caracteristică foarte utilă - moștenirea. În acest caz, descendentul poate fi atribuit oricărui strămoș, iar codul va funcționa corect.

Devino prieten

Acum, în cazul în care oriunde în acest modul, puteți utiliza butoanele închise metode. Să presupunem că avem pe formular este de tip buton TButton Button1. Acest obiect este strămoșul TMyButton, astfel încât înregistrarea TMyButton (Button1) este destul de corect. Și, după cum clasa TMyButton este declarat în același modul, putem accesa cu ușurință metodele sale private și proprietăți. Este suficient pentru a scrie cod:

Se pare că, atunci când am anunțat succesorul butonului, toate metodele au mutat în unitatea noastră. Și, din moment ce unul clase de module sunt prietenoase și a vedea toate proprietățile private și metodele, am fost capabili să le citească cu ușurință.

Această metodă este bună doar dacă aveți o proprietate sau metoda din secțiunea protejată. Tot ceea ce este anunțat în secțiunea privată nu este disponibilă pentru descendenții și, prin urmare, nu este transferat la unitatea noastră.

Grid DBGrid

Foarte adesea oamenii mă întreabă, cum poți schimba înălțimea de o anumită coloană în componenta TDBGrid. Da, această componentă nu este o proprietate care ar fi responsabil pentru înălțimea, dar există printre strămoșii TDBGrid TCustomGrid obiect care are un RowHeights de proprietate. Pentru a-l utiliza, pur și simplu scrie următoarea linie:

Dar aici vreau să vă avertizez că Borland nu este în zadar să închidă această proprietate. Faptul este că, dacă DBGrid derula grila, atunci vor exista probleme serioase cu desen. În unele cazuri, proprietățile închise și metodele strămoș poate salva într-adevăr, dar, de asemenea, poate interfera cu funcționarea programului. În acest caz, vom schimba pur și simplu înălțimea unui rând, dar acum va trebui să lucreze din greu pentru a reprezenta datele în mod corespunzător.

utilizarea non-standard a componentelor - Articolul Blog Michael flonova

Grid DBGrid, în care rândurile au diferite înălțimi

Compile complet

După cum puteți vedea, nu trebuie întotdeauna să creeze un nou copil, pentru a da noi caracteristici componente. Puteți utiliza implementarea standard, pur și simplu extinderea oportunităților.

Folosind metodele și proprietățile componentelor închise trebuie să fie corecte. Borland Dezvoltatorii închise cu bună știință metode, ca o provocare directă la unele dintre ele ar putea duce la probleme grave în activitatea întregului program. Metodele private și proprietăți nu sunt documentate în fișierul de ajutor, deci este greu de înțeles modul în care acestea sunt utilizate. Dar dacă analizăm codul sursă al modulului, este ușor de înțeles, ce, când și modul de utilizare.

Amintiți-vă, hacking - un mod de gândire, un mod de viață și de cercetare constantă. Mult noroc în studiile viitoare.

Avertizare. Dacă copiați acest articol pe site-ul dvs., apoi lăsați un link direct către această pagină. Vă mulțumim pentru înțelegere