Forme grafice (shapes) si stratul de desen
Visual Basic dispune de un model de obiecte, reprezentând stratul de desen, comun aplicatiilor Microsoft Word, Microsoft Excel si Microsoft PowerPoint. Obiectul cel mai sus în ierarhia acestui model este colectia Shapes, care contine toate obiectele grafice – AutoShapes, forme libere, obiecte OLE, imagini – care pot fi incluse în stratul de desen al documentului. Este de notat ca formele grafice incluse în stratul de text din Word nu sunt incluse în colectia Shapes.
Pentru o discutie mai ampla privind controalele ActiveX, care sunt o categorie speciala de forme grafice, se va vedea capitolul Dialoguri si controale ActiveX.
Observatie. Pentru simplificarea exprimarii se utilizeaza termenul "forma" pentru shape, desi "forma grafica" ar fi mai potrivit în contextul subiectului.
Exista trei obiecte diferite care reprezinta formele: colectia Shapes, reprezentând toate formele din stratul de desen dintr-un document Microsoft Excel, Word sau PowerPoint, colectia ShapeRange, care reprezinta o submultime de forme din stratul de desen si obiectul Shape, care reprezinta o forma grafica individuala. În general, se utilizeaza colectia Shapes atunci când se adauga forme pe stratul de desen sau se parcurg toate formele; se utilizeaza obiectul Shape când se doreste formatarea sau procesarea unei anumite forme grafice si se utilizeaza colectia ShapeRange când se doreste procesarea/formatarea unui grup de forme grafice.
O colectie ShapeRange poate contine oricâte elemente. Daca include un singur obiect, este similara unui obiect Shape. Se poate utiliza o colectie ShapeRange care contine toate elementele din Shapes pentru a formata toate formele în acelasi timp. Proprietatile si metodele care se aplica obiectului Shape se pot aplica de asemenea si colectiei ShapeRange.
O referinta la colectia Shapes se obtine prin proprietatea sinonima aplicata unui obiect document. Exemplul urmator selecteaza toate formele din stratul de desen:
myDocument.Shapes.SelectAllUn obiect Shape poate fi obtinut prin intermediul colectiei Shapes, în modul general de obtinere a unui element dintr-o colectie, dupa unul dintre exemplele urmatoare:
myDocument.Shapes(3).DuplicateFecare forma are un nume atribuit în mod implicit, cum ar fi "Rectangle 3", obtinut la adaugarea formei la colectia Shapes. Prin proprietatea Name se poate atribui un nume sugestiv. Acest lucru se poate realiza concomitent cu adaugarea/crearea formei:
myDocument.Shapes,AddShape(msoShapeRectangle, 144, 144, 72, 72) _Aceasta metoda, care utilizeaza obiectul returnat de metoda AddShape, poate fi utilizata si cu alte proprietati sau metode ale obiectului Shape.
Prin referinte de tipul Shapes.Ranges(index), unde index este fie numele, fie indicele, fie un tablou de denumiri sau de indici, se returneaza o colectie ShapeRange care reprezinta un subset a colectiei Shapes. Exemplul urmator umple formele 1 si 3 din myDocument:
myDocument.Shapes.Range(Array(1, 3)).Fill.PresetGradient _Se utilizeaza Selection.ShapeRange pentru a returna o colectie ShapeRange care reprezinta toate formele din selectie. Prin Selection.ShapeRange(index), unde index este un indice sau un nume de forma, se obtine accesul la un obiect Shape din selectie:
ActiveWindow.Selection.ShapeRange(1).Fill.PresetGradient _Observatie. Macro recorderul genereaza cod bazat pe selectie. Atunci când se scrie cod direct, sau se editeaza codul generat de macro recorder, se poate crea un cod mai eficient prin returnarea formelor direct din colectia Shapes.
Adaugarea unei forme pe stratul de desen se efectueaza printr-una dintre metodele colectiei Shapes dedicate acestui scop. Fiecare tip de forma se obtine printr-o metoda specifica si acestea sunt enumerate în tabelul urmator.
Tipul de forma grafica |
Metoda |
Parametri |
Callout |
AddCallout |
(Type, Left, Top, Width, Height, Anchor) |
Note atasabile (doar PowerPoint) |
AddComment |
(Left, Top, Width, Height) |
Linie sau curba care conecteaza doua forme diferite |
AddConnector |
(Type, BeginX, BeginY, EndX, EndY) |
Curba Bézier |
AddCurve |
(SafeArrayOfPoints) |
Control nativ de formular Excel (doar Microsoft Excel) |
AddFormControl |
(Type, Left, Top, Width, Height) |
Eticheta |
AddLabel |
(Orientation, Left, Top, Width, Height) |
Linie |
AddLine |
(BeginX, Beginy, EndX, EndY) |
Sound sau movie (doar PowerPoint) |
AddMediaObject |
(FileName, Left, Top, Width, Height) |
Control ActiveX (doar Word; pentru Excel si PowerPoint se utilizeaza AddOLEObject) |
AddOLEControl |
(ClassType, Left, Top, Width, Height, Anchor) |
Obiect OLE scufundat sau legat |
AddOLEObject |
(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Left, Top, Width, Height, Anchor) |
Imagine |
AddPicture |
(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height, Anchor) |
Rezervare de loc pentru text sau pentru un obiect grafic (doar PowerPoint) |
AddPlaceholder |
(Type, Left, Top, Width, Height) |
Linie poligonala închisa sau deschisa |
AddPolyline |
(SafeArrayOfPoints) |
AutoShape (forma predefinita) |
AddShape |
(Type, Left, Top, Width, Height) |
TextBox |
AddTextbox |
(Orientation, Left, Top, Width, Height) |
WordArt |
AddTextEffect |
(PresetTextEffect, Text, FontName, FontSize, FontBold, FontItalic, Left, Top, Anchor) |
Titlu de diapozitiv (doar PowerPoint) |
AddTitle | |
Forma libera |
BuildFreeform ConvertToShape |
(EditingType, X1, Y1) |
Între parametri se remarca Left si Top care specifica pozitia formei, Width si Height care fixeaza dimensiunile obiectului grafic. Pentru explicatii suplimentare asupra parametrilor care nu sunt suficient de expliciti se vor studia intrarile respective din Help.
Prin intermediul proprietatilor si metodelor obiectelor Shapes si ShapeRange se pot modifica formele grafice reprezentate. Acestea pot fi repozitionate în document, redimensionate, eliminate; se poate schimba aspectul lor si li se poate adauga text.
Proprietatile si metodele care controleaza atributele si comportarea comune tuturor tipurilor de forme se aplica direct obiectelor Shapes si ShapeRange. Proprietatile si metodele care se aplica doar unor categorii de forme sunt încapsulate în obiecte secundare care se acceseaza prin obiectul Shape.
În aceasta categorie sunt incluse proprietatile care controleaza dimensiunea si pozitia formei (Left, Top, Height, Width) si metode care controleaza comportari generice de editare (cum ar fi Duplicate si Zorder). Un exemplu uzual este
With myDocument.Shapes(1)Atributele specifice unui anumit tip de forma sunt grupate sub obiecte secundare, cum ar fi FillFormat, continând proprietatile care se aplica formelor cu culori de umplere, sau CalloutFormat, continând toate proprietatile baloanelor (callouts). Pentru a lucra cu acest tip de atribute trebuie sa se returneze mai întâi obiectele care le contin. De exemplu, se utilizeaza proprietatea Fill pentru a returna obiectul FillFormat si se poate aplica apoi proprietatea ForeColor:
myDocument.Shapes(1).Fill.FillColor.RGB = RGB(255,0,0)În tabelul urmator sunt prezentate obiectele accesibile din obiectul Shape si care contin proprietatile si metodele specifice. Se remarca faptul ca nu toate denumirile proprietatilor contin cuvântul "Format" existent în obiectul returnat (precum Fill care returneaza FillFormat).
Proprietatea obiectului Shape |
Obiectul returnat |
Aplicabil la |
Callout |
CalloutFormat |
Baloane de dialog |
ConnectorFormat (Excel si PowerPoint) |
ConnectorFormat |
Conectori de forme |
ControlFormat (Excel) |
ControlFormat |
Controale de formular native |
Fill |
FillFormat |
Forme cu culori de umplere (toate cu exceptia liniilor) |
Line |
LineFormat |
Toate formele (LineFormat reprezinta linia sau chenarul) |
LinkFormat |
LinkFormat |
Obiecte OLE legate, imagini legate (doar Word), câmpuri legate (doar Word) |
OLEFormat |
OLEFormat |
Obiecte OLE |
PictureFormat |
PictureFormat |
Imagini si obiecte OLE |
Shadow |
ShadowFormat |
Toate formele |
TextEffect |
TextEffectFormat |
Obiecte WordArt |
ThreeD |
ThreeDFormat |
Forme care pot fi reliefate |
WrapFormat (doar Word) |
WrapFormat |
Forme care pot fi înconjurate de text |
Încercarea de a returna obiecte secundare (cum ar fi CalloutFormat, ConnectorFormat, OLEFormat, PictureFormat sau TextEffectFormat) dintr-un tip inadecvat de forma produce eroare. Pentru alte obiecte (FillFormat, LineFormat, ShadowFormat sau ThreeDFormat) nu se produce eroare chiar daca forma container nu suporta obiectul returnat.
Pentru a nu avea probleme se va utiliza proprietatea Type si, când este aplicabila, proprietatea AutoShapeType, înainte de aplicarea unei metode sau proprietati specifice si se va introduce o secventa de tratare a erorii.
For Each sh In myDocument.ShapesPrin culorile de umplere se întelege nu numai culoarea efectiva utilizata pentru colorarea suprafetei formei ci si efectele utilizate la colorare, precum si posibilitatea de a utiliza o imagine drept fundal etc. Obiectul FillFormat reprezinta întreaga umplere a formei, proprietatile si metodele sale permit stabilirea culorii, tipului, transparentei. Deoarece atributele legate de culori si tipuri de umplere sunt interdependente, stabilirea unui atribut produce, de regula, modificari ale altor atribute, astfel încât sa se obtina o multime consistenta de atribute. Din acelasi motiv multe atribute sunt read-only, valorile lor fiind atribuite în functie de metodele utilizate.
Tipul de umplere se stabileste printr-una dintre metodele Background (doar PowerPoint), OneColorGradient, Patterned, PresetGradient, PresetTextured, Solid, TwoColorGradient, UserPicture sau UserTextured, corespunzând optiunilor disponibile în interfata utilizator a aplicatiilor. Prin proprietatile read/write BackColor, ForeColor, Transparency si Visible se poate controla aspectul umplerii.
Deoarece sunt foarte multe valori predefinite pentru proprietati sau argumentele metodelor, valorile respective se vor lua din intrarile Help corespunzatoare obiectelor implicate.
Urmatorul exemplu adauga o forma dreptunghiulara la document, fixeaza cele doua culori si tipul de gradient pentru umplere:
Public Sub fil()Proprietatea Shadow a obiectului Shape returneaza un obiect ShadowFormat prin care se controleaza umbririle formei. Urmatorul exemplu produce adaugarea unei umbre albastre semitransparente, cu dimensiune de 4 puncte:
With sh.ShadowProprietatea ThreeD a obiectului Shape returneaza un obiect ThreeDFormat care controleaza reliefarea formei. Urmatorul exemplu adauga efectul de extrudare si precizeaza o adâncime de 50 de puncte, purpurie, perpendiculara si luminata de sus
Este normal ca acest efect sa nu fie suportat de anumite forme.
Zona din interiorul unei forme care poate contine text este numita cadru cu text, text frame, si este reprezentata de un obiect TextFrame. Acest obiect, returnat de proprietatea TextFrame, contine textul propriu-zis, precum si proprietatile si metodele care controleaza alinierea si ancorarea cadrului cu textul.
Doar formele built-in de tip AutoShapes bidimensionale au asociate cadre cu text. Înaintea referirii obiectului TextFrame se verifica disponibilitatea acestuia prin proprietatea HasTextFrame (valabila în PowerPoint) sau prin verificarea proprietatii Type. Se poate utiliza si tratarea erorilor în cazul în care proprietatea TextFrame poate fi aplicata unui obiect care nu o suporta.
În Microsoft Word se utilizeaza proprietatea TextRange a obiectului TextFrame pentru a returna un obiect Range care reprezinta textul din cadrul respectiv:
ActiveDocument.Shapes(1).TextFrame.TextRange.Text = " … "În Microsoft Excel se utilizeaza proprietatea Characters a obiectului TextFrame pentru a returna un obiect Characters care reprezinta textul din interiorul cadrului:
ActiveWorksheet.Shapes(1).TextFrame.Characters.Text = " … "În PowerPoint, se utilizeaza proprietatea TextRange a obiectului TextFrame pentru a returna un obiect TextRange care reprezinta domeniul textului din cadrul respectiv:
ActivePresentation.Slides(1).Shapes(1).TextFrame.TextRange.Text = " … "Proprietatile si metodele obiectului OLEFormat, cum ar fi Activate si DoVerb, controleaza obiectul OLE continut într-o forma. Obiectul OLEFormat este returnat de proprietatea OLEFormat a obiectului Shape:
With myDocument.Shapes(3)Utilizarea proprietatii Object a obiectului OLEFormat returneaza obiectul OLE continut în forma desenata specificata (în Excel trebuie sa se utilizeze de doua ori proprietatea Object într-o linie, separate de operatorul punct, pentru a returna obiectul OLE).
Urmatorul exemplu, executat din Word sau PowerPoint, adauga text la celula A1 a primei foi de calcul dintr-un caiet Excel continut în forma a treia din myDocument.
With myDocument.Shapes(3)Proprietatea Application a obiectului OLE, returnat de proprietatea sinonima, da acces la obiectul din vârful ierarhiei modelului de obiecte al aplicatiei care a creat obiectul OLE. Urmatorul exemplu, executat din Microsoft Excel (se va remarca dubla utilizare a proprietatii Object), afiseaza numele aplicatiei în care a fost creat fiecare obiect OLE scufundat în foaia activa:
For Each s In ActiveSheet.ShapesPentru a lucra cu mai multe forme se poate parcurge o colectie Shapes sau ShapeRange si lucra cu fiecare element al colectiei sau se poate construi o colectie ShapeRange cu toate formele grafice care se prelucreaza si se aplica metode sau proprietati întregii colectii ShapeRange.
Exista si posibilitatea, disponibila în interfata utilizator, de a grupa mai multe forme grafice, precum si posibilitatea de aliniere a formelor.
Daca operatiunea dorita se poate executa în interfata utilizator pe o selectie multipla de forme grafice, atunci construirea unei colectii ShapeRange este recomandata.
Daca operatiunea nu se poate efectua în interfata utilizator pe o selectie multipla, atunci parcurgerea unei colectii, Shapes sau ShapeRange, este calea adecvata. Parcurgerea poate fi efectuata printr-o structura uzuala For Each … Next:
For Each sh In myDoc.ShapesDaca este necesara obtinerea unui domeniu de forme care sa contina doar forme de anumite tipuri, se va utiliza o instructiune conditionala de testare a atributelor si se va adauga denumirea sau indicele formei selectate la un tablou dinamic. Se va construi apoi un obiect ShapeRange utilizând acest tablou.
Urmatorul exemplu construieste un domeniu de forme cu toate formele de tip AutoShapes din document si apoi le grupeaza.
With myDocument.ShapesAtunci când se aplica proprietati sau metode colectiei ShapeRange, se va tine seama de urmatoarele principii:
Aceste principii actioneaza si atunci când se lucreaza cu proprietati sau metode ale formelor, grupate în obiecte secundare ale colectiei ShapeRange (cum ar fi FillFormat).
Urmatorul exemplu construieste un obiect ShapeRange din doua forme numite si aplica ambelor o umplere de tip gradient.
Set myRange = myDoc.Shapes.Range(Array("Big Star", "Little" Star"))Metodele Align si Distribute sunt utilizate pentru alinierea sau distribuirea uniforma a formelor dintr-o colectie ShapeRange. Prin metoda Zorder se poate modifica ordinea pe Z care determina ordinea de suprapunere a formelor.
Metoda Group realizeaza gruparea tuturor formelor dintr-o colectie ShapeRange. Prin Ungroup, Regroup se realizeaza operatiunile sinonime din interfata utilizator.
Daca se doreste lucrul cu o forma individuala dintr-un grup, dar fara a renunta la grupare în prealabil, se utilizeaza proprietatea GroupItems a obiectului Shape care reprezinta grupul. Proprietatea returneaza un obiect GroupShapes si metoda Item a acestui obiect returneaza o forma individuala din grupul de forme:
With myDocument.Shapes
|