Search  
Friday, November 24, 2017 ..:: Articole » Îmbunătăţirea lui Class Browser folosind AddIn-uri ::.. Register  Login
 Articole Minimize

Îmbunătăţirea lui Class Browser folosind AddIn-uri

Autor: Ken Levy.
Notă: Class Browser-ul livrat în Visual FoxPro Professional Edition duce conceptul "arhitectură deschisă" până la limite. Dacă nu vă place cum este făcut, îl puteţi modifica după voia dvs.

Gestionarea claselor nu este un lucru uşor. Class Browser-ul din Visual FoxPro oferă un mod uşor şi prietenos de a manipula bibliotecile de clase vizuale (dacă nu sunteţi familiarizat cu Class Browser, vedeţi capitolul "Noţiuni complementare" de la finalul acestui articol). Totodată, uşurinţa în exploatare reprezintă doar o parte din facilităţi. Class Browser-ul are abilitatea unică de a fi particularizat cu ceea ce este cunoscut sub numele de Add-in.

Flexibilitatea lui Class Browser

Principalul criteriu în aprecierea unui instrument este cât de bine te ajută să îţi faci treaba. Gestionarea bibliotecilor de clase este o operaţiune delicată, compusă din multe verificări, care merg de la verificarea codului claselor până la integrarea lor cu bibliotecile produsului final.

În multe medii de dezvoltare există un aşa-numit "Class Librarian" îi ajută pe dezvoltatori să gestioneze clasele. Visual FoxPro, pe lângă faptul că păstrează compatibilitatea cu versiunile anterioare de FoxPro şi de instrumente de dezvoltare Microsoft, oferă un instrument simplu, dar care are arhitectura deschisă, permiţând astfel dezvoltatorilor să îl particularizeze după dorinţă. Acest lucru se face folosind un add-in.

Add-in-ul este un program pe care îl scrieţi şi îl "înregistraţi" în Class Browser. După înregistrare, programul se poate executa automat ca răspuns la un eveniment în Class Browser sau poate fi apelat manual de utilizator. Un add-in poate face orice doriţi. Iată un exemplu de program Add-in:

*  Program:..........CLSNAME.PRG
*) Descriere:........Add-in exemplu pentru Class Browser
*) ..................Afişează numele clasei curente.


LPARAMETERS sursa
WAIT WINDOW sursa.ProperBaseClass(sursa.cClass)
RETURN

Remarcaţi parametrul. Class Browser la apelarea unui add-in se transmite pe sine însuşi ca parametru. Acest lucru înseamnă că toate obiectele, proprietăţile, evenimentele şi metodele proprii lui Class Browser sunt disponibile. În exemplul de mai sus sunt folosite metoda ProperBaseClass şi proprietatea cClass. Ambele sunt specifice lui Class Browser.

Această capacitate a lui Class Browser permite multe lucruri. Puteţi folosi informaţiile în Class Browser pentru a face ce doriţi (de exemplu, dacă este selectat fişierul .VCX, puteţi face o trecere prin toate clasele definite în bibliotecă, nu doar prin una singură, cum este în mod implicit), puteţi accesa metodele sau chiar să aveţi acces asupra tabelei .VCX (şi biblioteca de clase este tot o tabelă obişnuită). Înţelegerea completă a acestei facilităţi a lui Class Browser este cheia pentru crearea add-in-urilor.

Mai întâi voi trata punctele cheie privitoare la înregistrarea add-in-urilor.

Înregistrarea Add-in-urilor

Înainte de a putea folosi un add-in, el trebuie înregistrat. Lansaţi în execuţie Class Browser-ul şi scrieţi în fereastra de comenzi:

_oBrowser.AddIn("Nume clasă","CLSNAME")

Metoda AddIn() va înregistra add-in-ul. Sintaxa afişată mai sus specifică un nume pentru add-in ("Nume clasă") şi programul care trebuie rulat ("ClsName"). Numele este insenzitiv la majuscule/minuscule, dar aşa cum este scris aici, aşa va fi afişat în meniul add-in-urilor.

Rularea unui Add-in

Un add-in poate fi lansat în execuţie prin mai multe metode. În primul rând, puteţi să-l lansaţi cu metoda DoAddIn():

_oBrowser.DoAddIn("Nume clasă")

Transmiterea numelui unui add-in înregistrat metodei DoAddIn() va lansa în execuţie acel add-in.

Puteţi apela un add-in şi cu ajutorul butonului Add-in. Click-ul pe acest buton afişează un meniu cu add-in-urile instalate. Acelaşi meniu poate fi expandat manual cu metoda AddInMenu() ca în exemplul următor:

