Sunteți pe pagina 1din 57

Ministerul Educatiei al Republicii Moldova Universitatea Tehnica a Moldovei Facultatea de Radioelectronica i Telecomunicatii Catedra CPAE

Lucrarea de curs
La disciplina: Ingineria soft Tema: Crearea unei aplicatii software multimedia redactor grafic

A efectuat Studentul grupei SER-091

Barbovschi A.

A verificat Lector superior

Ichim I.

Chiinau 2012

Cuprins 1. Introducere ....................................................................................................... 3 2. Abordarea problemei proiectului ............................................................... 4 2.1. Notiuni generale ....................................................................................... 4 2.1.1. Primitivele i functionalitatea .................................................... 5 2.1.2. Mediul de lucru ........................................................................... 5 2.2. Programe paint analoage.......................................................................... 6 2.2.1. Microsoft Paint ........................................................................... 6 2.2.2. Paint.Net ..................................................................................... 7 2.2.3. Pixia ............................................................................................ 9 2.3. Cerinte fata de program ......................................................................... 10 3. Ciclul de viaja al programului ................................................................... 11 3.1. Notiuni generale ..................................................................................... 11 3.2. Etapele de viata a unui produs soft ........................................................ 11 3.3. Diagrama ciclului de viata a aplicatiei elaborate ................................... 14 4. Descrierea algoritmului de elaborare a programului .......................... 15 4.1. Pregatirea mediului de programare pentru lucru ................................... 16 4.2. Aranjarea obiectelor pe forme ............................................................... 17 4.3. Declararea functiilor i descrierea lor ................................................... 22 4.4. Descrierea fiierului header Unt1.h ....................................................... 29 Concluzie .............................................................................................................. 31 Bibliografie .......................................................................................................... 32 Anexa 1 ................................................................................................................. 33 Anexa 2 .................................................................................................................. 52 Anexa 3 ................................................................................................................. 53

CPAE 525.1 091 01 ME


Mod. Coala Elaborat. Controlat Contr. STAS document. Barbovschi A. Ichim I. Semnat. Data Lit. Coala Coli

Crearea unei aplicatii software multimedia redactor grafic

56

UTMFRTgr. SER-091

Aprobat

1. Introducere n ultimul timp a crescut brusc interesul fata de programare, fapt generat de patrunderea tehnologiilor informational n viata de zi cu zi. Daca cineva are de afacere cu calculatorul, mai devreme sau mai trziu, la dorinta proprie sau de nevoie, va ncerca sa programeze. Dezvoltarea rapida a tehnicii de calcul, necesitatea unor medii efective de scriere a aplicatiilor, au dus la aparitia unor sisteme de programare rapida bazate pe tehnologia RAD (Rapid Application Development), ce are ca fundament tehnologia programarii vizuale i de eveniment. Ce reprezinta acest mod de programare? Programarea vizuala sau "OOP" ("Object Oriented Programming") are la baza ideea unificarii datelor cu modalitatile de prelucrare a acestora i manevreaza entitati reprezentate sub forma de obiecte: obiect = date + cod de tratare a acestor date Programarea obiectuala ofera posibilitati de modelare a obiectelor, a proprietatilor i a relatiilor dintre ele, dar i posibilitatea de a descompune o problema n componentele sale (soft mai mentenabil, adaptabil, reciclabil). Cteva exemple de limbaje de programare orientata obiect: SIMULA (1965), SIMULA-2 (1967), Smalltalk, C++, Java (n plus, Java poate fi considerat un limbaj de programare orientata eveniment). Facilitatile oferite de programarea orientata obiect (conform lui Pascou) sunt: 1. Abstractizarea datelor; 2. Motenirea; 3. ncapsularea (ascunderea) informatiei; 4. Legarea dinamica ("trzie").

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

In fine, mediul de programare ia asupra lui o parte mare a rutinei, iar programatorului nu-i ramane decat sa elaboreze ferestrele de dialog i sa scrie functiile de prelucrare a evenimentelor. In lucrarea data programul se va proiecta in mediul soft C++ Builder 6, elaborat in 2006 de compania Borland Inc. Versiunea 6 are un ir de noi implementari fata de versiunile precedente 4 i 5. Printre acestea putem enumera: - posibilitatea crearii programelor cross-platform, ce pot fi rulate atat pe Windows cat i pe Linux; - noi tehnologii de acces la date; - noi componente i metode de lucru cu acestea. 2. Abordarea problemei proiectului 2.1. No^iuni generale Editorul de imagini este un program care permite desenarea cu mouse-ul pe ecranul calculatorului, salvarea acestui desen intr-un fiier pe disc, modificarea i tiparirea lui. Programele pentru desenare pot sa lucreze in grafica de pixeli (bitmapped graphics) sau in grafica vectoriala (vector graphics). Daca programul lucreaza in grafica de pixeli atunci imaginea se realizeaza din puncte (pixeli), care de fapt sunt nite dreptunghiuri foarte mici. Pentru fiecare pixel al desenului se memoreaza codul de culoare. Un avantaj al acestei grafici este ca imaginea creata din puncte poate sa contina foarte multe detalii, insa cand dimensiunea desenului se modifica el pierde din calitate. Marind foarte mult conturul desenului acesta apare in trepte (efectul de "dinti de fierastrau"), iar daca se micoreaza foarte mult punctele ajung sa se suprapuna. Un alt dezavantaj al acestui tip de grafica este dimensiunea foarte mare a fiierului in care se memoreaza desenul. Cu cat desenul este mai mare cu atat el contine mai multe puncte pentru care trebuie sa se memoreze codul de culoare, iar cu cat se folosesc mai multe culori in realizarea desenului, cu atat sunt necesari mai multi biti pentru memorarea culorii pentru fiecare pixel.
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

