PROGRAMAREA OBIECTUALĂ UTILIZÂND MICROSOFT VISUAL C++
2.1. Structura generala, meniuri, ferestre, bare de unelte
2.1.1. Introducere
Microsoft Visual C++ este un mediu de programare care suporta dezvoltarea de diferite aplicatii. În continuare vom prezenta acest mediu, insistând mai mult pe lucrurile legate de programarea obiectuala si mai putin pe cele comune unei aplicatii Windows.
Elementele de baza ale mediului Microsoft Visual C++ sunt:
o a spatiului de lucru (workspace)
o de editare
o de raspuns (output)
o de depanare (debug)
2.1.2. Meniurile în Microsoft Visual C++
2.1.2.1. Meniul File (Fisier)
Se pot crea fisiere ASP (Active Server Pages), fisiere binare, fisiere bitmap, fisiere header C++, fisiere sursa C++, fisiere cursor, pagini HTML, icon-uri, macro-uri, resurse (script sau template), fisiere SQL Script, fisiere text.
De asemenea, se pot crea proiecte, cum ar fi: ATL COM, proiecte pentru baze de date, makefile, MFC ActiveX, DLL-uri MFC, executabile MFC, proiecte pentru crearea de baze de date pentru SQL Server, aplicatii Win32, aplicatii consola Win32, DLL-uri Win32, biblioteci statice Win32.
Se pot crea si documente-imagini, diagrame si foi de lucru Excel, prezentari PowerPoint, aplicatii Visual FoxPro, documente Word.
În Microsoft Visual C++ se lucreaza cu spatii de lucru (workspaces). Acestea pot fi vide sau pot contine unul sau mai multe proiecte. Pentru fiecare proiect, Microsoft Visual C++ genereaza un fisier de proiect, numit nume_proiect.dsp. Daca la crearea proiectului alegem sa se creeze un nou spatiu de lucru (figura 2.1), atunci proiectul va contine si fisierul nume_proiect.dsw.
În
lucrarile urmatoare vom lucra în aplicatii-consola Win32.
Pentru crearea unei aplicatii tip
consola, în dialogul File -> New, tab-ul Projects, alegem Win32
Console Application (figura 2.1). În dreapta setam numele si calea
noului proiect.
Putem crea un proiect vid, o aplicatie simpla, o aplicatie "Hello World!" sau o aplicatie care sa suporte MFC (figura 2.2).
o Daca alegem sa cream o aplicatie-consola vida, nu va fi creat sau adaugat nici un fisier sursa sau header la acest proiect.
o Daca cream o aplicatie simpla, se va crea un fisier sursa principal numit nume_proiect.cpp, care contine functia principala (main) si se vor adauga fisierele Stdafx.h si Stdafx.cpp (acestea t 949r1713j rei sunt fisierele initiale cuprinse în proiect). Stdafx.h si Stdafx.cpp sunt fisiere standard folosite pentru a se genera un fisier header precompilat (numit nume_proiect.pch) si un fisier de tipuri precompilate (numit StdAfx.obj). În fisierul sursa principal este generat codul:
#include "stdafx.h"
int main(int argc, char* argv[])
o O aplicatie "Hello World!", este ca si una simpla, cu diferenta ca afiseaza mesajul "Hello World!". Continutul fisierului principal nume_proiect.cpp este:
#include "stdafx.h"
int main(int argc, char* argv[])
o MFC (Microsoft Foundation Classes) este o biblioteca de clase. Pentru o aplicatie care suporta MFC, pe lânga fisierele principale nume_proiect.h si nume_proiect.cpp, fisierele Stdafx.h si Stdafx.cpp, se vor genera si fisierele de resurse Resource.h si nume_proiect.rc. Se genereaza si un fisier nume_proiect.clw (ClassWizard), pentru manipularea claselor existente în proiect. Din mediul de programare, dialogul MFC ClassWizard poate fi apelat din meniul View -> ClassWizard (Ctrl+W). Resource.h este fisierul header standard care defineste identificatorii resurselor. Acest fisier este citit si actualizat de catre Microsoft Visual C++. nume_proiect.rc este o lista cu toate resursele utilizate de program. Lista include si icon-urile, bitmap-urile si cursorii memorati în subdirectorul RES. Acest fisier poate fi editat direct în Microsoft Visual C++.
Acesta contine, pe lânga comenzile uzuale de editare, urmatoarele:
Comenzile de inserare / stergere, activare / dezactivare a punctelor de oprire apar si în meniul contextual al ferestrei de editare pentru fisierele .h si .cpp.
Comanda poate fi lansata si din meniul contextual al ferestrei de editare pentru fisierele .h si .cpp.
Comanda poate fi lansata si din meniul contextual al ferestrei de editare pentru fisierele .h si .cpp.
Comanda poate fi lansata si din meniul contextual al ferestrei de editare pentru fisierele .h si .cpp.
Comanda poate fi lansata si din meniul contextual al ferestrei de editare pentru fisierele .h si .cpp.
Comenzile: Cut, Copy, Paste le gasim si în meniul contextual al ferestrei de editare.
Comanda o gasim si în meniul contextual al ferestrei de editare.
Comanda este disponibila si din meniurile contextuale ale elementelor din fereastra spatiului de lucru si din meniul contextual al ferestrei de editare.
New Class (clasa noua) - adaugarea unei
noi clase în proiect.
În dialogul corespunzator alegem numele noii clase si clasele din care este derivata, precum si tipul de mostenire (private, public, protected).
Implicit, pentru fiecare noua clasa adaugata în proiect, Microsoft Visual C++ adauga doua noi fisiere, unul .h, care contine definitia clasei si declaratiile tuturor membrilor sai, si unul .cpp, care contine definitiile membrilor clasei. Daca vrem ca acestea sa fie în anumite fisiere (noi sau deja existente), putem specifica acest lucru. Comanda este disponibila si din meniul contextual al proiectului.
Daca dorim sa adaugam în proiect o clasa care exista deja (de exemplu, în doua fisiere - unul .h si altul .cpp), va trebui sa adaugam fisierele în proiect (folosind tab-ul FileView din fereastra Workspace). Fisierul .cpp trebuie adaugat în grupul "Source Files", iar cel .h, în grupul "Header Files".
stergerea din proiect a unei clase definita în fisiere proprii .h si .cpp se face din Workspace, tab-ul FileView, prin stergerea fisierelor aferente clasei (cu selectare si Edit -> Delete). Aceasta operatie nu va realiza stergerea fizica a fisierelor, ci doar eliminarea lor din proiect. Desigur, daca clasa este folosita de alte clase, trebuie sa eliminam toate referintele spre ea. stergerea o putem realiza si manual, în special în cazul în care clasa nu are fisiere proprii.
Comanda este disponibila si din meniul contextual al tuturor elementelor din ResourceView, fereastra Workspace.
Adaugarea unei resurse prin duplicarea alteia se poate face în fereastra Workspace, tab-ul ResourceView, selectând resursa de duplicat si folosind apoi Copy si Paste din meniul Edit. Pentru noua resursa se va crea un alt identificator.
New ATL Object (un nou obiect ATL). ATL (Active Template Library) este o colectie de clase bazate pe template C++ cu ajutorul carora se pot crea usor obiecte COM (Component Object Model).
Comanda este disponibila si din meniul contextual al proiectului.
Comanda este disponibila si din meniul contextual al proiectului (Set as Active Project).
o New (nou) - crearea si adaugarea la proiect a unui nou fisier, proiect sau a altor documente - ca si File -> New, doar ca de aici nu se poate crea un nou spatiu de lucru.
Comanda este accesibila si din meniul spatiului de lucru (FileView, fereastra Workspace).
o New Folder (un nou director) - Comanda este activa daca este selectat în fereastra Workspace un element din FileView (nu spatiul de lucru) sau un element din ClassView. Vezi meniul contextual al proiectului - fereastra Workspace, tab-ul ClassView.
o Files (fisiere) - adauga fisiere existente în proiectul selectat si le plaseaza în directorul corespunzator din FileView (fereastra Workspace). Adaugarea într-un anumit director se poate face din meniul contextual al directorului respectiv (FileView).
o Data Connection (conexiune la o baza de date) - adauga o conexiune la o baza de date (pentru proiectele de baze de date).
o Components and Controls (componente si controale) - adauga în proiect componente si controale din galerie (în mod implicit). Se pot adauga controale ActiveX, componente Visual C++ sau clase puse în galerie de utilizator (vezi Add to Gallery din meniul clasei, fereastra Workspace, ClassView).
Un sistem de control al surselor foloseste o baza de date pentru a urmari, organiza si manageriza "proiecte". Aceste proiecte sunt unitati de organizare, ca directoarele, si pot contine diferite tipuri de fisiere (elemente), inclusiv cod si documentatie. Configuratia tipica presupune ca toate fisierele sunt memorate într-o baza de date pe un server, la care se pot conecta cei care participa la dezvoltarea aplicatiei. Astfel se poate mai bine organiza ierarhic aplicatia si controla accesul la fisiere. Comenzile de baza pentru pastrarea fisierelor în baza de date sunt: luarea versiunii curente a unui element (versiunea de pe server este copiata local si are acces doar de citire), adaugarea (comanda accesibila si din meniul contextual al spatiului de lucru si al proiectului), check out (versiunea de pe server este copiata local si poate fi aici modificata, ceilalti dezvoltatori ai aplicatiei lucrând cu varianta veche si având posibilitatea doar de a citi) si check in (actualizarea pe server a variantei luate cu check out si modificate local, iar pentru ceilalti nu mai este accesibila doar pentru citire).
Acesta contine comenzile de compilare si construire a executabilelor, de depanare, de rulare si comenzi de configurare.
Comenzile de depanare din acest meniu sunt:
o Go (porneste)
o Step Into (intra) - porneste debugger-ul în mod pas cu pas
o Run to Cursor (executa pâna la cursor)
o Attach to Process (ataseaza la un proces) - permite depanarea unui proces existent
Comenzile de configurare din meniul Build sunt:
Profilul se activeaza din Project -> Settings, tab-ul Link, categoria General, checkbox-ul Enable Profiling.
Acest meniu nu este vizibil decât în mod debug, când apare în locul meniului Build. Intrarea în mod debug se face din meniul Build -> Start Debug.
Comenzile din acest meniu sunt:
Go (continua) - continua executia pâna la primul breakpoint
Restart (reporneste) - reporneste programul, oprindu-se la începutul lui main
Stop Debugging (opreste depanarea)
Break (pauza) - opreste programul la punctul de executie curent
Apply Code Changes (aplica modificarile din cod) - aplica modificarile facute în mod debug, fara a fi nevoie sa se reporneasca programul
Step Into (pas în) - executa pâna la urmatoarea instructiune. Daca instructiunea curenta este un apel de functie, se va opri la prima instructiune din acea functie.
Step Over (pas peste) - executa pâna la urmatoarea instructiune. Daca instructiunea curenta este un apel de functie, se va opri la instructiunea urmatoare apelului functiei.
Step Out (pas în afara) - executa pâna la instructiunea urmatoare apelului functiei în care ne aflam
Run to Cursor (executa pâna la cursor)
Step Into Specific Function (pas într-o functie specificata)
Exceptions (exceptii) - afiseaza dialogul de exceptii, în care se poate specifica modul de tratare a exceptiilor
Threads (fire de executie) - afiseaza dialogul de fire de executie, în care se pot suspenda, reporni sau pune ca active firele de executie ale programului
Modules (module) - afiseaza lista modulelor mapate în spatiul de adrese al programului curent
Show Next Statement (pozitionare pe urmatoarea instructiune)
Quick Watch (urmarire rapida) - afiseaza fereastra Quick Watch, în care se poate lucra cu expresii
Din acest meniu se pot lansa diferite unelte, se poate personaliza interfata mediului, se pot specifica diferite optiuni (legate de editor, de tab-urile de editare, de depanare, de compatibilitate, de compilare, de directoare, de controlul surselor, de spatiul de lucru, de lucrul cu baze de date, de macrouri, de sistemul de help, de format), se poate lucra cu macrourile.
Acest meniu contine comenzi legate de ferestrele de editare.
Acest meniu contine comenzi pentru facilitarea lucrului utilizatorului. Pe lânga comenzile obisnuite ale unui help, exista si comanda Keyboard Map... care arata tastele asociate diferitelor comenzi si descrierea acestor comenzi.
Pe lânga aceste meniuri, exista si altele specifice fiecarui tip de aplicatie, tip de fisier ce se editeaza etc. De exemplu, când editam o resursa dialog, apare un meniu Layout.
2.1.3. Ferestrele mediului
Ferestrele si barele de unelte ale mediului pot fi facute vizibile / ascunse din meniul contextual al barei cu meniurile (si al ferestrei de editare, când nu avem nici un fisier deschis).
Fereastra
Workspace contine structura arborescenta a proiectelor din
spatiul curent de lucru. Tab-ul ClassView arata structura pe clase
si membrii fiecarei clase, tab-ul FileView arata structura pe
fisiere, iar tab-ul ResourceView arata resursele (daca nici un
proiect din spatiul de lucru nu are resurse, acest tab lipseste).
Meniul contextual al ferestrei Workspace este prezent si în toate celelalte meniuri contextuale din fereastra.
Docking View seteaza modul de afisare a ferestrei
Hide (ascunde) ascunde fereastra
Properties (proprietati) afiseaza informatii despre elementul selectat
ClassView
Comenzile specifice proiectului (în ClassView) sunt: Set as Active Project, New Class, New ATL Object, New Folder, Add to Source Control.
Comanda New Folder (un nou director) se foloseste pentru gruparea în directoare a claselor, în ClassView, respectiv a fisierelor în FileView. În ClassView nu este permisa imbricarea (toate directoarele sunt pe acelasi nivel). În FileView este permisa imbricarea, iar noul director poate fi asociat cu o extensie de fisier.
Comenzile specifice clasei din meniului contextual al clasei (figura 2.8) sunt:
Go to Definition (du-te la definitie) - realizeaza pozitionarea la începutul definitiei clasei, în fisierul .h asociat acesteia (acelasi efect se obtine cu clic dublu pe numele clasei).
Add Member Function (adauga o functie membra) - se foloseste pentru a adauga o metoda clasei. Figura 2.9 prezinta dialogul pentru adaugarea unei metode. Se poate seta tipul accesului, daca sa fie statica, daca sa fie virtuala.
Add Member
Variable (adauga o variabila-membru) - se utilizeaza la
adaugarea unei date clasei. Mai jos este prezentat dialogul pentru
adaugarea unei date.
References (referiri) arata toate referirile la clasa respectiva. Pentru a se putea da acest raport, la compilare se creeaza un fisier .bsc, care va fi plasat în directorul configuratiei active. Fisierul se creeaza doar daca este activat "Generate browse info" în setarile proiectului ce tin de C/C++ (daca nu, atunci nu vor fi disponibile informatii despre referiri).
Daca într-un proiect avem o singura referire la o clasa A, de exemplu: clasa B este derivata din A.
class B : public A
Fereastra de
referiri la A va arata ca cea din figura 2.11. Un clic dublu pe o referire
ne va pozitiona în fisierul respectiv, la linia pe care se afla
referirea.
Derived
Classes (clasele derivate) - arata membrii si clasele derivate pentru
o clasa. În stânga este afisata toata ierarhia de clase
care au ca stramos clasa aleasa. De aici putem alege o alta
clasa (din aceasta ierarhie) pentru care sa se afiseze
membrii si clasele derivate (cu clic pe numele clasei). De asemenea, putem
filtra care membri sa fie afisati, folosind listele ascunse din
partea de sus a dialogului.
si aici, un dublu clic ne pozitioneaza la locatia respectiva.
În exemplul
din figura 2.12, clasele B si DA mostenesc (sunt derivate din) clasa
A, iar DB mosteneste clasa B.
Base Classes (clasele de baza) - este o optiune similara cu cea de mai sus, doar ca în loc de referirile la clasele derivate avem referiri la clasele de baza. Ierarhia de clase din stânga arata clasele de baza (în exemplul din figura 2.13, DB este derivata din B, iar B este derivata din A - altfel spus: B este clasa de baza pentru DB, iar A este clasa de baza pentru B).
Add to Gallery (adauga la galerie) - cu aceasta optiune putem converti clasa în componenta reutilizabila (fisier .ogx). Comanda creeaza în galerie un nou director având numele proiectului, creeaza si pune în acest director componenta definita de utilizator (fisierul .ogx). Fisierul .ogx permite altor aplicatii sa utilizeze clasa adaugata în galerie. Directorul implicit al galeriei este \Program Files\Microsoft Visual Studio\ Common\MSDev98\Gallery
Adaugarea în proiect a unei componente din galerie se face din meniul Project - > Add To Project - > Components and Controls. În dialogul care apare selectam componenta pe care vrem sa o adaugam.
New Folder - aceeasi semnificatie ca la proiect
Group by Access (grupeaza în functie de acces). În mod implicit, membrii claselor sunt grupati astfel: alfabetic metodele, apoi alfabetic datele - aceasta comanda este prezenta si în meniul contextual la membrilor claselor si se aplica tuturor claselor, nu doar celei de unde a fost lansata. Ea sorteaza membrii astfel: dupa acces metodele, apoi dupa acces datele.
Comanda apare si în meniurile contextuale ale membrilor.
Comenzile legate de variabile sunt:
Go to Definition (du-te la definitie) - ne pozitioneaza la definitia datei
References - afiseaza referirile la acea data. De asemenea, cu dublu clic, ne pozitionam la locatia respectiva.
Comenzile legate de functii sunt:
Go to Definition - pozitionare la definitia metodei
Go to Declaration - pozitionare la declaratia metodei
Delete - stergerea metodei. Operatia sterge declaratia metodei, iar definitia (daca exista) este comentata (si selectata - astfel poate fi stearsa usor).
Aceasta comanda este disponibila doar pentru metode.
Set Breakpoint - stabileste un punct de întrerupere la depanare, la începutul metodei.
Comanda este disponibila si din fereastra de editare pentru fisierele .h si .cpp.
References - afisarea referirilor si pozitionarea la ele
Calls - construieste graful functiilor apelate
Called By - construieste graful functiilor apelatoare
FileView
Comenzile specifice spatiului de lucru sunt: Add New Project to Workspace, Insert Project into Workspace, Add to Source Control - vezi meniul Project.
Comenzile specifice proiectului în FileView sunt:
Alte comenzi deja prezentate sunt: New Folder, Set As Active Project, Settings.
Comenzile specifice directoarelor sunt: New Folder, Add Files to Folder (adauga fisiere în director), Settings, Add to Source Control.
Comenzile specifice fisierelor sunt: Open, Compile (apare doar la cele care pot fi compilate), Settings, Add to Source Control.
ResourceView
Acest tab contine resursele proiectului, care pot fi deschise, editate, duplicate, sterse, se pot adauga altele noi, se pot importa unele existente. Microsoft Visual C++ se ocupa de compilarea lor.
2.1.3.2. Fereastra de editare
Aceasta fereastra este cea în care deschidem fisiere (fie independente, fie dintr-un proiect). Aceste fisiere pot fi de multe tipuri. La un moment dat pot fi deschise mai multe fisiere deodata. În functie de tipul fisierului activ (si de alte criterii), avem la dispozitie anumite comenzi.
Comenzile din meniul contextual al ferestrei de editare pentru fisiere sursa si antet sunt:
Insert File into Project (insereaza fisierul în proiect) - insereaza fisierul activ în proiectul ales (dintre cele ale spatiului de lucru curent).
Check In / Check Out - vezi meniul Project -> Source Control.
Open Document (deschide un document)
Go To Definition (du-te la definitie) - pozitionare la definitia elementului pe care se afla cursorul
Go To Reference (du-te la referire) - pozitionare la referirea la elementul pe care se afla cursorul
Insert/Remove Breakpoint (insereaza / elimina un punct de oprire)
Enable Breakpoint / Disable Breakpoint (activeaza / dezactiveaza un punct de oprire)
câteva comenzi de editare (Cut, Copy, Paste, List Members, Type Info, Parameter Info, Complete Word) - vezi meniul Edit.
comenzi din meniul View (Class Wizard, Properties) - vezi meniul View.
2.1.3.3. Fereastra Output (Rezultat)
În aceasta fereastra sunt afisate rezultatele compilarilor, editarilor de legaturi (avertismente, erori, module încarcate), cautarii în fisiere, analizelor de profil, executiilor instructiunilor care scriu în aceasta fereastra, blocuri de memorie alocate si neeliberate de catre program (dupa terminarea executiei) si altele.
2.1.4. Barele de unelte ale mediului
Acestea pun la îndemâna comenzile mai utilizate. Barele de unelte pot fi personalizate. Cele implicite sunt: Standard, Build, Build Minibar, ATL, Resource, Edit, Debug, Browse, Database, Source Control, Wizard Bar.
Probleme propuse
Sa se creeze câte o aplicatie consola de fiecare tip si sa se analizeze fisierele generate si codul generat de catre Microsoft Visual C++ pentru acestea.
Într-o aplicatie consola, sa se studieze comenzile din fereastra Workspace si modul de organizare si reprezentare a elementelor în ClassView, FileView si ResourceView. Sa se experimenteze:
adaugarea de clase, metode, date, obiecte si resurse folosind comenzile mediului Microsoft Visual C++.
adaugarea de clase, metode, date si obiecte direct în fisiere.
adaugarea de clase existente prin includerea în proiect a fisierelor în care sunt implementate acestea.
Sa se realizeze compilarea, construirea executabilului si rularea unei aplicatii consola, apelând comenzile corespunzatoare atât din meniuri, cât si din barele de unelte (Build, Build Minibar).
Sa se depaneze o aplicatie consola, apelând comenzile corespunzatoare folosind atât meniurile, cât si bara de unelte Debug. Sa se urmareasca continutul ferestrelor de depanare.
|