_oBrowser.AddInMenu()

Rularea acestei metode va deschide un meniu în locaţia săgeţii mouse-ului. Puteţi închide meniul cu metoda _oBrowser.DeactivateMenu(), deşi nu este nevoie; meniul se închide automat când faceţi o selecţie.

Eliminarea unui Add-in

Puteţi elimina un add-in din tabela de înregistrări a lui Class Browser cu ajutorul metodei AddIn():

_oBrowser.AddIn("Nume clasă",.NULL.)

Dacă numele programului este transmis ca .NULL., înregistrarea din tabela lui Class Browser este marcată pentru ştergere.

Crearea add-in-urilor particularizate

Add-in-urile permit controlarea multor evenimente şi extind sau înlocuiesc comportamentul implicit. Exemplul anterior este extrem de simplu (afişează numele clasei), dar respectă întru totul caracteristicile unui add-in: acceptă un obiect ca parametru (subliniez: parametrul este chiar formularul Class Browser) şi apoi accesează proprietatea cClass a lui Class Browser, pe care o afişează în comanda WAIT WINDOW.

Cu toate că exemplul nu e cine ştie ce, el ilustrează câteva concepte de bază: Mai întâi, datorită faptului că parametrul transmis este chiar Class Browser-ul, orice add-in are acces la toate facilităţile oferite de Class Browser. Din acest motiv, este important să studiem Class Browser-ul. Este foarte bine documentat în help-ul Visual FoxPro. Un alt concept important este acela că sunt foarte puţine lucruri pe care un add-in NU le poate face.

Iată un alt exemplu de add-in: El scrie informaţii suplimentare în header-ul codului exportat cu metoda ExportClass() a lui Class Browser. Este util când vreţi să reprezentaţi o clasă în cod. Poate fi folosit în documentarea sistemului, când scrieţi articole sau cărţi, ş.a.m.d.

*  Program:........DOCCLASS.PRG
*) Descriere:......DocClass este un program add-in care
*) ................care exportă codul unei clase cu
*) ................un header standard.


LPARAMETERS obiect

#DEFINE cr_lf chr(13)+chr(10)
_cliptext=obiect.ExportClass()

LOCAL laLinieHeader[5], lcText, lnContor

laLinieHeader[1]= "* Clasă...............: "+;
obiect.ProperBaseClass(obiect.cClass)
laLinieHeader[2]= "* Autor...............: "+;
Popescu Ion"
laLinieHeader[3]= "* Proiect.............: "+;
Nume proiect"
laLinieHeader[4]= "* Copyright...........: "+;
Nume firmă"
laLinieHeader[5]= "* Note................: "+;
"Cod exportat din Class Browser."

FOR lnContor = 1 TO ALEN(laLinieHeader,1)
lcText = lcText + laLinieHeader[lnContor] + cr_lf
ENDFOR

lcText = lcText + cr_lf
_cliptext = lcText + _cliptext
=MessageBox("Codul a fost exportat în clipboard!",32)

RETURN

În teorie, acest add-in este extrem de simplu. Metoda ExportClass() este folosită pentru a scrie codul clasei în clipboard (acest lucru este realizat prin modificarea variabilei de sistem _CLIPTEXT). Masivul declarat conţine liniile suplimentare din header, care sunt adăugate apoi (împreună cu LineFeed şi Carriage Return) la textul din clipboard. Apoi puteţi copia textul din clipboard oriunde doriţi.

Acesta este un bun exemplu al unui add-in care automatizează o procedură şi o reduce la două click-uri de mouse.

Modificarea lui Class Browser folosind Add-in-uri

Dacă instalaţi un add-in aşa cum a fost specificat mai sus, îl puteţi rula selectând o clasă, apoi click pe butonul Add-ins şi selectând add-in-ul corespunzător din meniu.

Câteodată, un add-in poate îmbunătăţi radical anumite funcţii ale lui Class Browser. De exemplu, add-in-ul Document Class (descris în capitolul precedent) poate fi văzut ca o analogie la funcţia View Class (existentă în Class Browser). Aţi putea spune că o implementare mai bună a acestui add-in ar fi în evenimentul RightClick al butonului View Class. Pentru a vedea cum se face acest lucru, să aruncăm o privire asupra sintaxei metodei AddIn():

AddIn(<Add-in Name>, ;
<Program Name>, ;
<Method Name>, ;
<Active for files>, ;
<Platform>, ;
<Comment>)