Exemplu: Daca se folosete o paleta de 16 (24) culori, pentru fiecare pixel din desen sunt necesari patru biti pentru culoare, iar daca se folosete o paleta de 256 (28) de culori sunt necesari opt biti de culoare. n al doilea exemplu, din cauza maririi numarului de culori, necesarul de suport pentru memorarea desenului se dubleaza. 2.1.1. Primitivele i funcjionalitatea Pentru crearea imaginilor n editorul de imagini se folosesc instrumente" rigla (linia"), dreptunghi, cerc, elipsa .a. Astfel de instrumente care permit crearea figurilor simple se numesc primitive grafice" Aceste sunt cele mai simple elemente din care se compune imaginea. Pentru a ntrebuinta un instrument este necesar de ales primitivul grafic" corespunzator i de micat cursorul n punctul dorit al ecranului unde este necesar de creat figura aleasa. Functiile tuturor editoarelor de imagini sunt aproximativ identice. Ele permit utilizatorului: - de creat imagini din primitivele grafice; - de aplicat la desenare diverse culori i perii" (adica de folosit linii de diversa largime i configurate); - de taiat" imaginile sau partile lor, de pastrat temporar n memorie tampon (buzunar") sau de pastrat pe suporturi externe; - de deplasat un fragment al imaginii pe ecran; - de a ncleia" o imagine cu alta; - de marit fragmentul imaginii pentru a vizualiza detalii marunte; - de adaugat la imagini text. Multe editoare de imagini permit de asemenea de a crea animatie de calculator, adica de a crea la calculator imagini n micare. 2.1.2. Mediul de lucru Mediul de lucru a editorului de imagini const din trei prti principale. Partea instrumental - set de pictograme care reprezint instrumentele. De
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

obicei aceasta sunt peria" pentru crearea liniilor de configuratie aleatoare, rigla" pentru crearea liniilor drepte, cerc", dreptunghi", elipsa" pentru crearea figurilor corespunzatoare, radiera" pentru tergerea imaginilor, rola" pentru colorarea figurilor, foarfece" pentru taierea fragmentelor de imagini. Alta parte a mediului paleta pentru alegerea culorii imaginii. i in fine, partea a treia - meniul de comenzi a editorului. Aceste parti ale mediului sunt situate de obicei la marginile ecranului. Partea centrala a ecranului este destinata pentru campul de lucru (sau cum se mai spune panza"), pe care creeaza imagini. Editor de imagini are, ca regula, urmatoarele regimuri de baza de lucru: regimul de selectare i setare a instrumentului, regimul de selectare a culorii, regimul de lucru cu imaginea (desenarea i redactarea), regim de lucru cu dispozitive externe. Creand imagini pe ecranul calculatorului se poate nu numai de a le desena singur, dar i de folosit alte imagini, de exemplu fotografii, imagini din carti etc.
5

2.2. Programe paint analoage 2.2.1. Microsoft Paint Paint este o caracterstica din Windows care se poate utiliza pentru a desena, colora K edita imagini. Paint se poate utiliza precum un caiet de schite digital, pentru a crea imagini simple, proiecte creative, sau pentru a adauga text K grafica altor imagini, cum ar fi cele facute cu aparatul foto digital. Acest program cunoscut i de incredere este acum mai uor de utilizat i, de asemenea, mai distractiv. Noile pensule" digitale cu aspect realist din Paint vor trezi la viata imaginile dvs., in stil de acuarela, creion i caligrafe. i o noua panglica, faia aflata de-a lungul ferestrei care arata ce poate face un program, afieaza optiunile intr-un mod mai deschis decat apareau in meniuri. De asemenea, Paint este pregatit acum i pentru tehnologia tactila, deci, daca aveti un computer cu ecran tactil, veti desena in curand cu degetul, direct pe ecran. Este posibil chiar sa utilizati doua degete pentru a urmari doua trasaturi separate.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

Fig. 1 Programul Microsoft Paint 2.2.2. Paint.Net Paint.Net este un program gratuit de editat poze, cu o interfat simpl i uor de folosit. Evident, nu se poate compara cu Photoshop, dar include cele mai importante functii pentru categoria de aplicatii din care face parte.

Fig. 2 Programul Paint.Net


Coala Mod. Coala document. Semnat. Data

CPAE 525.1 091 01 ME

Layere Unul din laturile lui Paint.Net este lucrul cu layere. Putine programe de prelucrat imagini gratuite includ suport pentru layere. Utilizarea acestei facilitati nu ridic dificultati nici pentru utilizatorii inceptori, nici pentru cei care au lucrat cu Photoshop. Principiul de lucru cu layere este asemntor functiei similare din Photoshop. La fel ca Photoshop, gestionarea layerelor in Paint.Net se face pe baza unei mici ferestre in care acestea sunt afiate unul sub altul. Ordinea din fereastra respectiva este i ordinea in care acestea se vor suprapune in imagine. Instrumente Paint.Net include cele mai importante instrumente pentru modificarea pozelor: selectie (inclusiv Magic Wand pentru selectarea rapid a unui obiect), pensul, gradient, radier, color picker, clone stamp etc. Chiar dac nu ofer aceeai functionalitate ca cele din Photoshop, in cele mai multe cazuri, aceste instrumente sunt suficiente pentru utilizatorii obinuiti care urmresc imbunttirea calittii unei poze sau modificarea anumitor aspecte. De exemplu, functia de selectare permite adugarea sau eliminarea din selectie a unor zone. Efecte Paint.Net ofer i numeroase efecte care pot fi aplicate pozelor. De la efecte artistice (Oil Painting, Ink Sketch etc.) la distorsionri, utilizatorul are suficiente mijloace prin care ii poate lsa amprenta asupra imaginilor. Exist, bineinteles, posibilitatea reglrii sau modificrii atributelor imaginilor: culoare, saturatie, contrast etc. Reglrile se pot face atat manual, cat i automat.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

Chiar dac nu se poate compara cu Photoshop sau cu alte aplicatii similare, Paint.Net este o solutie pentru utilizatorii care nu urmresc realizarea unor operatiuni complexe. n plus, este gratuit i foarte uor de folosit. 2.2.3. Pixia Creat de Isao Maruoka, Pixia este un program gratuit de prelucrare a graficii i imaginii digitale, ce ruleaz numai pe platforma Microsoft Windows. Initial, a fost proiectat exclusiv pentru desenatorii din comunitatea anime, ns n timp, a fost utilizat tot mai des, n mai multe domenii de activitate. n afar de interfata
' S

original n limba japonez, softul mai este disponibil n englez, francez, italian, spaniol, maghiar, chinez simplificat i traditional, polonez, coreean i german. Pixia - [C:\Dokumente und EinsteLlungenUU Users\Dokumente\Eigene Bilder\Bei5pielbilder\S0nnenuntergang.jpg [LAYERO] of Standard Accuracy] [~|| |^~|[n"|fx"| hi JJJJ 7 M
D File Edit Selection Paint Image View Window Help

"H S

m pii

und Einstellungen All UsersDokumente Eigene Bi...] [800x600 pixels] [24 bits]

Fig. 3 Programul Pixia

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525. l O9l Ol ME

Odat cu Pixia 2.6, programul a oferit suport nu numai pentru spatiul de culoare RGB (Red, Green, Blue) ci i pentru CMYK (Cyan, Magenta, Yellow, blacK - culorile principale folosite la tipar). Ultima versiune aprut este 4.2. (iunie 2008), i se poate descrca gratuit, n mai multe limbi strine, de aici. Utilizatorul are la dispozitie mai multe instrumente pentru a realiza o lucrare de exceptie, cum ar fi: efecte ale imaginii i graficii (transparente, strlucire, contrast, umbre, degrade-uri), lucrul cu straturi (layers), filtre (filters), canale (channels), mti (masks), pensule (brushes), iar interfata intuitiv este uor de folosit att pentru mceptori ct i pentru avansati. Cu Pixia se pot crea, edita, vizualiza i exporta finiere cu extensiile BMP, JPG, JPEG, PSD (formatul pentru Adobe Photoshop), TGA, TIF, TIFF, WMF, precum i PXA - fiierul standard al Pixia, ms nu lucreaz cu fiierele n format GIF. De asemenea, pentru a veni n ajutorul desenatorilor, programul este compatibil cu tabletele grafice Wacom. ncepnd cu versiunea Pixia 4, programatorii recomand instalarea programului numai pe Microsoft Windows Me, 2000, XP i Vista, deoarece s-ar putea s apar probleme pe variantele Windows 95, 98 i NT. Fie c creati un desen sau prelucrati o imagine digital, aplicatia Pixia v ofer cam tot ce aveti nevoie pentru ca documentul s arate excelent la final. 2.3. Cerinje fa$ de program Deci, n lucrarea de fat am hotrt s scriu un program dotat cu urmtoarele functii i posibilitti: - platforma de rulare este Microsoft Windows Millenium, 2000, XP, Vista, 7; - format imagini: *.bmp; - este dotat cu un sistem complex de pstrare (programul nu permite pierderea modificrilor nesalvate); - lucrul cu culori este unul flexibil (este accesibil o palet de culori preselectate, 2 culori de baz, posibilitatea de a seta culoarea de pe orice punct al imaginii i pe orice punct al imaginii);
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

10

- un set de primitive grafice (linie dreapt, linie aleatoare, dreptunghi cu/fr umplere, elips cu/fr umplere); - instrument pentru tergerea fragmentului dorit al imaginii (radiera); - instrument pentru deplasarea/copierea fragmentului dorit al imaginii; - instrument pentru nserarea textului (cu posibilitatea setrii parametrilor fontului); - mecanismul de amnare a ultimelor modificri; - un manual. 3. Ciclul de viaj al programului 3.1. No^iuni generale Un produs soft, la fel ca i oricare produs, trece printr-o serie de faze, de la productie pn la ieire din circulatie. n principiu fazele prin care trece o aplicatie software sunt similare cu cele ale oamenilor, astfel: gestatia, copilria, maturitatea i sfritul vietii. 3.2. Etapele de via^ a unui produs soft - Pre-Alpha (gestatia). Aceast faz cuprinde toate activittile efectuate nainte ca proiectul software s mceap testele (analizarea cerintelor, design software, scrierea propriu-zis a programului i verificarea buctilor componente ale acestuia). n mediul programatorilor open source" exist mai multe tipuri de versiuni pre-alpha. - Alpha (naterea i copilria timpurie). Faza alpha este caracterizat de nceperea testrii aplicatiei n ansamblu acesteia n conditii de mediu controlate, fiind realizate dou tipuri de teste: - Testele folosind tehnologii white box" n care programul este supus de ctre dezvoltatorii acestuia unor teste generale de functionalitate; practic se verific dac programul tie s fac ce a fost proiectat n conditii ideale de mediu (input corect); aceast sub-faz este cunoscut i sub denumirea de private beta";

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

11

- Testele folosind tehnologii black box" sunt efectuate de catre o alta echipa care in esenta incearca sa determine reactiile programului la inputuri mai putin ortodoxe; pana la testarea black box", toate celelalte faze se petrec in cadrul organizatiei care planifica i produce programul; odata cu inceperea testelor black box" programul primete denumirea de versiunea alpha" i poate fi pus la dispozitia publicului doritor sa-1 testeze. Versiunile alpha de software sunt deseori instabile i pot genera inghetari a sistemului de operare i/sau pierderi a datelor. Faza alpha se termina de obicei cu o inghetare a caracteristicilor" care indica faptul ca nici o alta caracteristica nu va mai fi adaugata acestuia. - Beta (adolescenta). Faza din ciclul de viata al unui program software care urmeaza dupa alpha i este denumita dupa litera beta din alfabetul grecesc. De obicei incepe cand programul este inghetat din punct de vedere al caracteristicilor i are ca principal scop masurarea impactului acestuia asupra utilizatorilor finali i teste de usability. Utilizatorii versiunilor beta sunt de regula clienti sau potentiali clienti ai programului, dornici sa testeze aplicatia gratuit sau pentru o mica taxa. Este probabil ca versiunile beta sa fie folosite pentru demonstratii interne i previzualizari. Unii dezvoltatori sau programatori denumesc aceasta etapa avanpremiera, prototip, previzualizare tehnica sau acces timpuriu. - Open beta i closed beta. Dezvoltatorii programelor lanseaza fie o versiune open beta" ori o versiune closed beta": versiunile open beta sunt destinate unui grup mai mare de utilizatori (in general publicului larg) in timp ce versiunile closed beta sunt disponibile doar unui anumit grup de indivizi. Utilizatorii versiunilor beta raporteaza orice bug pe oare-l identifica i uneori sugereaza anumite caracteristici pe care i-ar dori ca programul sa le aiba in forma finala. - Release candidate (majorul). Termenul de release candidate (RC) se refera la o versiune care are potential de a deveni produsul final, gata de a fi lansat duca nu sunt identificate comportamente fatale sau erori grave de programare. In unii 1990 Apple obinuia sa foloseasca termenul de golden master" pentru versiunile release candidate ale propriilor programe, Alte litere din alfabetul grecesc cum ar fi gamma i delta sunt folosite uneori pentru a indica versiuni cure sunt in faza

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

12

avansat de perfectionare dei se afl inc in tesle iar literele omega i zenith sunt folosite pentru a indica versiuni care se afl in ultimele teste, sunt considerate a fi fr bug-uri i pot intra in productie O versiune primete denumirea code complete cand echipa dezvoltatorilor se pune de acord ca nu va mai fi adugat cod-surs nou programului, dei ar putea exista schimbri ale codului sursa in vederea reparrii unor erori. - RTM (Release - varsta maturittii). Termenele release to manufucturing" sau "release to marketing" (ambele prescurtate RTM) - sunt folosite pentru a indica c programul a atins un nivel satisfctor de calitate i este gata pentru distributia in mas fie prin mijloace electronice sau prin suporti fizici media. RTM inseamn de regul c programul a fost lansat pe piat, dar nu este disponibil i pentru ceilalti productori de hardware i software care s-i poat astfel ajusta specificatiile propriilor produse in conformitate cu acesta. Faza RTM se intampl de obicei inaintea celei de general availability" (disponibilitate general), cand un produs este fcut disponibil publicului larg. - General availability (disponibilitate general). Reprezint momentul in care toate activittile necesare comercializrii programului au fost finalizate i acesta este disponibil intregii piete fie prin web sau prin medii de stocare fizice. - Suport. Dup intrarea produsului in faza GA, acesta mai poate primi unele imbunttiri prin intermediul aa-numitelor service-packs. Un exemplu foarte cunoscut este cel al lui Microsoft Windows XP care a primit pan in prezent 3 Service Packs sau Service Pack 1 Beta pentru Windows 7. Service-Pack-urile sunt nite colectii de actualizri, patch-uri i/sau extinderi a functionalittii livrate sub forma unui singur fixier instalabil, Acestea pot contine de asemenea i noi caracteristici. - End of life (sfritul vietii). Cand un program nu se mai gsete in vanzare sau compania car 1-a produs nu mai ofer suport pentru acesta, se spune c a ajuns la sfaritul vietii.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME


Testing and development period

13

Pre-Alpha (development releases, nightly builds)

i
Alpha Beta

I
Release Candidate

I
RTM (Release to Manufacturing, Release to Marketing) GA (General Availability)

Release perod

Fig. 4 Ciclul de viata a unui produs soft 3.3. Diagrama ciclului de viaja a aplicafiei proiectate Programul nostru se ncepe cu o nevoie nesatisfcuta (necesitatea de a ndeplini lucrarea de curs) i, contientiznd-o este necesar de a efectua analiza sistematica pentru determinarea scopurilor viitorului produs soft i cerintelor fata de el. Urmatoarea etapa este specificarea externa, destinata pentru crearea ideologiei" programului - orientare generala n proiectare ulterioara, inclusiv aparenta programului i instructiunile de utilizare a programului. La etapa de proiectare produsul soft este specificat n volum deplin, de la formularea problemei pna la proiectul de lucru cu descrierea structurii interne a programului. Apoi are loc codare i testare, n rezultatul carora apare versiunea finala a programului. Programa este lansata n circulatie (n cazul de fata n reteaua
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

14

social) i sustinut (acordarea suport-ului) de catre productor (n cazul de fat chat).

Sustinerea const ct n eliminarea erorilor care se depisteaz n procesul exploatrii i lansarea versiunilor corectate, ct i n perfectionarea versiunii de baz, ce deseori conduce la reproiectarea programului i lansarea versiunilor radical rennoite. Finisarea ciclului de viat este determinat de ncheierea
S

exploatrii programului. Dar ideile propuse n procesul exploatrii a programului sunt deseori utilizate la crearea urmtorului produs, mai perfect i modern. Terminarea exploatrii de obicei nu reprezint un act de moment de exterminare a programului n calculator, dar perioada de timp n care unele organizatii sau unii utilizatori mai continue a utiliza programul.

Fig. 5 Ciclul de viata al produsului soft elaborat 4. Descrierea algoritmului de elaborare a programului Dupa cum s-a mentionat, programarea OOP consta in crearea unor obiecte ce reflecta lucruri i evenimente din viata reala i crearea unor metode de actiune asupra lor utilizand un limbaj de programare.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

15

ntreg algoritmul consta din nite pai consecutivi pe care ii voi descrie succint in continuare. 4.1. Pregtirea mediului de programare pentru lucru Deschidem programul C++ Builder 6 prin intermediul shortcut-ului respectiv, sau din meniul Start. In fereastra deschis apsam File -> New -> Application. Pe ecran vom avea urmtoarele ferestre:
Builder 6 - Projectl File Edit Search View Project Run Component Database lools Window Help |<None>

sB - 0 \J\S

Standard Additional] Win32] System ] Data Access] Data Controls dbExoress ] DataSnao] BDE | ADO InterBase WebServices 1 Inter netExoress ] Internet] WebSnao ] FastNet] De 1

