Search  
Friday, November 24, 2017 ..:: Articole » Ştii cine îţi sunt părinţii? ::.. Register  Login
 Articole Minimize

Ştii cine îţi sunt părinţii?

Autor: Barbara Peisch.
Notă: În această expunere veţi găsi informaţii despre folosirea claselor vizuale în Class Designer şi Form Designer. Aceste informaţii vă vor scuti de ore de muncă şi experimente în proiectarea unor formulare din ce în ce mai avansate.

Deci sunteţi gata să atacaţi primul dvs. proiect Visual FoxPro. Aţi citit toate informaţiile, aţi umplut Help-ul de sânge, şi credeţi că sunteţi pregătit, nu-i aşa?

Hmmm, poate nu. Sunt o multitudine de situaţii în Visual FoxPro în care abordarea intuitivă sau implicită vă duce într-un loc în care nu aţi vrut să ajungeţi sau din care este cumplit de greu să vă mai întoarceţi. Rolul acestei expuneri este acela de a vă informa asupra acelor mici trucuri care vă fac viaţa uşoară când construiţi şi folosiţi bibliotecile de clase.

Alternativa clasică

Poate aţi auzit că NICIODATĂ nu trebuie să instanţiaţi direct clasele de bază Visual FoxPro. Sunt de acord cu acest lucru, deoarece nu aveţi nici un mijloc de a modifica proprietăţile claselor de bază Visual FoxPro, şi ştim cu toţii cât de des apare această necesitate, mai ales după terminarea aplicaţiei.

Mai exact, eu personal recomand minimum două nivele de biblioteci de clase: primul, o bibliotecă globală care moşteneşte direct clasele de bază Visual FoxPro. Al doilea nivel este particularizat pentru fiecare client (sau aplicaţie) pe care o dezvoltaţi. Această metodă oferă posibilitatea de a modifica proprietăţile tuturor instanţierilor unui obiect fără a afecta nimic altceva (nici celelalte aplicaţii scrise). La o primă vedere, ar putea părea o duplicare inutilă, dar cu siguranţă veţi fi mult mai fericit atunci când, după 6 luni de la livrarea unei aplicaţii, clientul vrea să îi modificaţi aspectul casetelor de text...

Uite, mamă, n-are butoane!

Când creaţi biblioteca standard, vor fi probabil câteva lucruri pe care veţi dori să le modificaţi. Unele dintre ele ţin de plăcerea fiecăruia, cum ar fi proprietatea BackColor a unui obiect. Poate aţi auzit şi de faptul că este indicat ca formularele dvs. să folosească sesiuni de date private (Private Data Session). Dar există şi o modificare utilă, cu care probabil nu sunteţi la curent: ştergerea obiectelor dintr-un container. Aceste containere sunt: OptionGroup, CommandGroup şi PageFrame. (N-am inclus în această listă şi FormSet. Voi discuta despre acest lucru puţin mai târziu).

Parcă vă aud spunând: "De ce să am în OptionGroup în clasa mea de bază 0 butoane? Întotdeauna voi avea nevoie de cel puţin două; n-ar fi mai comod să îmi definesc clasa direct aşa?" Motivul este că nu puteţi modifica proprietatea Name a obiectelor dintr-un container care au fost instanţiate în clasa părinte. Cu alte cuvinte, va trebui să vă referiţi la ele ÎNTOTDEAUNA cu "Optiunea1" şi "Optiunea2", în loc de "OptEcran" şi "OptImprimanta". Poate nu pare cine ştie ce la început, dar dacă aveţi multe OptionGroup, aruncate adânc în ierarhie, ei bine, atunci devine o afacere treaba asta.

Aş vrea să vă avertizez în privinţa setării proprietăţii PageCount a unui PageFrame la zero. Visual FoxPro are o problemă cu folosirea obiectelor bazate pe clasă Container, dacă sunt plasate pe o pagină care nu există în clasa părinte. Problema constă în faptul că cele mai multe, dacă nu chiar toate obiectele din container vor dispare sau vor avea dimensiuni ciudate. (Când spun "container", nu mă refer la toate obiectele container, cum ar fi Grid sau OptionGroup. Mă refer strict la clasa numită "Container"). Pentru a ilustra această problemă, urmaţi următorii paşi:

  1. În Class Designer, creaţi o clasă bazată pe obiectul Container. Puneţi două etichete şi două casete de text în container şi salvaţi clasa.
  2. În Class Designer, creaţi o clasă PageFrame cu proprietatea PageCount=0.
  3. Creaţi un formular nou.
  4. Creaţi un PageFrame în formular trăgând noua dvs. clasă din bara de instrumente în formular.
  5. Modificaţi proprietatea PageCount=2.
  6. RightClick pe PageFrame şi selectaţi "Edit". Selectaţi pagina 1 făcând un click pe ea.
  7. Trageţi noua clasă container din bara de instrumente pe pagina 1.
  8. Selectaţi pagina 2 şi puneţi containerul şi aici.

Veţi observa că nu se văd etichetele şi casetele de text în ambele pagini. Salvaţi acest formular şi reveniţi la Class Designer. Deschideţi PageFrame-ul şi modificaţi proprietatea PageCount=1. Salvaţi clasa şi reveniţi la formular. Veţi vedea că obiectul container arată bine pe pagina 1, dar este în continuare rău în pagina 2. Închideţi formularul, deschideţi din nou Class Designer şi măriţi la 2 proprietatea PageCount. Salvaţi şi înapoi la formular. Ei bine, acum obiectul container este ok pe ambele pagini.

Ideea este următoarea: Clasa globală PageFrame poate să aibă zero pagini, dar dacă intenţionaţi să folosiţi un container în PageFrame, atunci este indicat să subclasaţi PageFrame-ul, astfel încât să aibă paginile pe care intenţionaţi să plasaţi obiecte container.

Folosiţi SetAll pentru a seta proprietăţile comune

Una din problemele de care vă veţi lovi în folosirea obiectelor container (şi acum mă refer la toate tipurile de obiecte container) este stabilirea unei proprietăţi pentru toate obiectele incluse în container. De exemplu, poate vreţi ca toate butoanele dintr-un grup de butoane să fie verzi :-)

Aţi putea să creaţi un grup de butoane cu numărul maxim de butoane, pentru că puteţi ulterior să reduceţi numărul de butoane, în runtime, folosind comanda RemoveObject(), dar nu le puteţi reduce în design time. Pe de altă parte, este dificil să setaţi proprietatea BackColor a fiecărui obiect în parte. Acest comportament elimină avantajele polimorfismului containerului.

În loc să setaţi proprietăţi pentru fiecare obiect, aţi putea folosi comanda SetAll(). Plasaţi această comandă în metoda Init al containerului pentru a modifica o anumită proprietate pentru o categorie de obiecte din grup. De exemplu, codul următor va modifica proprietatea BackColor a tuturor butoanelor dintr-un grup astfel încât vor fi gri:

This.SetAll("BackColor",RGB(192,192,192),"OptionButton")

În acest fel nu trebuie să vă faceţi griji dacă plasaţi un grup de butoane pe formular şi toate sunt albe. Ţineţi cont de faptul că metoda Init se rulează împreună cu formularul. Orice proprietate setată în acest mod devine activă în runtime.

Bineînţeles, este posibil să creaţi un builder care să seteze toate proprietăţile în design time, sau chiar să folosiţi comanda SetAll() în fereastra de comenzi, dacă mai întâi selectaţi containerul şi obţineţi un pointer către el cu ASELOBJ():

=ASELOBJ(o,1)
o[1].SetAll("BackColor",RGB(128,128,128),"OptionButton")

Dacă doriţi să modificaţi această proprietate, este mai uşor să modificaţi metoda Init al containerului. De asemenea, dacă folosiţi comanda SetAll() şi mai târziu adăugaţi obiecte în container, ele vor primi automat aceeaşi proprietate. Nu mai este nevoie să faceţi manual această modificare. Eu personal consider că aceste avantaje sunt mai mari decât dezavantajul de a nu vedea modificările în design time, dar poate dvs. consideraţi altfel. Este la latitudinea dvs.

Datele vă trag în jos?

Probabil aţi văzut cel puţin o dată pe cineva cum trage obiecte din DataEnvironment în formular şi ele se transformă automat în casete de text pentru acele obiecte. Dacă doriţi să folosiţi propriile dvs. subclase, nu faceţi ca el. Casetele de text pe care le creaţi sunt ÎNTOTDEAUNA instanţieri ale claselor de bază VFP! Acelaşi lucru se întâmplă dacă trageţi o tabelă în formular pentru a crea un grid. Dacă nu mă credeţi, faceţi chestia asta şi apoi verificaţi proprietatea Class a obiectelor create. Veţi vedea şi că proprietatea este Read-Only.

Puţină disciplină vă va scuti de dureri de cap ulterioare. Ori de câte ori creaţi sau modificaţi un formular, procedaţi în felul următor:

  1. Modificaţi bara de instrumente astfel încât să afişeze clasele dvs. Pentru a face acest lucru, click pe icoana cu cărţi. Apoi selectaţi biblioteca dvs. Dacă nu este afişată, alegeţi "Add" şi căutaţi-o în harddisc.
  2. Creaţi întotdeauna obiectele dvs trăgându-le din bara de instrumente. Puteţi să le modificaţi proprietatea ControlSource oricând doriţi. Alte metode de a face acest lucru sunt: puteţi trage clasele din Project Manager sau din Class Browser.

Formulare şi seturi de formulare

Acum este momentul să ne întoarcem la FormSet. Trebuie să aveţi întotdeauna cel puţin un formular în set. Visual FoxPro nu permite stabilirea proprietăţii FormCount la 0. Mai rău chiar, dacă folosiţi Class Designer, primul formular este creat întotdeauna pornind de la clasa de bază VFP. Acest lucru este valabil chiar dacă aţi stabilit un model pentru formulare în pagina de Opţiuni.

Dacă creaţi FormSet-ul global folosind Form Designer în locul lui Class Designer, atunci formularul iniţial va moşteni clasa dvs.

  1. Stabiliţi un model pentru formularele dvs. selectând comanda Options din meniul Tools. Modelul se stabileşte in pagina Forms. Nu puneţi un model şi la FormSet încă.
  2. Creaţi un formular nou în Form Designer.
  3. Click pe meniul Form şi alegeţi Create FormSet.
  4. Click pe meniul File şi alegeţi "Save as class". Asiguraţi-vă că aţi ales opţiunea "Entire form set". Alegeţi orice nume vă place.

Acum puteţi stabili şi modelul pentru FormSet.

Există şi un dezavantaj în folosirea acestui FormSet: nu puteţi modifica numele formularului moştenit din clasa părinte. Puteţi stabili numele formularului în clasa FormSet, şi dacă vă convine faptul că primul formular din toate FormSet-urile au acelaşi nume, atunci nu este nici o problemă; dar dacă doriţi să daţi alt nume primului formular din toate FormSet-urile create, atunci va trebui să folosiţi numai formulare create în Form Designer. Pentru a elimina formularul iniţial (pe care nu-l puteţi redenumi), folosiţi This.RemoveObject(<numeformular>) în evenimentul Init al FormSet-ului. Pentru a fi sigur că nu folosiţi accidental acest formular, micşoraţi-i dimensiunile la minimum şi plasaţi-l în colţul din dreapta-jos al FormSet-ului. În caz contrar, veţi sfârşi prin a pune obiecte pe el şi a vă întreba: "Unde mama naibii s-au dus obiectele alea?" când rulaţi FormSet-ul... :-)

Nu uitaţi că dacă vreţi ca Visual FoxPro să folosească aceste formulare ca modele, va trebui să îi spuneţi acest lucru, în meniul Tools->Options, pagina "Forms". De asemenea, daţi în treacăt şi un click pe "Set as default"...

Veţi observa că există două secţiuni: una pentru formularul implicit şi una pentru FormSet-ul implicit. Dacă definiţi şi un FormSet şi un formular simultan, la crearea unui nou formular va fi folosit FormSet-ul ca model. Dacă doriţi un singur formular, mai întâi adăugaţi un formular (ca să îi puteţi modifica numele), apoi eliminaţi primul formular şi FormSet-ul. Dacă intenţionaţi să folosiţi FormSet-uri, atunci trebuie să creaţi un model de formular şi unul de FormSet. În acest fel, Visual FoxPro va folosi FormSet-ul drept model, şi formularul drept model pentru toate formularele pe care le adăugaţi la FormSet.

M-am blocat într-un grid!

Grid-urile sunt puţin mai greu de configurat corespunzător. Problema este că textbox-urile pe care le plasează Visual FoxPro sunt instanţieri ale clasei de bază. Metoda cu SetAll() descrisă mai devreme nu este aplicabilă aici, pentru că unui obiect nu îi puteţi schimba clasa după ce l-aţi instanţiat.

Dacă creaţi un grid cu proprietatea ColumnCount=-1, nu aveţi nici un control asupra denumirii coloanelor şi asupra plasamentului controalelor. Aşa că, deşi nu este nici o problemă în a subclasa un grid cu proprietatea ColumnCount=-1, în mod sigur veţi vrea să îl modificaţi în design time.

Mai întâi, problema cu textbox-urile. Trebuie şterse şi înlocuite cu altceva. Singura metodă de a şterge un textbox este aceea de a-l selecta în fereastra de proprietăţi, apoi click pe bara de titlu a lui Form Designer, apoi apăsaţi tasta Delete. Ar trebui să vedeţi că dispare icoana de textbox din grid. Apoi alegeţi orice control şi plasaţi-l în coloana respectivă. Puteţi plasa mai multe controale într-o singură coloană. Numai unul dintre ele este vizibil la un moment dat, şi acest lucru este determinat de proprietatea CurrentControl a coloanei.

Concluzie

Sper că v-am oferit câteva tehnici care vă vor face viaţa mai uşoară în folosirea lui Visual FoxPro. Toate trucurile din această expunere sunt rodul multor ore de frustrare şi sper să vă ajute. Sper ca orele mele de explorare să le scutească pe ale voastre.


    

 Google Ads Minimize

    

Copyright 2002-2013 Profox   Terms Of Use  Privacy Statement