<Add-in Name> este numele add-in-ului. Numele poate fi compus din unul sau mai multe cuvinte şi contează dacă este scris cu majuscule sau cu minuscule. Singurul lucru care merită remarcat este că va fi afişat în meniu exact aşa cum este scris. El va fi afişat în meniu numai dacă parametrul <Method Name> nu a fost specificat. Discutăm acest lucru puţin mai târziu.

<Program Name> este numele programului care trebuie rulat. Programul poate fi .PRG, .APP, .EXE sau .FXP. Mai mult, puteţi specifica şi un .SCX. Extensia implicită este .PRG; dacă folosiţi altceva, trebuie specificat în întregime numele programului.

<Program Name> poate fi şi numele unui obiect. În acest caz, sintaxa este <.VCX name, Class Name>. Exemplu:

_oBrowser.AddIn("NumeAddin","Biblioteca.vcx,ClasaSelectată"

Când add-in-ul este rulat, va fi instanţiată ClasaSelectată din Biblioteca.vcx. Va trebui să ţineţi cont de faptul că parametrul va fi transmis prin intermediul clasei respective.

De asemenea, este o idee bună să specificaţi toată calea de căutare a programului transmis prin acest parametru, pentru că vă asiguraţi în acest fel că add-in-ul va funcţiona corect oriunde ar fi localizat pe disc. În caz contrar, este posibil să primiţi mesaje de eroare (dacă Class Browser-ul nu găseşte programul specificat).

<Method Name> este numele metodei care va rula automat add-in-ul. Orice metodă (a lui Class Browser sau a unuia din obiectele subordonate lui) poate fi un apelant (hook) pentru add-in. De exemplu, dacă doriţi să executaţi add-in-ul NumeAddIn în eventul RightClick a butonului Export, puteţi folosi codul următor:

_oBrowser.AddIn("NumeAddIn", ,"CmdExport.RightClick")

Nu este nevoie să specificaţi al doilea parametru în această comandă. Această facilitate permite să modificaţi înregistrarea unui add-in numai atunci când aveţi nevoie. În acest caz, deoarece programul care se rulează nu s-a modificat, nu este nevoie să-l specificaţi. Lăsându-l necompletat, se va transmite un .F. logic în variabila corespunzătoare din metoda AddIn. Metoda AddIn() este suficient de inteligentă pentru a înţelege că parametrul vid înseamnă că valoarea corespunzătoare rămâne nemodificată.

În final, poate doriţi să înlocuiţi total funcţia implicită a unui component din Class Browser (de exemplu, poate nu doriţi ca butonul cmdExport să apeleze metoda ExportClass()). Pentru a face acest lucru trebuie să ca add-in-ul să stabilească proprietatea lNoDefault a lui Class Browser la .T. Dacă această proprietate este .T., Class Browser-ul nu va execută şi restul codului. Nu este nevoie să o faceţi la loc .F.; Class Browser-ul face automat acest lucru înaintea apelării oricărui add-in.

<Active for files> permite specificarea tipului de fişiere pentru care funcţionează add-in-ul. În mod implicit, când un add-in este adăugat în tabela de înregistrare a lui Class Browser, el este disponibile pentru orice fişier .VCX şi .SCX. Acest parametru permite unul sau mai multe fişiere (separate prin virgulă) pentru care se va executa add-in-ul. Pentru celelalte fişiere încărcate în Class Browser, add-in-ul pur şi simplu nu există. <Platform> specifică platforma (de exemplu "Windows") pentru care este disponibil add-in-ul. În mod implicit, un add-in este disponibil pentru toate platformele.

<Comment> este un comentariu opţional pe care îl puteţi depozita împreună cu add-in-ul în tabela de înregistrare din Class Browser.

Dacă priviţi îndeaproape metoda AddIn(), veţi remarca faptul că oferă un mijloc extrem de puternic de a particulariza Class Browser-ul, păstrând totodată facilităţile oferite de acesta. De exemplu, să presupunem că doriţi să folosiţi fontul "Courier New" în Class Browser. Tot ce trebuie să faceţi este să scrieţi un program similar cu cel de mai jos şi să-l înregistraţi în Class Browser, pentru metoda Init():

*  Program................: FONTSET.PRG
* Autor..................: Menachem Bazian, CPA
* Copyright..............: (c) Flash Creative Management, Inc., 1995
*) Descriere..............: Stabileşte fontul pentru clase


LPARAMETERS sursa

sursa.SetFont("Courier New")
RETURN

Pentru a-l înregistra:

_oBrowser.AddIn("FontSet", "FontSet", "Init")

Concluzie