HT

ra i i* M m J5

Anchors AutoS croll AutoS ize BiDiMode EBorderlc ons B orderS tyle BorderWidth __ 0 Caption ClientHeight ClientWidth Color Qcl BtnFace 0 Constraints (TSizeConstrain Ctl3D Cursor DefaultMonitor All shoi true crDelault dmActiveForm Fornnl 1466 862

Fig. 6 Ferestrele mediului C++ Builder 6 cu suprafata de lucru Forml

Suprafata de proiectare este Forml, anume pe ea se amplaseaz obiectele aplicatiei n modul corespunztor. Apsnd dublu-click pe oricare obiect se deschide fereastra de redactare a evenimentelor respective, unde putem declara i descrie functii, adic modul n care reactioneaz obiectul respectiv la careva eveniment, spre exemplu click. Obiectele sunt amplasate pe Paleta de obiecte n partea de sus a ferestrei principale. Ele sunt grupate conform unor trsturi specifice n taburi.

Coala

CPAE525.1 091 01 ME
Mod. Coala N document Semnat. Data

16

La stnga jos avem o fereastr numit Object Inspector unde sunt descrise propriettile obiectului ales i evenimentele acestuia. Mai sus este fereastra Object Tree View unde sunt afiate clasele de obiecte i subcategoriile acestora. n cazul dat avem o singur clas Forml. 4.2. Aranjarea obiectelor pe forme 4.2.1. Aranjarea obiectelor pe forma Forml Pe suprafata de lucru Forml aranjm urmtoarele componente dup cum este artat n fig. 7:

Fig. 7 Aranjarea componentelor pe forma Forml Unele componente, ca spre exemplu Edit2, Edit3, Edit5, Edit6, Edit7, Edit8, Edit9, sunt invizibile in timpul rulrii aplicatiei, altele, ca spre exemplu OpenPictureDialogl, SavePictureDialogl, FontDialogl sunt vizibile doar la
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

17

apelarea la ele, iar restul sunt permanent vizibile, astfel ca un utilizator obinuit poate s actioneze asupra lor n mod direct, spre exemplu click pe buton. Componentele trebuie aranjate astfel nct fereastra aplicatiei s aib un aspect ergonomic i intuitiv, adic utilizatorului s-i fie uor de navigat, i s nu ntlneasc careva probleme n timpul utilizrii aplicatiei. Cifrele din imagine reprezint componentele: 1. SBBrush - permite de a colora o regiune dorit de pe spatiul de lucru; 2. SBPen - cu ajutorul lui putem desena o linie de configuratie aleatoare; 3. SBRect - instrument pentru deplasarea/copierea unei regiuni dreptunghiulare de pe spatiul de lucru; 4. SBErase - radier care terge orice fragment de pe pnz; 5. SBLine - deseneaz o linie dreapt; 6. MainMenul - componentul dat creaz meniul pe care l putem accesa n partea de sus a aplicatiei;

Fig. 8 Componentul MainMenul (afiarea submeniului File)

7. OpenPictureDialogl - fereastra de dialog care ne permite sa deschidem un fiier grafic pentru a avea posibilitatea de a lucra cu el in aplicatia noastra;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

18


: | [ My NP5 Files Samsung FlikerlO flikerll fllkerl2 [fi]flikerl3 Flikerll flikerlS i,fllkerl6 Flikerl7 flikerlS i,fllkerl9 FlikerEO Is

0 ff i-

Picture :

. |^

flikjer Flikjer 1 fliker2 flikjer4

flikerS fliker6

flikjer-7 flikerS flikerS

: : Bitmaps (".brnp]

1\

Fig. 9 Fereastra de dialog OpenPictureDialogl 8. SavePictrueDialogl - fereastr de dialog care ne permite s salvm imaginea creat sau modificat de ctre utilizator mtr-un fixier grafic;

My NP5 Files Samsung . ^ flikjer Flikjer 1 fliker2 flikjer4

FlikerlO flikerll | fllkerl2 | fllkerl3 FllkerH flikerlS [ flIkerl Fllkeriy flikerlS | Flikjer 19 FllkerSO Is

31

Picture:

El

FlikerS fliker6

[None]

flikjer7 FlikerS fliker?

: | fp

: : Bitmaps .]

Fig. lO Fereastra de dialog SavePictrueDialogl

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525. l O9l Ol ME

19

9. FontDialogl - fereastra de dialog care ne permite sa modifica mai multe proprietati a textului (pe care ulterior l nseram cu ajutorul SBInsertText);

Fig. 11 Fereastra de dialog FontDialogl 10, 11, 12, 13, 15, 16.Edit2, Edit3, Edit5, Edit6, Edit8, Edit9 - aceste componente sunt folosite ca variabile; 14. Edit7 - participa la crearea antetului aplicatiei dupa ce este deschis/salvat un fiier grafic; 17. SBRectang - deseneaza un dreptunghi fara umplere; 18. SBFillRec - creaza un dreptunghi cu umplere; 19. SBEllipse - acest instrument permite crearea unei elipse fara umplere; 20. SBFillEllipse - cu acest buton cream o elipsa cu umplere; 21. SBInsertText - insereaza textul dorit n orice punct al spatiului de lucru; 22. WidthPen - reprezinta doar un component de tip Label cu textul Pen width:"; 23. PenWidth - aceasta este un component de tip Edit care permite setarea parametrului Width a lui Pen; 24. Width - un buton cu denumirea Apply" care ne permite aplicarea unei noi setari a parametrului sus-mentionat;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

20

25. Image3 - acest component i este spatiul nostru de lucra, pnza pe care noi desenm; 26. Text - un component de tip Label cu inscriptia Text:"; 27. InsertText - din denumire reiese c anume aici, n componentul de tip Edit, introducem textul dorit spre nserare cu ajutorul SBInsertText; 28. SBColor - ne permite setarea culorilor principale prin apsarea pe orice punct de pe pnz; 29. Imagel - acest component rspunde pentru culoarea de baz; 30. Image2 - aici este afiat culoarea auxiliar; 31. Image4 - acest component ne creaz palet de culori (10 la numr). O remarc la componentele enumerate mai sus cu prefixul SB - aceste sunt componente de tip SpeedButton. 4.2.2. Aranjarea obiectelor pe forma Form2 Pe aceast form este situat doar un component - Manual de tip Memo (1).
(gj| Manual for DSP Welcome to the manual foi Damn Simple Paint! In (his short but comprehensive manual I will explain you how to use this simple graphic edilor. Chaplei I Main menu Menu File has got: New. Clears the workspace and it become* the same -as at the launching the application, If you have any unsaved changes you will be prompted lo save them. Open. Let you choose and open your desired graphic file. Be careful, supported formats are limited! Also, if you have any unsaved changes you will be asked to save them. Save. Write your changes in a file. If you are saving lor the firs! lime you will be proposed lo save in a file. After thai, when you will be saving yaui work il will be saved in your desired lile [01 in file whichyou opened lor modification). Save as... You can save al any moment your painling in a sepai ale lile. 1 - Exit Quit the application at any moment. II you have any unsaved change?you will be asked if you 'A ant them to be saved or not. Also you can cancel closing the application. Menu Edit has got only Undo which lets you go back if you made a mistake. Undo tool is specific one numbei of necesary calls to undo last change depends on Instrument used to make last changes. Also there is no need loi Redo Undo mechanism is cidic. It means that il you continue to undo you will get to the state before using the Undo. Warning! If you undo after accesing File > Hew or Open (and did not choose Cancel) and will try to save it will not be saved in the file you have been working with. Instead you will be asked to save it in a new file [bul you can save iri the file you have been working with, it will be overwritten]. Menu Help has got: Manual. It gives you acces to this manual which you read at the moment, About. Tells you about name, version, license and author of this application. ^^ I. a Is] brffl

Chapter II - Editing tools Brush let you till any chosen area with desired color. Left-click fills it with main color, right-click - with auxiliary color Pen - draw an arbitrary line with main color. Selection - choose an aiea and cut^eopy it where you want. To copy hold Oil key on your keyboard. Warning! When cutting consider the fact that original area will be tilled with auxiliary ooloi aftei you move chosen area. Era&ei - erase whatever yeu want on your painting. Uses auxiliary color for erasing. Line - draw a straight line with main color Rectangle - draw a rectangle with main color. Filled leclangle - the same as previous but fills it with main color. Ellipse - draw an ellipse. Uses main color Filled ellipse the same as previous but fills using main color. Insert tent lets you insert desired lent. To do that introduce your tet in the Tent field,, click

Fig. 12 Aranjarea componentelor pe forma Form2

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

21

4.2.3. Aranjarea obiectelor pe forma Form3 Aici doar un component este invizibil la rularea aplicatiei - Editl. Restul componentelor sunt vizibile.

tii Warning . kS*1

You have unsaved cha iges. Do you want to save them?


; Editl Yes No Cancel

23

Fig. 13 Aranjarea componentelor pe forma Form3 Cifrele din imagine reprezint: 1. Editl - este folosit ca variabila; 2. Buttonl - obiect cu inscriptia Yes" pentru a confirma salvarea modificarilor efectate; 3. Labell - inscriptia din acest obiect furnizeaza utilizatorului o interogare; 4. Button2 - obiect cu inscriptia No" pentru a refuza salvarea modificarilor nesalvate; 5. Button3 - permite de a se intoarce la aplicatie fara a efectua vreo operatie. 4.3. Declararea functiilor i descrierea lor Orice functie, variabila sau constant utilizata in program trebuie declarata. Declararea functiilor se face in modulule header Unitl.h, Unit2.h i Unit3.h. Functiile predefinite nu necesita a fi declarate, deoarece sunt incluse in bibliotecile disponibile in C++ Builder.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

22

4.3.1. Funcjia Arc(); Metoda Arc(X1, Y2, X2, Y2, X3, Y3, X4, Y4) deseneaz o figura deschis n form de arc de elips sau de cerc cu ajutorul parametrilor curenti a Pen. Figura nu se umple cu valoarea lui Brush. Punctele cu coordonatele X1, Y1, X2, Y2 specific colturile dreptunghiului care circumscrie elipsa. Arcul se ncepe din punctul care reprezint intersectia elipsei cu dreapta, care trece prin central ei i punctul cu coordonatele X3, Y3. Punctul final a arcului se stabilete prin intersectia elipsei cu dreapta , care trece prin centrul ei i punctul cu coordonatele X4, Y4. Arcul se deseneaz mpotriva acului de ceasornic de la punctul initial la punctul final. 4.3.2. Functia CopyRect() Copie un fragment al imaginii de pe o pnz pe alta.

Clasa TCanvas

Declararea void __ fastcall CopyRect (const Windows::TRect SDest, TCanvas *Canvas, Const Windows::TRect &Source); Descrierea Metoda CopyRect deplaseaz fragmentul al imaginii definit de parametral Source de pe pnza sursei de imagine Canvas n regiunea definit de parametral Dest a obiectului dat TCanvas. Copierea are loc n regimul stabilit de proprietatea CopyMode. 4.3.3. Functia DrawFocusRect() Deseneaz imaginea dreptunghiului ntr-o forma utilizat pentru afiarea cadrului de focalizare, cu ajutorul operatiei XOR.
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

23

Clasa TCanvas Declararea void _ fastcall DrawFocusRect (const Windows::TRect &Rect); Descrierea Metoda DrawFocusRect deseneaz pe pnz in regiunea Rect imaginea dreptunghiului intr-o form care de obicei se folosete pentru afiarea cadrului de focalizare, adic prin puncte. La desenare se folosete operatia XOR, ce permite de a terge imaginea dreptunghiului prin desenarea lui repetat. 4.3.4. Functia Ellipse() Deseneaz elips sau cerc umpluti.

Clasa TCanvas Declararea void _ fastcall Ellipse (int X1, int Y1, int X2, int Y2); Descrierea Metoda Ellipse deseneaz circumferint sau elips cu ajutorul parametrilor curenti a Pen. Figura se umpl cu valoarea curent a Brush. Punctele (X1, Y1) i (X1, Y2) definesc dreptunghi care circumscrie elipsa. Exemplu Operatorul Image1->Canvas->Brush->Color = clRed; Image1->Canvas->Ellipse(0, 0, Image1->Width, Image1->Height); va desena elips circumscris in componentul Imagel i umplut cu culoarea roie.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

24

4.3.5. Functia FillRect Umple dreptunghiul indicat de pe panza folosind parametral curent Brush.

Clasa TCanvas

Declararea void _ fastcall FillRect (const Windows::TRect &Rect); Descrierea Metoda Fillrect umpla un dreptunghi de pe panza, indicat de de parametrul Rect, folosind valoarea curenta a Brush. Regiunea care se umpla include partile de sus i de stanga a dreptunghiului, dar nu include partile de dreapta i de jos. La utilizarea FillRect parametrul Rect deseori este stabilit de functia Rect. Exemplu Operatorul Image1->Canvas->FillRect (Rect(0, 0, Image1->Width, Image1->Height); terge totul de pe panza componentului Imagel, umpland-o cu fon daca el este setat in proprietatile ale Brush. 4.3.6. Functia FloodFill Coloreaza cu peria curenta regiunea inchisa de pe panza, cu culoarea stabilita. Clasa TCanvas Declararea Enum TFillStyle (fsSurface, fsBorder); void _ fastcall FloodFill (int X, int Y, TColor Color, TFillStyle FillStyle);
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

25

Descrierea Metoda FloodFill coloreaz cu peria curent Brush regiunea inchis de pe pnz, stabilit de culoarea i de punctul initial de colorare (X, Y). Punctul cu coordonatele X i Y reprezint un punct intern aleatoriu al regiunei care se umpl i poate fi de o form aleatoare. Hotarul acestei regiuni este stabilit de ansamblul de

parametri Color i FillStyle. Parametrul Color de tipul TColor indic culoarea care se folosete la detectarea hotarelor regiunii spre umplere, iar parametrul FillStyle stabilere cum anume dup aceast culoare se stabilesc hotarele. Dac FillStyle = fsSurface atunci se umpl regiunea de culoarea Color, iar la celelate culori metoda se oprete. Dac FillStyle = fsBorder, atunci invers, se umpl regiunea de orice culoare care nu sunt identice Color, iar la culoarea Color metoda se oprete. Exemple 1. Image1->Canvas->Brush->Color = clWhite; Image1->Canvas->FloodFill(X, Y, Image1->Canvas->Pixels[X][Y], fsSurface); Operatoarele date umpl cu culoarea alb pe pnza componentului Imagel toti pixeli adiacenti la pixelul cu coordonatele (X, Y) care posed aceai culoare ca i pixelul dat. 2. Image1->Canvas->Brush->Color = clWhite; Image1->Canvas->FloodFill(X, Y, clBlack, fsBorder); Operatoarele date umpl cu culoarea alb pe pnza componentului Image1 toti pixeli adiacenti pixelului cu coordonatele (X, Y) care sunt de culoarea diferit de neagr. La atingerea hotarului negru a regiunii umplerea se oprete. 4.3.7. Funcjia LineTo Deseneaz pe pnz linia dreapt care se incepe de la pozitia curent a stiloului i se termin cu punctul indicat.
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

26

Clasa TCanvas Declararea void _ fastcall LineTo (int X, int Y); Descrierea

Metoda LineTo deseneaz pe pnz linia dreapt care se ncepe cu pozitia curent a stiloului PenPos i se termin cu punctul (X, Y), cu exceptia a acestui punct (X, Y). Pozitia curent a stiloului PenPos se deplaseaz n punctul (X, Y). La desenare se folosesc setrile curente a stiloului Pen. 4.3.8. Func^ia MoveTo Modific pozitia curent a stiloului pe cea indicat, fr a desena ceva.

Clasa TCanvas

Declararea void _ fastcall MoveTo (int X, int Y); Descrierea Metoda MoveTo modific pozitia curent a stiloului PenPos la cea indicat de punctul (X, Y). Aceasta este echivalent cu setarea direct a propriettii PenPos. La deplasarea stiloului prin metoda MoveTo nimic nu se deseneaz. 4.3.9. Funcjia Rectangle Deseneaz pnz cu stiloul curent un dreptunghi i l umpl cu peria curent. Clasa TCanvas Declararea
Coala Mod. Coala document. Semnat. Data

CPAE 525.1 091 01 ME

27

void _ fastcall Rectangle (int Xl, int Yl, int X2, int Y2); Descrierea Metoda Rectangle deseneaz pe pnz cu stiloul curent Pen un dreptunghi a crui coltul stng de sus are coordonatele (Xl, Yl), iar cel drept de jos - (X2, Y2). Dreptunghiul este umplut cu peria curent Brush.

4.3.10. Funcfia ShowMessage Afieaz ferestre de dialog simple de mesaj.

Fixier header: Dialogs.hpp.

Sintax #include <Dialogs.hpp> extern PACKAGE void __ fastcall ShowMessage (constAnsiString Msg); Descrierea In aplicatii deseori este necesar de afiat diverse ferestre de dialog simple pentru a transmite utilizatorului unele instructiuni. Cea mai simpl dintre functii de acest gen este ShowMessage, care afieaz o fereastr cu mesaj. Textul mesajului este stabilit de parametral Msg. Antetul ferestrei coincide cu numele fiierul executabil al aplicatiei. 4.3.11. Functia TextOut Scrie pe pnz linie de text indicat, incepnd cu pozitia indicat. Clasa TCanvas Declararea void _ fastcall textOut (int X, int Y, const AnsiString Text);
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

28

Descrierea Functia TextOut scrie linie de text Text pe pnz, ncepnd de la pozitia cu coordonatele (X, Y). Inscriptia se face corespunztor setrilor curente a fontului Font. Fundalul inscriptiei este determinat de setrile curente ale periei Brush. Pozitia curent PenPos a stiloului pen este deplasat la captul textului afiat.

Dac culoarea curent periei n momentul afirii a textului se deosebete de la cea a pnzei, atunci textul va fi suprapus unui dreptunghi de aceast culoare. Dar dimensiunile lui vor fi exact identice dimensiunii textului. Exemplu Operatorul Image1->Canvas->TextOut (10, 10, s) afieaz text care se pstreaz n variabila de ir s pe pnza componentului Imagel, ncepnd cu pozitia (10, 10). 4.4. Descrierea fiierului header Unit1.h n conformitate cu principiul ncapsulrii (ascunderii) informatiei, textul modulului este divizat n dou prti: Unitl.h - headerul,
unde

are loc declararea functiilor, claselor, variabilelor

utilizate, etc. - Unitl.cpp modulul executiv, care contine descrierea functiilor. Dup cum se observ, n header sunt incluse directivele preprocesorului #include, unde se indic preprocesorului ce biblioteci trebuie s includ n program, macrosuri, etc. Mai jos de directive sunt declarate clasele de componente i functiile. Clasa TForml este divizat n 3 compartimente: Published. Compartiment deschis ce contine declararea componentelor i a

metodelor de prelucrare a lor; tot ce se contine aici, C++ Builder include automat n timpul proiectrii formei.
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

29

- Private. Compartiment nchis, declarable fcute aici sunt disponibile numai pentru modulul dat. - Public. Compartiment deschis, declarable sunt accesibile pentru alte clase sau module. Programatorul poate aduga propriile functii, clase, variabile n

compartimentele public i private.

Dup declararea clasei urmeaz propozitia PACKAGE, inclus automat n header. Dup ea putem declara tipurile, variabilele, functiile, la care vom avea acces din alte module, dar care nu se include n clasa TForml. Pentru necesittile mecanismului Undo, dialogurilor de deschidere/salvare a fiierelor grafice i a unelor instrumente de desenare declarm componente de tip TBitmap: Graphics::TBitmap *Bitmap = new Graphics::TBitmap; Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap2 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap3 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap4 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap5 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap6 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap7 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap8 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap9 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap10 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap11 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap12 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap13 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap14 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap15 = new Graphics::TBitmap; Graphics::TBitmap *Buffer = new Graphics::TBitmap;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

30

n continuare declarm 2 componente de tip TRect: TRect R,R0; Ele se ntrebuinteaz de mai multe instrumente care apeleaz la form dreptunghiular. Mai departe declarm mai multe variabile de tip ntreg: int X0,Y0,X1,Y1; Toate ele slujesc pentru stabilirea coordonatelor. Urmtoarele variabile sunt de tip boolean: bool RBegin = false, REnd = false, RDrag = false, Reset = false;

Prima variabil este un semnal care arat c s-a nceput sau nu selectarea fragmentului. A doua este opus primei - ea semnalizeaz dac s-a terminat sau nu selectarea fragmentului. Cea de-a treia, ultima, slujete pentru evitarea aparitiei a semnalizrii ca sunt modificri nesalvate la apelarea la Undo. Valoarea 1 semnifica faptul ca mecanismul Undo a fost resetat. Concluzie n aceast lucrare de curs am elaborat aplicatie pentru editarea imaginilor (analog Microsoft Paint). Aplicatia creat se numete Damn Small Paint (prescurtat DSP) i este distribuit sub termenii licentei GPL versiunea a 3-a. Ca mediu de programare am ales C++ Builder versiunea 6. La baza lui st limbajul de programare C++ Builder, o extindere a C++, un limbaj foarte performant i universal, ca are la baz tehnologia RAD (Rapid Application Development), permitnd crearea unor aplicatii prin metoda orientat-obiect, adic este necesar numai amplasarea obiectelor, cum i am procedat n capitolul 4.2, i apoi descrierea evenimentelor, ms relativ complicat (fat de exemplu Delphi), fapt ce nu poate fi evitat n cazul unei performante mai mari. Printre avantajele aplicatiei DSP pot fi mentionati: o interfat simpl i intuitiv, cu instrumente aranjate ergonomic, fr o supra-aglomerare; modificrile nepstrate nu sunt pierdute; posibilitatea de a amna modificrile recente; un instrument de deplasare/copiere intuitiv.
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

31

Printre dezavantajele aplicatiei DSP pot fi mentionati: prezenta bug-urilor care creaza incomoditati sau chiar forteaza pe utilizatorul de a reporni aplicatia; suporta doar formatul BMP. Daca comparam cu analoage, programul elaborat este destul de primitiv. Instrumentarul este sarac i nu este deplin, mecanismul de amanare i deplasare, copiere sunt atipice. Luand in consideratie cerintele initiale (capitolul 2) putem spune ca sarcina a fost indeplinita conform acestora, adica poate ceea ce trebuia sa poata conform

prevederilor. In plus, scopul principal a lucrarii de curs a fost obtinerea deprinderilor practice de proiectare a unui produs soft. Analizand obiectivele initiale i rezultatul proiectarii putem concluziona ca lucrarea este indeplinita corect. Bibliografie 1. "C++ Builder 6. . 1. ++", . ., ", 2002, ; 2. "C++ Builder 6. . 2. ", . ., ", 2002, ; 3. " C++ Builder 6", . ., ", 2003, ; 4. http://wikipedia.org/; 5. http://google.com.

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525. l 09l Ol ME


Anexa 1

32

1. Codul de program al header-ului Forml (Unitl.h)


// ------------------------------------------------------------------------------------#ifndef UnitlH #define UnitlH // ------------------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Buttons.hpp>

#include <Dialogs.hpp> #include <ExtCtrls.hpp> #include <ExtDlgs.hpp> #include <Menus.hpp> #include <ComCtrls.hpp> // ------------------------------------------------------------------------------------Graphics::TBitmap *Bitmap = new Graphics::TBitmap; Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap2 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap3 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap4 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap5 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap6 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap7 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap8 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap9 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap10 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap11 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap12 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap13 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap14 = new Graphics::TBitmap; Graphics::TBitmap *Bitmap15 = new Graphics::TBitmap; Graphics::TBitmap *Buffer = new Graphics::TBitmap; TRect R,R0; int X0,Y0,X1,Y1; bool RBegin = false, REnd = false, RDrag = false, Reset = false; class TForm1 : public TForm { _ published: // IDE-managed Components TImage *Image1; TImage *Image2; TImage *Image4; TImage *Image3; TSpeedButton *SBBrush; TSpeedButton *SBColor; TOpenPictureDialog *OpenPictureDialog1; TMainMenu *MainMenu1; TMenuItem *File1;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

33

TMenultem *MOpen; TMenultem *Editl; TMenultem *Undo; TMenultem *Exitl; TSpeedButton *SBPen; TSpeedButton *SBRect; TSpeedButton *SBErase; TSpeedButton *SBRectang; TSpeedButton *SBFillRec; TSpeedButton *SBLine; TMenultem *MSaveAs; TMenultem *Helpl; TMenultem *Aboutl; TSavePi ctureDi alog *S avePictureDi alogl; TSpeedButton *SBEllipse; TSpeedButton *SBFillEllipse; TButton *Width; TEdit *PenWidth; TSpeedButton *SBInsertText;

TFontDialog *FontDialogl; TEdit *InsertText; TLabel *WidthPen; TLabel *Text; TMenultem *Manuall; TMenultem *Newl; TMenultem *Savel; TEdit *Edit2; TEdit *Edit3; TEdit *Edit5; TEdit *Edit6; TEdit *Edit7; TEdit *Edit8; TEdit *Edit9; void __ fastcall FormCreate(TObject *Sender); void __ fastcall MOpenClick(TObject *Sender); void __ fastcall ExitlClick(TObject *Sender); void __ fastcall UndoClick(TObject *Sender); void __ fastcall Image4MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __ fastcall Image3MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __ fastcall SBBrushClick(TObject *Sender); void __ fastcall Image3MouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __ fastcall Image3MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __ fastcall MSaveAsClick(TObject *Sender); void __ fastcall AboutlClick(TObject *Sender); void __ fastcall SavelClick(TObject *Sender); void __ fastcall WidthClick(TObject *Sender); void __ fastcall Image3Click(TObject *Sender); void __ fastcall NewlClick(TObject *Sender);
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

34

void __ fastcall Manual1Click(TObject *Sender); void __ fastcall FormCloseQuery(TObject *Sender, bool &CanClose); private: // User declarations public: // User declarations _ fastcall TForm1(TComponent* Owner); }; // extern PACKAGE TForm1 *Form1; // #endif

2. Codul de program al par^ii executive Form1 (Unit1.cpp)


// #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #include "Unit3.h" //

#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // _ fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{ }

// void fastcall TForm1::FormCreate(TObject *Sender)


{

// Coloram Main color si Auxiliary color, atribuind Brush culorile corespunzatoare si folosind instrumental // FillRect, parametrii caruia sunt coordonatele colturilor de sus stinga si de jos dreapta Image1->Canvas->Brush->Color = clBlack; Image2->Canvas->Brush->Color = clWhite; Image 1->Canvas->FillRect(Rect(0,0,Image 1->Width,Image 1->Height)); Image2->Canvas->FillRect(Rect(0,0,Image2->Width,Image2->Height)); // Cream Color palette de 10 culori. Pentru aceasta impartim Image4 in zece suprafete egale si coloram // consecutiv una dupa alta in culorile alese int HW = Image4->Height / 10; for(int i = 1; i <=10; i++) { switch(i) { case 1:Image4->Canvas->Brush->Color = clBlack; break; case 2:Image4->Canvas->Brush->Color = clAqua; break; case 3:Image4->Canvas->Brush->Color = clBlue; break;
Coala document.

Mod. Coala

Semnat.

Data

CPAE 525.1 091 01 ME

35

case 4:Image4->Canvas->Brush->Color = clFuchsia; break; case 5:Image4->Canvas->Brush->Color = cl Green; break; case 6:Image4->Canvas->Brush->Color = clLime; break; case 7:Image4->Canvas->Brush->Color = clMaroon; break; case 8:Image4->Canvas->Brush->Color = clRed; break; case 9:Image4->Canvas->Brush->Color = clYellow; break; case 10:Image4->Canvas->Brush->Color = clWhite; break; } Image4->Canvas->Rectangle(0,(i-1)*HW,Image4->Width,i*HW); } // Cream spatiul de lucru (stabilim Pen si Brush de culoare alba pentru a crea un cimp curat alb) Image3->Canvas->Brush->Color = clWhite; Image3->Canvas->Pen->Color = clWhite; Image3->Canvas->Rectangle(0,0,Image3->Width,Image3->Height); // Pregatim memoriile-bufer pentru mecanismul Undo (le atribuim imaginea curenta a spatiului de lucru) Bitmap->Assign(Image3->Picture); Bitmap1->Assign(Image3->Picture); Bitmap2->Assign(Image3->Picture); Bitmap3->Assign(Image3->Picture); Bitmap4->Assign(Image3->Picture); Bitmap5->Assign(Image3->Picture); Bitmap6->Assign(Image3->Picture); Bitmap7->Assign(Image3->Picture); Bitmap8->Assign(Image3->Picture); Bitmap9->Assign(Image3->Picture); Bitmap10->Assign(Image3->Picture); Bitmap11->Assign(Image3->Picture); Bitmap12->Assign(Image3->Picture); Bitmap13->Assign(Image3->Picture); Bitmap14->Assign(Image3->Picture); Bitmap15->Assign(Image3->Picture);

// Instalam valorile variabilelor necesare Edit5->Text = 0; Edit2->Text = 0; Edit3->Text = 0; Edit8->Text = 0; //Setam proprietatile necesare a componentelor noastre SavePictureDialog1->DefaultExt=".bmp"; SavePictureDialog1->Filter="Bitmaps (*.bmp)|*.bmp"; OpenPictureDialog1->DefaultExt=".bmp"; OpenPictureDialog1->Filter="Bitmaps (*.bmp)|*.bmp"; SBBrush->AllowAllUp = true; SBPen->AllowAllUp = true; SBRect->AllowAllUp = true;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

36

SBErase->AllowAllUp = true; SBLine->AllowAllUp = true; SBRectang->AllowAllUp = true; SBFillRec->AllowAllUp = true; SBEllipse->AllowAllUp = true; SBFillEllipse->AllowAllUp = true; SBInsertText->AllowAllUp = true; SBColor->AllowAllUp = true; SBBrush->GroupIndex = 1; SBPen->GroupIndex = 1; SBRect->GroupIndex = 1; SBErase->GroupIndex = 1; SBLine->GroupIndex = 1; SBRectang->GroupIndex = 1; SBFillRec->GroupIndex = 1; SBEllipse->GroupIndex = 1; SBFillEllipse->GroupIndex = 1; SBInsertText->GroupIndex = 1; SBColor->GroupIndex = 1; SBBrush->Hint = "Brush. Left-click for main color, right-click for auxiliary color"; SBPen->Hint = "Pen. Draw a free-style line"; SBRect->Hint = "Selection. Hold Ctrl to copy"; SBErase->Hint = "Eraser. It uses auxiliary color"; SBLine->Hint = "Line. Draw a straight line"; SBRectang->Hint = "Rectangle. Draw an empty rectangle"; SBFillRec->Hint = "Filled rectangle"; SBEllipse->Hint = "Ellipse. Draw an empty ellipse"; SBFillEllipse->Hint = "Filled ellipse"; SBInsertText->Hint = "Insert text"; SBColor->Hint = "Pippete. Left-click for main color, right-click for auxiliary color"; SBBrush->ShowHint = true; SBPen->ShowHint = true; SBRect->ShowHint = true; SBErase->ShowHint = true; SBLine->ShowHint = true; SBRectang->ShowHint = true; SBFillRec->ShowHint = true; SBEllipse->ShowHint = true; SBFillEllipse->ShowHint = true; SBInsertText->ShowHint = true; SBColor->ShowHint = true; Image1->ShowHint = true; Image2->ShowHint = true; Image4->ShowHint = true; InsertText->ShowHint = true; Image1->Hint = "Main color"; Image2->Hint = "Auxiliary color"; Image4->Hint = "Color palette"; InsertText->Hint = "Introduce here your text"; Edit2->Visible = false; Edit3->Visible = false; Edit5->Visible = false;

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

37

Edit6->Visible = false; Edit7->Visible = false; Edit8->Visible = false; Edit9->Visible = false; Form1->Caption = "DSP v0.1"; Form1->AutoSize = true; WidthPen->Font->Size = 16; Edit7->Text = "DSP v0.1"; PenWidth->Text = "1"; } // -----------------------------------------void __ fastcall TForm1::MOpenClick(TObject *Sender) { // Verificam daca imaginea a suferit modificari. Valoarea 0 corespunde "nu a suferit modificari", // 1 "da, a suferit modificari". In cazul dat nu au fost modificari, de aceea lansam dialogul de // deschidere a unui fisier grafic if(Edit5->Text.ToInt()==0) { if(OpenPictureDialog1->Execute()) { // Am implementat mecanismul de prelucrare a eroriilor posibile la deschiderea fisierului dorit (in cazul // nostru eroarea posibila este un format care nu este compatibil cu aplicatia noastra) try { Image3->Picture->LoadFromFile(OpenPictureDialog1->FileName); Bitmap->Assign(Image3->Picture); } catch(...) { ShowMessage("Bad picture! Sorry but I am unable to open it."); } } // In cele ce urmeaza anuntam ca a fost deschis un fisier si, deci in consecinta vom pastra // modificari in el la accesarea Save Form3->Edit1->Text = 1; } // In cazul dat imaginea a suferit modificari si in consecinta ne adresam la dialogul de salvare if(Edit5->Text.ToInt()== 1) { Form3->ShowModal(); } // Verificam daca a fost deschis fisier. Valoarea 0 confirma faptul // ca a fost deschis un fisier si in consecinta in antetul programei // setam denumirea aplicatiei plus denumirea fisierului. De asemenea resetam // memoriile-bufer a mecanismului Undo. Variabila Reset slujeste pentru evitarea // aparitiei a semnalizarii ca sunt modificari nesalvate la apelarea la Undo. // Valoarea true semnifica faptul ca mecansimul Undo a fost resetat. if(Edit8->Text.ToInt()==0) { Edit6->Text = Edit7->Text + OpenPictureDialog1->FileName; Form1->Caption = Edit6->Text; Bitmap->Assign(Image3->Picture); Bitmap1->Assign(Image3->Picture); Bitmap2->Assign(Image3->Picture); Bitmap3->Assign(Image3->Picture); Bitmap4->Assign(Image3->Picture);

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

38

Bitmap5->Assign(Image3->Picture); Bitmap6->Assign(Image3->Picture); Bitmap7->Assign(Image3->Picture); Bitmap8->Assign(Image3->Picture); Bitmap9->Assign(Image3->Picture); Bitmap10->Assign(Image3->Picture); Bitmap11->Assign(Image3->Picture); Bitmap12->Assign(Image3->Picture); Bitmap13->Assign(Image3->Picture); Bitmap14->Assign(Image3->Picture); Bitmap15->Assign(Image3->Picture); Reset = true; } } // ------------------------------------------------------------------------------------void __ fastcall TForm1::Exit1Click(TObject *Sender) { // Efectuam inchiderea aplicatiei. Dar inainte de aceasta se va apela la CloseQuery(), ceea ce ne va permite // sa salvam sau nu modificarile sau in genere sa aminam inchidere a aplicatiei Close();
}

// ------------------------------------------------------------------------------------void __ fastcall TForm1::UndoClick(TObject *Sender)


{

// Aici este prezentat mecanismul ciclic Undo. Image3->Picture->Assign(Bitmap); Bitmap->Assign(Bitmap1); Bitmap1->Assign(Bitmap2); Bitmap2->Assign(Bitmap3); Bitmap3->Assign(Bitmap4); Bitmap4->Assign(Bitmap5); Bitmap5->Assign(Bitmap6); Bitmap6->Assign(Bitmap7); Bitmap7->Assign(Bitmap8); Bitmap8->Assign(Bitmap9); Bitmap9->Assign(Bitmap10); Bitmap10->Assign(Bitmap11); Bitmap11->Assign(Bitmap12); Bitmap12->Assign(Bitmap13); Bitmap13->Assign(Bitmap14); Bitmap14->Assign(Bitmap15); Bitmap15->Assign(Image3->Picture); // Variabila Reset a fost deja mentionata. In cazul in care nu s-a efectuat deschiderea // sau crearea unui nou fisier variabila data ramine false, ce duce in consecinta la stabilirea // faptului ca daca aplicam mecanismul Undo imaginea va fi considerata ca una care a suferit modificari, // ce si va fi afisat in antetul aplicatiei if(Reset) {
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

39

Edit5->Text = 1; // Conditia data previne multiplicarea " - Unsaved changes" in antetul aplicatiei if(Edit9->Text!=Form 1->Caption) { Form1->Caption = Form1->Caption + " - Unsaved changes"; Edit9->Text = Form1->Caption; } } } // ------------------------------------------------------------------------------------void __ fastcall TForm1::Image4MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{

// Aici este prezentat mecanismul de setare a Main color si Auxiliary color cu ajutorul // Color palette. Stabilim conditia conform careia setarea se efectueaza daca apasam // pe una din culorile din Color palette if((Sender == Image4) || SBColor->Down) { // La apasarea click-ului sting se seteaza Main color, celui drept - Auxiliary color if(Button == mbLeft) { Image1->Canvas->Brush->Color = ((TImage *)Sender)->Canvas->Pixels[X][Y]; Image 1->Canvas->FillRect(Rect(0,0,Image 1->Width,Image 1->Height)); } else { Image2->Canvas->Brush->Color = ((TImage *)Sender)->Canvas->Pixels[X][Y]; Image2->Canvas->FillRect(Rect(0,0,Image2->Width,Image2->Height)); } }
}

// ------------------------------------------------------------------------------------void __ fastcall TForm1::Image3MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{

// Partea de rezervare a mecanismului Undo. Este dublat, ceea ce creaza necesitatea // de a apela la Undo de mai multe ori pentru a amina ultima modificare. Dar aceasta // nu este intimplator - mecanismul este dublat pentru a preveni unele probleme specifice // si nefaste a mecanismului Undo Bitmap15->Assign(Bitmap14); Bitmap14->Assign(Bitmap13); Bitmap13->Assign(Bitmap12); Bitmap12->Assign(Bitmap11); Bitmap11->Assign(Bitmap10); Bitmap10->Assign(Bitmap9); Bitmap9->Assign(Bitmap8); Bitmap8->Assign(Bitmap7); Bitmap7->Assign(Bitmap6); Bitmap6->Assign(Bitmap5);
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

40

Bitmap5->Assign(Bitmap4); Bitmap4->Assign(Bitmap3); Bitmap3->Assign(Bitmap2); Bitmap2->Assign(Bitmap1); Bitmap1->Assign(Bitmap);

Bitmap->Assign(Image3->Picture); // Setam Main color si Auxiliary color de pe un punct oarecare a spatiului de lucru // Principiul este asemanator celui descris anterior if(SBColor->Down) { if(Button == mbLeft) { Image1->Canvas->Brush->Color = ((TImage *)Sender)->Canvas->Pixels[X][Y]; Image 1->Canvas->FillRect(Rect(0,0,Image 1->Width,Image 1->Height)); } else { Image2->Canvas->Brush->Color = ((TImage *)Sender)->Canvas->Pixels[X][Y]; Image2->Canvas->FillRect(Rect(0,0,Image2->Width,Image2->Height)); } } else
{

// Memoram pozitia initiala a cursorului X0 = X; Y0 = Y; if (SBPen->Down) { // Stabilim coordonatele creionului la pozitia curenta a cursorului si setam culoarea lui Image3->Canvas->MoveTo(X,Y); Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; } else if (SBLine->Down) { // Memoram coordonatele pentru a porni mecanismul de desenare a liniei drepte. De asemenea schimbam regimul // de desenare a Pen pentru a avea posibilatate de a sterge imaginea liniei precedente si setam culoarea // lui Pen conform culorii de baza X1 = X; Y1 = Y; Image3->Canvas->Pen->Mode = pmNotXor; Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; } // Setam culoarea instrumentului Brush si coloram obiectul ales in dependenta ce click // a fost apasat (cel sting sau cel drept) else if (SBBrush->Down) { if (Button==mbLeft) Image3->Canvas->Brush->Color = Image1->Canvas->Brush->Color; else Image3->Canvas->Brush->Color = Image2->Canvas->Brush->Color; Image3->Canvas->FloodFill(X,Y,Image3->Canvas->Pixels[X][Y],fsSurface);
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

41

} // Pentru instrumental Eraser se creeaza un dreptunghi in jurul coordonatelor X si Y, apoi se seteaza // culoarea Auxiliary si dupa aceasta se umple un dreptunghi de aceasta culoare in interiorul dreptunghiului // anterior (putem observa ca marimile sale sunt cu 2 pixele mai mici) else if (SBErase->Down) { R = Rect(X-6,Y-6,X+6,Y+6); Image3->Canvas->DrawFocusRect(R); Image3->Canvas->Brush->Color = Image2->Canvas->Brush->Color; Image3->Canvas->FillRect(Rect(X-5,Y-5,X+5,Y+5));

} else if (SBRect->Down || SBRectang->Down || SBFillRec->Down || SBEllipse->Down || SBFillEllipse->Down) { if (REnd) { // Suprimam DrawFocusRect precedent Image3->Canvas->DrawFocusRect(R); // Regimul de incepere a deplasarii fragmentului if ((X < R.Right) && (X > R.Left) && (Y > R.Top) && (Y < R.Bottom)) { // Instalarea flagurilor RDrag = true; REnd = false; // Memorarea pozitiei intiale fragmentului care este deplasat R0 = R; // Memorarea imaginii Buffer->Assign(Image3->Picture); // Setarea culorii a Brush Image3->Canvas->Brush->Color = Image2->Canvas->Brush->Color; } } else // Setam flagurile care semnalizeaza ca s-a inceput desenarea chenarului a fragmentului. De asemenea // stabilim coordonatele si desenam chenarul propriu-zis { RBegin = true; REnd = false; R.Top = X; R.Bottom = X; R.Left = Y; R.Right = Y; Image3->Canvas->DrawFocusRect(R); } } }
}

// ------------------------------------------------------------------------------------Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

42

void __ fastcall TForm1::SBBrushClick(TObject *Sender) { // Semnalam ca nu au loc nici un fel de operatii cu fragment RBegin = false; RDrag = false; REnd = false; } // void __ fastcall TForm1::Image3MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{

// Blocam posibilitatea de a desena cu tasta dreapta a mouse-ului if (! Shift.Contains(ssLeft)) return; // Desenam linia dreapta if (SBLine->Down)
{

// Stergem linia anterioara Image3->Canvas->MoveTo(X0,Y0); Image3->Canvas->LineTo(X 1,Y1); // Desenam linia noua Image3->Canvas->MoveTo(X0,Y0); Image3->Canvas->LineTo(X,Y); // Memoram noile coordonate a capatului liniei X1 = X; Y1 = Y;
}

// Desenam linie aleatoare else if (SBPen->Down) Image3->Canvas->LineT o(X,Y);

// Instrumentul de stergere (principiul de lucru deja a fost descris anterior) else if (SBErase->Down) { Image3->Canvas->DrawFocusRect(R); R = Rect(X-6,Y-6,X+6,Y+6); Image3->Canvas->DrawFocusRect(R); Image3->Canvas->FillRect(Rect(X-5,Y-5,X+5,Y+5)); } else if ((SBRect->Down && (RBegin || RDrag)) || SBRectang->Down || SBFillRec->Down || SBEllipse->Down || SBFillEllipse->Down) { if (RBegin) { // Desenam chenarul, apoi stablim noile coordonatele ale sale si iarasi il desenam Image3->Canvas->DrawFocusRect(R); if (X0 < X) { R.Left = X0; R.Right = X; } else { R.Left = X; R.Right = X0; } if (Y0 < Y) { R.Top = Y0; R.Bottom = Y; } else { R.Top = Y; R.Bottom = Y0; } Image3->Canvas->DrawFocusRect(R); } else if (SBRect->Down)
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

43

I// Regimul de deplasara a fragmentului cu restabilirea imaginii sub fragmentul deplasat

Image3->Canvas->CopyRect(R,Buffer->Canvas,R); // Daca nu este apasata tasta Ctrl s sterge imaginea in RO if (! Shift.Contains(ssCtrl)) Image3->Canvas->FillRect(R0); // Formarea pozitiei noi a fragmentului R.Left = R.Left + X - XO; R.Right = R.Right + X - XO; R.Top = R.Top + Y - YO; R.Bottom = R.Bottom + Y - YO; // Memorarea pozitiei cursorului XO = X; YO = Y; // Desenarea fragmentului in pozitia noua Image3->Canvas->CopyRect(R,Buffer->Canvas,R0); // Desenarea chenarului Image3->Canvas->DrawFocusRect(R); } } } // ------------------------------------------------------------------------------------void __ fastcall TForml::Image3MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
I I

if (SBLine->Down) // Stergem linia anterioara, schimbam regimul de desenare si cream linia dreapta dorita Image3->Canvas->MoveTo(X0,Y0); Image3->Canvas->LineTo(X 1,Y1); Image3->Canvas->Pen->Mode = pmCopy; Image3->Canvas->MoveTo(X0,Y0); Image3->Canvas->LineTo(X,Y); } else if (SBRect->Down)
I

// In primul caz suprimam chenarul, in al doilea anuntam ca fragmentul a fost ales if (RDrag) Image3->Canvas->DrawFocusRect(R); if (RBegin && ! REnd) I REnd = true; }
}

// Instrumental de desenare a dreptungiului a fost realizat cu ajutorului liniilor. // Aceasta se explica prin complicatiile care au aparut cu instrumental FrameRect(R). // La desenarea cu ajutorul FrameRect nu era posibila suprimarea corecta a DrawFocusRect(R). // La inceput stabilim culoarea Pen (ea determina culoarea liniei), apoi suprimam DrawFocusRect // si in final desenam figura dorita else if (SBRectang->Down) I
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

44

Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; Image3->Canvas->DrawFocusRect(R); Image3->Canvas->MoveTo(R.Left,R.Top); Image3->Canvas->LineTo(R.Right,R.Top); Image3->Canvas->LineTo(R.Right,R.Bottom); Image3->Canvas->LineTo(R.Left,R.Bottom); Image3->Canvas->LineTo(R.Left,R.Top); } // Instrumental desenarii a dreptunghiului umplut este unul simplu si functioneaza asa: // Setam culoarea Pen si Brush (ambele influentiaza instrumental Rectangle. Setam aceleasi culori // deoarece dorim un dreptunghi colorat complet intr-o culoare). // Desenam cu ajutorul Rectangle, stabilind colturile de sus stinga si de jos dreapta else if (SBFillRec->Down) { Image3->Canvas->Brush->Color = Image1->Canvas->Brush->Color; Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; Image3->Canvas->Rectangle(R.Left,R.Top,R.Right,R.Bottom); } // Pentru desenarea cercului fara umplere folosim instrumental Arc. Primii 4 parametrii a sai // stabilesc coordonatele dreptunghiului in care se circumscrie arcul. Urmatorii 4 parametrii // stabilesc coordonatele inceputului si sfirsitului arcului. Le stabilim in coltul sting al // dreptunghiului si in asa fel primim in rezultat figura cercului else if (SBEllipse->Down) { Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; Image3->Canvas->DrawFocusRect(R); Image3->Canvas->Arc(R.Left,R.Top,R.Right,R.Bottom,R.Left,R.Left,R.Left,R.Left); } // Cercul umplut desenam cu ajutorul Ellipse. Parametrii sai stabilesc coordonatele // dreptunghiului in care se va circumscrie cercul else if (SBFillEllipse->Down) { Image3->Canvas->Pen->Color = Image1->Canvas->Brush->Color; Image3->Canvas->DrawFocusRect(R); Image3->Canvas->Brush->Color = Image1->Canvas->Brush->Color; Image3->Canvas->Ellipse(R.Left,R.Top,R.Right,R.Bottom); } // La inserarea textului chemam dialogul care stabileste parametrii textului (FontDialog1) // si transmitem parametrii setati spatiului de lucru. Apoi inseram insasi textul cu ajutorul // instrumentului TextOut care insereaza textul inscris in cimpul Text. Parametrii sai stabilesc // coordonatele de sus stinga a dreptunghiului in care va fi inserat textul si sursa textului pe // care dorim sa-l inseram else if (SBInsertText->Down) { if(FontDialog1->Execute()) { Image3->Canvas->Brush->Color = Image1->Canvas->Brush->Color; Image3->Canvas->Font->Color=FontDialog1->Font->Color; Image3->Canvas->Font=FontDialog1->Font; Image3->Canvas->Font->Size=FontDialog1->Font->Size; Image3->Canvas->Font->Style=FontDialog1->Font->Style;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

45

Image3->Canvas->TextOut(XO,YO,InsertText->Text); } }

// Suprimam DrawFocusRect pentru Eraser else if (SBErase->Down) Image3->Canvas->DrawFocusRect(R); // Stabilim valorile variabilelor care anunta ca s-a finisat crearea/deplasarea fragmentului // si ca exista modificari RBegin = false; RDrag = false; Reset = false; // Cum deja am mentionat mecanismul de rezervare al Undo este dublat pentru suprimarea problemelor // specifice Bitmapl5->Assign(Bitmapl4); Bitmapl4->Assign(Bitmapl3); Bitmapl3->Assign(Bitmapl2); Bitmapl2->Assign(Bitmapll); Bitmapll->Assign(BitmaplO); BitmaplO->Assign(Bitmap9); Bitmap9->Assign(Bitmap8); Bitmap8->Assign(Bitmap7); Bitmap7->Assign(Bitmap6); Bitmap->Assign(Bitmap5); Bitmap5->Assign(Bitmap4); Bitmap4->Assign(Bitmap3); Bitmap3->Assign(Bitmap2); Bitmap2->Assign(Bitmapl); Bitmapl->Assign(Bitmap); Bitmap->Assign(Image3->Picture);
}

// ------------------------------------------------------------------------------------void __ fastcall TForml::MSaveAsClick(TObject *Sender)


I

// Punctul Save as... al submeniului File ne permite pastrarea intr-un file. Pentru aceasta apelam // la dialogul SavePictureDialogl, pastram continutul spatiului de lucru in memoria-bufer Bitmap si apoi // inscriem in fisierul selectat. Dupa aceasta cream antetul aplicatiei care reflecta denumirea aplicatiei // plus denumirea fisierului pastrat if(SavePi ctureDi al ogl->Execute()) I Bitmap->Assign(Image3->Picture); Bitmap->SaveToFile(SavePictureDialogl->FileName); Forml->Caption = Edit7->Text + SavePictureDialogl->FileName; } // Prima variabila instalata in 0 semnalizeaza faptul ca nu mai exista modificari // nepastrate. Instalam a doua variabila care semnalizeaza faptul daca modificarile trebuie sa fie scrise in // fisierul pastrat sau deschis. In cazul nostru valoarea ei este setata in 0, ce inseamna ca // vom pastra in continuare in fisierul pastrat Edit5->Text = 0;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

Form3->Edit 1->Text = 0; // Resetam mecanismul Undo Bitmap->Assign(Image3->Picture); Bitmap1->Assign(Image3->Picture); Bitmap2->Assign(Image3->Picture); Bitmap3->Assign(Image3->Picture); Bitmap4->Assign(Image3->Picture); Bitmap5->Assign(Image3->Picture); Bitmap6->Assign(Image3->Picture); Bitmap7->Assign(Image3->Picture); Bitmap8->Assign(Image3->Picture); Bitmap9->Assign(Image3->Picture);

} // ------------------------------------------------------------------------------------void __ fastcall TForm1::About1Click(TObject *Sender) { // Aratam un scurt mesaj cu careva detalii despre aplicatia noastra ShowMessage("Damn Simple Paint v0.1\nDistributed under GPL v3 terms\nAlex Fliker Inc. 2011") ;} // ------------------------------------------------------------------------------------void __ fastcall TForm1::Save1Click(TObject *Sender)
{

// Variabila Edit5 cu valoarea 0 semnifica faptul ca nu exista modificari sau modificarile au // fost pastrate, deci in consecinta nu aveam ce pastra if(Edit5->Text.ToInt()==0) { ShowMessage("Nothing to save!"); } // Variabila Edit5 cu valoarea 1 semnalizeaza faptul ca exista modificari nesalvate if(Edit5->Text.ToInt()== 1) { // Variabila Edit2 setata in 1 semnifica faptul ca anterior s-a efectuat salvarea modificarilor if(Edit2->Text.ToInt()==1) { // Variabila Edit1 din Form3 semnifica faptul daca fisierul a fost pastrat intr-un file sau // a fost deschis un fisier. Valoarea 0 semnifica ca fisierul a fost pastrat cu SavePictureDialog1, // 1 - a fost deschis cu OpenPictureDialog1. Corespunzator efectuam pastrarea modificarilor. De // asemenea cream antetul corespunzator al aplicatiei if(Form3->Edit 1->Text.ToInt()==0) { Bitmap->Assign(Image3->Picture); Bitmap->SaveToFile(SavePictureDialog1->FileName); Form1->Caption = Edit7->Text + SavePictureDialog1->FileName; } if(Form3->Edit 1->Text.ToInt()== 1) { Bitmap->Assign(Image3->Picture); Bitmap->SaveToFile(OpenPictureDialog1->FileName); Form1->Caption = Edit7->Text + OpenPictureDialog1->FileName;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

47

} } // Variabila Edit2 cu valoarea 0 semnifica ca anterior nu s-a efectuat pastrarea sau nu a fost deschis vreun fisier. // Instalam variabila data in 1 pentru a semnaliza ca exista deja fisier in care se vor pastra modificarile ulterioare. // Si iarasi cream antet corespunzator pentru aplicatie if(Edit2->Text.ToInt()==0) { if (SavePi ctureDi al og1->Execute()) { Bitmap->Assign(Image3->Picture); Bitmap->SaveToFile(SavePictureDialog1->FileName); Edit2->Text = 1; Form1->Caption = Edit7->Text + SavePictureDialog1->FileName; } } // Semnalizam ca modificari nesalvate nu mai exista

Edit5->Text = 0; }
}

// ------------------------------------------------------------------------------------void __ fastcall TForm1::WidthClick(TObject *Sender)


{

// Pentru instrumentul de modificare a grosimii liniei cu care desenam linia arbitrara, // linia dreapta, dreptunghi si cerc cream mecanism de prevenire a caderii aplicatiei. // In cazul in care utilizatorul va seta in loc de o cifra orice alt simbol va fi afisat un mesaj // cu rugaminte de a introduce un numar try { Image3->Canvas->Pen->Width = PenWidth->Text.ToInt(); } catch(...) { ShowMessage("Please, introduce a number!"); }
}

// ------------------------------------------------------------------------------------void __ fastcall TForm1::Image3Click(TObject *Sender)


{

// La apasarea pe spatiul de lucru, cu conditia ca este activat unul dintre instrumentele enumerate // mai jos se va instala valoarea variabilei care semnalizeaza modificari nesalvate. De asemenea se // va crea antetul corespunzator. Pentru evitarea multiplicarii " - Unsaved changes" a fost instalata // conditia conform careia se verifica daca deja nu a fost adaugat in antet textul dat if(SBRect->Down || SBRectang->Down || SBFillRec->Down || SBEllipse->Down || SBFillEllipse->Down || SBErase->Down || SBBrush->Down || SBInsertText->Down || SBLine>Down || SBPen->Down) { Edit5->Text = 1; if(Edit9->Text!=Form 1->Caption) { Form1->Caption = Form1->Caption + " - Unsaved changes"; Edit9->Text = Form1->Caption; }
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

48

} } //-------------------------------------------------------------------------------------void __ fastcall TForm1::New1Click(TObject *Sender) { // Verificam daca imaginea a fost modificata sau nu (1 semnifica "da, a fost modificata") if(Edit5->Text.ToInt()== 1) { // Verificam daca imaginea anterior a fost pastrata (1 semnifica "da, a fost pastrata sau deschisa"). // Instalam valoarea variabilei Edit3 in 1 ce semnifica activarea mecanismului aparte de salvare if(Edit2->Text.ToInt()==1) { Edit3->Text = 1; Form3->ShowModal(); // Verificam daca nu a fost apasat butonul Cancel (in acest caz Edit5 devine 1). In caz daca butonul // Cancel a fost apasat imaginea ramine intacta if(Edit5->Text.ToInt()==0) { Image3->Canvas->Brush->Color = clWhite; Image3->Canvas->Pen->Color = clWhite; Image3->Canvas->Rectangle(0,0,Image3->Width,Image3->Height); Edit2->Text = 0; Edit5->Text = 0; Form3->Edit1->Text = 0; }

} // In cazul acesta salvarea sau deschiderea anterioara nu a avut loc, ce semnifica ca ar // trebui salvat intr-un fisier else if(Edit2->Text.ToInt()==0) { Edit3->Text = 2; Form3->ShowModal(); // Aici este prezent acelasi mecanism de verificare daca a fost sau nu apasat butonul Cancel if(Edit5->Text.ToInt()==0) { Image3->Canvas->Brush->Color = clWhite; Image3->Canvas->Pen->Color = clWhite; Image3->Canvas->Rectangle(0,0,Image3->Width,Image3->Height); Edit2->Text = 0; Edit5->Text = 0; Form3->Edit 1->Text = 0; } } } // In caz in care nu au fost efectuate nici un fel de modificari a imaginii se indeplineste simpla // curatire a spatiului de lucru else if(Edit5->Text.ToInt()==0) { Image3->Canvas->Brush->Color = clWhite;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

49

Image3->Canvas->Pen->Color = clWhite; Image3->Canvas->Rectangle(0,0,Image3->Width,Image3->Height); Form3->Editl->Text = 0; Edit2->Text = 0; } // Aici noi iarasi verificam daca a fost sau nu apasat butonul Cancel. Acesata parte a fost separata pentru a nu // o multiplica. In caz in care butonul Cancel nu a fost apasat are loc resetarea mecanismului Undo if(Edit8->Text.ToInt()==0) I Forml->Caption = "DSP vO.l"; Bitmap->Assign(Image3->Picture); Bitmapl->Assign(Image3->Picture); Bitmap2->Assign(Image3->Picture) Bitmap3->Assign(Image3->Picture) Bitmap4->Assign(Image3->Picture) Bitmap5->Assign(Image3->Picture) Bitmap->Assign(Image3->Picture) Bitmap7->Assign(Image3->Picture) Bitmap8->Assign(Image3->Picture) Bitmap9->Assign(Image3->Picture) Bitmapl0->Assign(Image3->Picture) Bitmapll->Assign(Image3->Picture) Bitmapl2->Assign(Image3->Picture) Bitmapl3->Assign(Image3->Picture) Bitmapl4->Assign(Image3->Picture) Bitmapl5->Assign(Image3->Picture) Reset = true; }
}

// --------------------------------------------------

void __ fastcall TForml::ManuallClick(TObject *Sender)


I

// Totul e simplu - doar chemam manualul, care reprezinta o forma aparte cu un singur obiect Memo // cu proprietatea ReadOnly setata in true Form2->ShowModal();
}

// ------------------------------------------------------------------------------------void __ fastcall TForml::FormCloseQuery(TObject *Sender, bool &CanClose)


I

// Modificari exista (1). Se porneste mecanism suplimentar de verificare. if(Edit5->Text.ToInt()== 1) I // In cazul dat (1) a avut loc salvarea anterioara sau deschiderea unui fisier. // Cum deja am mentionat prima variabila in corpul if semnalizeaza faptul ca pastrarea // sau deschiderea unui fisier a fost deja efectuata dar nu este necesara deschiderea // unui alt fisier (acest mecanism este descris mai detaliat si clar in Unit3.cpp).
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

50

// Valoarea 1 semnifica ca SaveDialog1 nu este nevoie de activat. Apoi urmeaza chemarea dialogului // de salvare if(Edit2->Text.ToInt()==1) { Edit3->Text = 1; Form3->ShowModal(); // Verificam daca butonul Cancel a fost sau nu apasat. In caz in care a fost apasat are loc aminarea // inchiderii aplicatiei if(Edit8->Text.ToInt()==1) { CanClose = false; } } // Verificam daca imaginea a fost anterior salvata (sau a fost deschisa dintr-un fisier). // In cazul dat (0) nu s-a efectuat pastrarea anterioara sau deshiderea unui fisier. // Stabilim valoarea variabilei care semnalizeaza faptul ca salvarea se efectueaza pentru prima data, // dar nu este nevoie de deschis alt fisier (0 semnalizeaza faptul ca este necesar dupa // pastrare de deschis un fisier. 2 semnifica faptul ca este nevoie de activat SaveDialog1) if(Edit2->Text.ToInt()==0) { Edit3->Text = 2; Form3->ShowModal(); if(Edit8->Text.ToInt()==1) { CanClose = false; } } } // Verificam daca imaginea a suferit modificari. In cazul dat (0) modificari lipsesc si aplicatia // este oprita (parametrul CanClose este setat in true, ceea ce permite aplicatiei de a fi inchisa). // De asemenea, inainte de inchiderea aplicatiei are loc eliberarea memoriei datorita golirii // memoriilor-bufer a mecanismului Undo if(Edit5->Text.ToInt()==0) { Bitmap->Free(); Bitmap1->Free(); Bitmap2->Free(); Bitmap3->Free(); Bitmap4->Free();

Bitmap5->Free(); Bitmap6->Free(); Bitmap7->Free(); Bitmap8->Free(); Bitmap9->Free(); Bitmap10->Free(); Bitmap11->Free(); Bitmap12->Free(); Bitmap13->Free(); Bitmap14->Free();
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

51

Bitmap15->Free(); CanClose = true; } } // -------------------------------------------------------------------------------------

Anexa 2 1. Codul de program al header-ului Form2 (Unit2.h)


// ------------------------------------------------------------------------------------#ifndef Unit2H #define Unit2H // ------------------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> // ------------------------------------------------------class TForm2 : public TForm { _ published: // IDE-managed Components TMemo *Manual; void __ fastcall FormCreate(TObject *Sender); private: // User declarations public: // User declarations _ fastcall TForm2(TComponent* Owner); }; // ------------------------------------------------------------------------------------extern PACKAGE TForm2 *Form2; // ------------------------------------------------------------------------------------#endif

2. Codul de program al prjii executive Form2 (Unit2.cpp)


// ------------------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit2.h" // ------------------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; // -------------------------------------------------------------------------------------

{ }

_ fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner)

// ------------------------------------------------------------------------------------void___ fastcall TForm2::FormCreate(TObject *Sender) { Form2->AutoSize = true;


Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

52

Form2->Caption = "Manual for DSP"; Manual->ScrollBars = ssVertical; Manual->ReadOnly = true; } // -------------------------------------------------------------------------------------

Anexa 3 1. Codul de program al header-ului Form3 (Unit3.h)


// ------------------------------------------------------------------------------------#ifndef Unit3H #define Unit3H // ------------------------------------------------------------------------------------#include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <ExtDlgs.hpp> // ------------------------------------------------------------------------------------Graphics::TBitmap *Bitmap16 = new Graphics::TBitmap; class TForm3 : public TForm { _ published: // IDE-managed Components TLabel *Label1; TButton *Button1; TButton *Button2; TButton *Button3; TEdit *Edit1; void __ fastcall Button1Click(TObject *Sender); void __ fastcall Button2Click(TObject *Sender); void __ fastcall Button3Click(TObject *Sender); void __ fastcall FormDestroy(TObject *Sender); void __ fastcall FormCreate(TObject *Sender); private: // User declarations public: // User declarations _ fastcall TForm3(TComponent* Owner); }; // ------------------------------------------------------------------------------------extern PACKAGE TForm3 *Form3; // ------------------------------------------------------------------------------------#endif

2. Codul de program al parjii executive Form3 (Unit3.cpp)


// -------------------------------------------------------------------------------------

#include <vcl.h> #pragma hdrstop #include "Unit3.h" #include "Unit1.h" // -----------------------------------------------------------------------#pragma package(smart_init)
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

53

#pragma resource "*.dfm" TForm3 *Form3; // ------------------------------------------------------------------------------------_ fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { } // ------------------------------------------------------------------------------------void __ fastcall TForm3::Button1Click(TObject *Sender)
{

// Verificam daca a fost efectuata pastrare anterioara (1 - da, 0 - nu) if(Form 1->Edit2->Text.ToInt()== 1) { // Verificam daca dorim sa efectuam simpla pastrare (1), sa deschidem un fisier (0) // sau sa sa pastram in fisier nou (2) if(Form 1->Edit3->Text.ToInt()==0) { // Verificam unde anume sa pastram (0 - in fisierul anterior pastrat, 1 - in fisierul anterior deschis) if(Edit1->Text.ToInt()==0) { Bitmap16->Assign(Form 1->Image3->Picture); Bitmap16->SaveToFile(Form 1->SavePictureDialog1->FileName); } if(Edit1->Text.ToInt()== 1) { Bitmap16->Assign(Form 1->Image3->Picture); Bitmap16->SaveToFile(Form 1->OpenPictureDialog1->FileName); } if(Form 1->OpenPictureDialog1->Execute()) { try { Form1->Image3->Picture->LoadFromFile(Form1->OpenPictureDialog1>FileName); } catch(...) { ShowMessage("Bad picture! Sorry but I am unable to open it."); } } } if(Form 1->Edit3->Text.ToInt()== 1) { if(Edit1->Text.ToInt()==0) { Bitmap16->Assign(Form 1->Image3->Picture); Bitmap16->SaveToFile(Form 1->SavePictureDialog1->FileName); } if(Edit1->Text.ToInt()== 1) { Bitmap16->Assign(Form 1->Image3->Picture); Bitmap16->SaveToFile(Form 1->OpenPictureDialog1->FileName); } } } if(Form 1->Edit2->Text.ToInt()==0)

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

54

{ if(Form 1->Edit3->Text.ToInt()==0) { if(Form 1->SavePictureDialog1->Execute()) { Bitmap16->Assign(Form 1->Image3->Picture); Bitmap16->SaveToFile(Form 1->SavePictureDialog1->FileName); Edit1->Text = 1; if(Form 1->OpenPictureDialog1->Execute()) { try { Form1->Image3->Picture->LoadFromFile(Form1->OpenPictureDialog1->FileName); } catch(...) { ShowMessage("Bad picture! Sorry but I am unable to open it."); } } } } if(Form 1->Edit3->Text.ToInt()==2) { if(Form 1->SavePictureDialog1->Execute()) { Bitmap16->Assign(Form 1->Image3->Picture); Bitmap16->SaveToFile(Form 1->SavePictureDialog1->FileName); } } } // Setam vlorile variabilelor din Forml (s-a efectuat pastrarea, nu exista modificari nesalvate // si aplicatia poate fi inchisa Form1->Edit2->Text = 1; Form1->Edit5->Text = 0; F orm 1->Edit8->Text = 0; // Eliberam memoria Bitmap16->Free(); // Inchidem Form3 Form3->Close();
}

// ------------------------------------------------------------------------------------void __ fastcall TForm3::Button2Click(TObject *Sender)


{

if(Form 1->Edit3->Text.ToInt()==0) { if(Form 1->OpenPictureDialog1->Execute()) { try { Form1->Image3->Picture->LoadFromFile(Form1->OpenPictureDialog1->FileName); } catch(...) { ShowMessage("Bad picture! Sorry but I am unable to open it."); } } } if(Form 1->Edit3->Text.ToInt()== 1) { Form3->Close(); } Form1->Edit5->Text = 0;
Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

55

F orm 1->Edit8->Text = 0; Bitmap16->Free(); Form3->Close(); } // ---------------------------------

void___fastcall TForm3::Button3Click(TObject *Sender) { Form1->Edit5->Text = 1; F orm 1->Edit8->Text = 1; Form3->Close(); } // ------------------------------------------------------------------------------------void___fastcall TForm3::FormDestroy(TObject *Sender)
{ }

Bitmap10->Free(); // ------------------------------------------------------------------------------------void___fastcall TForm3::FormCreate(TObject *Sender)


{

// Setam variabila si proprietatile a componentelor Edit1->Text = 0; Form 1->SavePictureDialog1->DefaultExt=M.bmpM; Form 1->SavePictureDialog1->Filter="Bitmaps (*.bmp)|*.bmp"; Form 1->OpenPictureDialog1->DefaultExt=".bmp"; Form 1->OpenPictureDialog1->Filter="Bitmaps (*.bmp)|*.bmp"; Edit1->Visible = false; Form3->Caption = "Warning!"; Form3->AutoSize = true; Form3->Top = 400; Form3->Left = 400; } // -------------------------------------------------------------------------------------

Coala

Mod. Coala

document.

Semnat.

Data

CPAE 525.1 091 01 ME

56