Agora
Media
Libraria Byblos



AgoraNews  





PC Magazine Ro  




NET Report   




Ginfo   




agora ON line   





PC Concrete   





Liste de discuții   




Cartea de oaspeți   




Mesaje   





Agora   








Clic aici
PC Report - ultimul numar aparut


Soluții - PC Magazine Romania, Martie 2004

ActiveX (1)

Konstantin Klyagin

Mulți au auzit denumirea de ActiveX și știu că sunt niște controale. Mai puțini au avut treaba cu ele, iar și mai puțini au experiența de a creea așa ceva. Înainte de a începe, dragi prieteni, haideți totuși să ne lămurim ce sunt alea. Prezența literei X poate sugera unora că este vorba de o versiune moderată a unor plăceri trupești în format JPG sau AVI, mai cunoscute sub noțiunea de XXX. Aceasta fiind o părere cu totul greșită.

Creat cu scopul inițial de a fi alternativa applet-urilor Java, standardul ActiveX curând s-a transformat într-un pas înainte al COM (Component Object Model), oferind un mod uniform și relativ ușor pentru a asigura interacțiunea între programele de toate genurile în Windows. La momentul de față, controalele ActiveX scrise în limbaje diferite de programare, se pot folosi la orice, începand cu pagini web până la programe compilate ca module executabile EXE. De exemplu, un control creat în C++, se poate folosi la fel de ușor și într-un program făcut în Visual Basic sau Java, și invers, în orice combinație. Rezultatul nu se modificâ odatâ cu shimbarea locurilor de argumente. Ca și Animal X (emisiunea, nu trupa) care se referă la un animal necunoscut, ActiveX înseamnă un element abstract, care poate fi atât o clasă dintr-o biliotecă reprezentată în mod vizual cu metode diferite pentru a face diverse chestii, cât și un control grafic cu comportamentul propriu. În această serie de articole, ne vom alege C++ ca limbaj de bază, el oferind nivelul de flexibilitate necesar. Exemple de folosire vor fi în Visual Basic, el fiind un limbaj foarte simplu, pe intelesul fiecăruia.

Creare

Unde se poate, vom folosi wizard-uri, pentru că, in primul rând ele ne ușurează mult munca, și în al doilea rând, în cazul în care ne scapă ceva când scriem cod, acești vrajitori știu ce anume este de adăugat, scos sau modificat. Deci, crearea unui ActiveX nou:

Al doilea ecran propune să alegi câte controale să aibă proiectul. Lăsăm unu aici.

Fiind un om simplu de rând, Vasile n-are nici un aspect și nu se prea vede în timp ce lucrează. Așa că punem un check și la "Invisible at runtime".

Interfața funcțională externă a unui control ActiveX se descrie în fișierul cu extensia IDL, pe care îl găsești în File View, ușor, imediat după creare. Limbajul în care el este scris se numește MIDL, un dialect al limbajului de definire de interfețe (interface definition language, IDL). Mai târziu vom încerca să-l modificăm, și să aflăm în ce cazuri sunt necesare asemenea modificări.

Orice control are trei tipuri de atribute, acestea fiind: proprietăți, metode și evenimente. Diferența dintre proprietăți și metode, este de fapt mică, datorită faptului că atât setarea unor proprietăți, cât și citirea valorilor sale, se pot face tot cu ajutorul unor funcții "set" și respectiv "get".

Proprietăți

Ca să înțelegi ce-i aia proprietate, pornește Visual Basic. Alege un proiect nou EXE și pune un control din paleta de pe dreaptă pe formă. Când selectezi controlul, în fereastra "Properties" vei vedea toate proprietățile lui, printre care sunt cele standard, precum "(Name)", "Top", "Left" și altele comune pentru toate controalele ActiveX. Restul, sunt proprietăți specifice ale controlului selectat.

Vasile este muncitor, care la comanda va ridica afișul cu un mesaj. Așa că i-am găsit meseria. Mesajul pentru afiș se va defini cu o proprietate.

Adăugarea unei proprietăți

Ne întoarcem la Visual C++ unde tocmai am creat un proiect nou, și adăugăm o proprietate la controlul nostru. Pentru asta dăm un click drept pe numele interfeței la ClassView (_DVasile), și selectșm "Add Property.." în meniu.

În dialogul care apare imediat, alegem un nume, precum și tipul de date.

Nu te speria daca nu găsești CString sau altceva cu care ești obișnuit. În loc de ele se pot folosi alte tipuri prevăzute de ActiveX. Pentru string, ActiveX are BSTR.

De reținut: tipurile de date in ActiveX sunt uniforme, asa ca unele dintre ele nu se potrivesc cu cele de la C++, sau cu un alt limbaj de programare in particular. In acest fel se asigura compatibilitatea intre toate limbajele din care se pot folosi controalele.

Acum dă-i "OK" și vezi proprietatea nouă apărând în listă. De asemenea, același dialog de adăugare a unei proprietăți se poate accesa și din ClassWizard. Apasă Ctrl-W, selectează tab-ul "Automation" și vezi acolo. Aceasta poate fi considerată metoda a două.

Metodele "Set" și "Get".
Persistența proprietăților

Dacă totul s-ar putea face cu câteva click-uri, probabil acest articol ar fi trebuit să fie publicat nu în "PC Magazine", ci în "Cosmopolitan". Dar până să fie posibil să schimbi valoarea noii proprietăți, și ca această valoare să se salveze automat, mai sunt câteva lucruri de făcut. În primul rând, trebuie să implementezi metodele GetMesaj() și SetMesaj(). Tot codul, generat automat, se adaugă de către wizard la clasa C++ care se numește VasileCtrl și nu se vede din exterior de programe care folosesc controlul, ea realizând mecanismele interne. La ClassView vedem și metodele noastre.

Dăm dublu-click pe una și vedem urmatoarele: conținutul funcțiilor este gol. Pentru ca valoarea proprietății pe care ele o reprezinta să se poată schimba, ea trebuie asociată cu o variabilă internă a clasei. Astfel, adăugăm valoarea, "CString m_Mesaj", și umplem funcțiile cu cod:

BSTR VasileCtrl::GetMesaj() {
CString strResult; strResult = m_Mesaj; return strResult.AllocSysString();
}
void VasileCtrl::SetMesaj(LPCTSTR
lpszNewValue) {
m_Mesaj = lpszNewValue;
SetModifiedFlag();
}

Dar nici asta nu ne e de ajuns; vrem ca valoarea acestei proprietăți să rămână la fel și cand închidem proiectul și îl încarcăm din nou. Pentru asta, proprietatea trebuie făcută "persistentă".

Dacă te uiți bine, vezi că wizard-ul a creat deja și o metodă care se cheamă DoPropExchange. Pentru fiecare proprietate persistentă, trebuie adăugat un apel la o funcție din familia PPX_, în funcție de tipul datelor. În cazul nostru, folosim PPX_String:

PX_String(pPX, "ParityReplace", m_ParityReplace);

La fel, există câte o funcție pentru a salva valorile variabilelor de alte tipuri de date:

PX_Bool(), PX_Double(), PX_Float(),
PX_Long(), PX_Short(), ș.a.m.d.

Acești doi pași trebuie făcuți pentru fiecare proprietate pe care vrei să o vezi în "Properties".

Vasile reacționează la comanda "Afiseaza!", tare și hotarât. Cel mai bine s-o realizăm ca o metodă.

Metode

Cuvântul "metodă" în ActiveX are același sens ca și în orice limbaj de programare obiect-orientat. Metodele sunt funcții asociate cu o clasă, existente în fiecare instanță a sa.

Adăugarea unei metode se poate face tot cu ajutorul wizard-ului. Un click dreaptă pe interfața controlului, apoi "Add Method...". În fereastra care apare imediat, alegem un nume.

După wizard, cum și știm dinainte, codul generat trebuie dat puțin la pilă. În realizarea C++ a interfeței lui Vasile, găsim funcția Afiseaza() și o umplem cu un cod simplu. E de ajuns să folosim doar un apel la MessageBox() în cazul nostru.

void VasileCtrl::Afiseaza() {
::MessageBox(0, m_Mesaj, "Mesaj", MB_OK);
}

Chestia bună este că, după compilare Visual Studio înregistrează automat OCX-urile în sistem. Așa că, un simplu cod în Visual Basic, asociat, de exemplu, cu un buton de pe formă, îl va arăta pe Vasile făcându-și meseria.

Private Sub Command1_Click()
Vasile1.Mesaj = "Aplauze, vă rog!"
Vasile1.Afiseaza
End Sub

Codul presupune că, controlul Vasile1 trebuie pus pe forma înainte. Iar ca să apară acesta pe paletă, la "Components" (Ctrl-T) punem un check lângă "Vasile ActiveX Control module".

Debug

Calcatul de gândaci se face în modul următor. La Project->Settings, tab-ul "Debug" în campul "Executable for debug session" pui numele complet al executabilului mediului de dezvoltare. Dacă ai de gând să folosești controlul în programele scrise în VB, specifici o cale de genul "C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE". După aceea, pui breakpoint-uri și vezi că se oprește la ele atunci când aceste bucăți din cod sunt apelate, fie de mediul de Visual Basic insuși ori de programe scrise în el.

În urmatoarele articole din serie urmează să afli ce sunt evenimentele, precum și să descoperi niște tehnici avansate ale folosirii tehnologei ActiveX. Pe curând!


PC Magazine Ro | CD ROM | Redactia | Abonamente | CautareArhive

Copyright © 1999-2004 Agora Media.

[email protected]

LG - LifeŽs Good

deltafri

Concurs de Grafica Digitala si Web Design

www.agora.ro

www.agora.ro