După cum vedeţi, Class Browser-ul este extrem de maleabil. Cele mai multe aspecte ale sale pot fi modificate cu puţin cod scris de dvs. Sper ca această expunere să vă inspire să exploraţi Class Browser-ul şi să-l folosiţi mai mult în timp ce vă faceţi munca proprie.

Noţiuni complementare: Iniţiere în Class Browser

Class Browser este scris în Visual FoxPro şi este specificat de o variabilă de sistem numită _BROWSER, care are ca valoare implicită _BROWSER=SYS(2004)+"BROWSER.APP". Class Browser-ul deschide o singură bibliotecă de clase (.VCX). Class Browser-ul inclus în versiunea Professional a lui Visual FoxPro permite vizualizarea structura unei clase sau a unui formular, vizualizarea codului aferent, modificarea ierarhiei claselor, ş.a.m.d.

classbrowser.gif

Interfaţa lui Class Browser

Class Browser este lansat în execuţie prin selectarea comenzii Class Browser din meniul Tools. Aceasta determină Visual FoxPro să execute programul definit în variabila de sistem _BROWSER. Class Browser poate încărca clase definite vizual şi non-vizual (Custom). Pot fi lansate mai multe instanţe ale lui Class Browser. Comanda Class Browser din meniul Tools lansează întotdeauna o instanţă nouă a lui Class Browser; meniul Window poate fi folosit pentru a activa una din instanţele existente ale lui Class Browser.

Dacă fereastra Class Browser este redimensionată, controalele din ea se redimensionează automat, pentru a ocupa tot spaţiul disponibil. Dacă este modificată înălţimea ferestrei, se vor modifica înălţimile arborelui şi a ferestrei care afişează componentele clasei. Dacă se modifică lăţimea ferestrei Class Browser, se modifică dimensiunea tuturor componentelor lui Class Browser. Clasele pot mutate dintr-o bibliotecă în alta folosind drag-n-drop.

Folosirea lui Class Browser cu Class Designer şi Form Designer

Componentele unei aplicaţii sunt dezvoltate cu Class Designer (care salvează clasele în fişiere .VCX), prin crearea vizuală a claselor, în timp ce aplicaţia este asamblată din aceste componente în Form Designer (care salvează fişiere .SCX). Nu este necesar să salvaţi fiecare secvenţă de cod şi fiecare metodă ca fiind clasă. Adăugarea codului şi setarea proprietăţilor şi a metodelor la un formular are sens numai dacă nu inteţionaţi să refolosiţi modificările specializate. Funcţia Save As Class permite crearea uşoară a claselor pornind de la un formular.

Datorită faptului că o bibliotecă de clase poate conţine un număr nelimitat de clase şi ştiind că Class Designer permite modificarea unei singure clase la un moment dat, meniul şi liniile de comandă pentru accesul la Class Designer sunt cam "ameţite". Este mult mai simplu să navigaţi prin ierarhia claselor, folosind Class Browser-ul, apoi să apelaţi Class Designer-ul pentru clasa selectată în Class Browser.

Class Designer-ul permite dezvoltarea vizuală a claselor. Aceste clase pot fi vizuale sau non-vizuale (Custom). De asemenea, puteţi să adăugaţi metode şi proprietăţi particularizate, şi aceste vor apare în fereastra Properties, pentru modificare vizuală. Form Designerul permite crearea formularelor prin subclasarea claselor existente, trăgându-le din bara de instrumente Controls.

Modelul de obiecte din Visual FoxPro suportă clase container. Clasele container sunt clasele care conţin obiecte ca membri. De exemplu, Form şi FormSet sunt containere. FormSet-ul conţine Form-uri, iar Form-urile conţin controale şi obiecte Custom, dar pot conţine şi alte containere, cum ar fi OptionGroup şi CommandGroup. Clasa Toolbar este un container care conţine controale. Clasele control cum ar fi CommandButton nu sunt clase container pentru că nu pot conţine obiecte.

Dacă faceţi experimente cu caseta de dialog Save As Class din Form Designer, veţi observa că puteţi salva clasele control într-un fişier .VCX. De asemenea, puteţi selecta mai multe controale şi să le salvaţi doar pe ele. Puteţi chiar să salvaţi formularul în întregime (împreună cu toate obiectele conţinute) ca fiind o clasă. Când selectaţi un singur obiect şi îl salvaţi, veţi obţine o clasă bazată pe clasa obiectului. Dacă selectaţi mai multe obiecte, veţi obţine o clasă container, care conţine instanţieri ale tuturor claselor de bază ale obiectelor selectate.


    

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement