GC.Collect();
e = null; }
Console.WriteLine("Stiva= {0} MB",GC.GetTotalMemory(false) >> 20);
Console.WriteLine("Nr. colectari GC= {0}",GC.CollectionCount(0));
};
workQueue = null;
GC.Collect();
System.Console.ReadLine();
}}
Salvati fila cu numele TestMemorie1.cs si compilati.In exemplul de mai
sus,obiectul memFailPoint va detecta la un moment dat ca memoria de
executie este insuficienta (daca memoria de RAM este mai mica decat 1536
MB).In caz contrar ajustati valoarea din constructor).Mai mult decat atat,
in functia catch (declansata de mesajul de eroare emis) este inclusa si
o operatie de eliberare automata a memoriei,pentru a permite continuarea
facila a executiei.Acest gen de solutii se pot proiecta pentru depanarea
automata a programelor ce lucreaza cu baze de date mari,sau cu resurse
de dimensiune variabila.Este util sa aplicati cateva bucle de acest gen
si in etapa de testare si depanare a unui program,pentru a depista orice
situatie in care memoria de executie atinge o cota critica.Astfel,pentru
executia unei aplicatii vizuale,este recomandabil ca in orice moment al
executiei sa ramana cel putin 200 MB de memorie libera.Pentru aplicatiile
de tip Consola,acest gen de masuri de precautie sunt de obicei inutile.
Calculatoarele au o configuratie hardware extrem de polimorfa.Daca
proiectati o rutina de depanare automata,este bine ca setarea obiectului
de tip MemoryFailPoint sa se faca in functie de valoarea memoriei de RAM
instalate (utilizati si o functie pentru detectia RAM-ului instalat).
MemoryFailPoint se combina eficient cu GC.Collect.
-109-
System.Media
Contine clasele necesare pentru a putea executa un fisier audio de
tip .wav,sau pentru a putea deschide fisierele de sunet ale sistemului.
Include urmatoarele clase: SoundPlayer,SystemSound si SystemSounds.
Clasa SoundPlayer construieste un obiect complex,ce poate fi utilizat
pentru monitorizarea fondului sonor din aplicatie.Principalele metode
sunt destinate pentru a putea incarca si executa un fisier audio,fie
in mod asincron (thread unic), fie sincron (in mediu multithreading).Daca
executia este asincrona,fisierul va fi interpretat fara intrerupere de
la un capat la altul,iar daca este executat sincron, fisierul va fi
impartit in fragmente mici ce vor fi executate concomitent cu alte
operatii sincrone.Daca se combina cu alte obiecte,se poate obtine un
manager de sunet complex,cu mai multe fisiere sonore si mai mai multe
linii de executie.Cel mai simplu SoundPlayer apeleaza metodele Load() si
Play().
EXEMPLU:
using System;
using System.Drawing;
using System.Media;
using System.Windows.Forms;
public class Form1 : Form {
public static void Main() { Application.Run(new Form1()); }
private Button button1;
public Form1(){
button1 = new Button();
button1.Left = 200;
button1.Text = "Play";
button1.Click += new EventHandler(button1_Click);
this.Controls.Add(button1);
}
private void button1_Click(object sender,System.EventArgs e)
{
SoundPlayer player = new SoundPlayer();
player.SoundLocation = "Andante.wav";
player.Load();
player.Play();
MessageBox.Show("Exit ?","");
Application.Exit();
}}
Salvati fila cu numele Sound.cs si compilati.
In continuare,aplicatia se poate dezvolta astfel: se adauga un buton
conectat la un obiect de tip OpenFileDialog pentru a permite alegerea
oricarei file din memorie,se adauga un buton ce controleaza metoda:
Player.Stop,se adauga butoane ce permit executia sincrona sau asincrona,
...etc.
Obiectul SoundPlayer nu contine codec-urile pentru fisierele audio
de alt tip decat WAV (MP3,CD Audio,MPEG sau MIDI...etc).Toate celelalte
fisiere audio vor putea fi deschise si executate doar dupa conversia la
formatul .wav.
-110-
System.IO
Contine clasele necesare pentru organizarea unitatilor de memorie si
pentru operatii de intrare/iesire a datelor.Exemplu: citirea sau scrierea
datelor intr-o fila,sau intr-un director.Clasele DirectoryInfo,DriveInfo,
FileInfo si FileSystemInfo,ofera informatii despre unitatile de memorie.
EXEMPLU: using System;
using System.IO;
class TestMemorie {
public static void Main(){
DriveInfo[] unitati = DriveInfo.GetDrives();
foreach(DriveInfo d in unitati){
Console.WriteLine("Unitatea: {0}",d.Name);
Console.WriteLine("Este de tip: {0}",d.DriveType);
if (d.IsReady == true) {
Console.WriteLine("Formatul= {0}", d.DriveFormat);
Console.WriteLine(
"Memoria libera: {0,15} Mb",d.TotalFreeSpace >> 20);
Console.WriteLine(
"Total memorie: {0,15} Mb",d.TotalSize >> 20);
Console.ReadLine();
} } } }
Salvati fila cu numele DriveInfo1.cs si compilati.
Clasa File,controleaza operatiile din interiorul unei file.
EXEMPLU: using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
public class Form1 : Form{
public static void Main() { Application.Run(new Form1()); }
private Button buton1;
private RichTextBox text1;
public Form1() {
this.Size = new Size (800,600);
buton1 = new Button();
buton1.Left = 20;
buton1.Text = "Citeste fila";
buton1.Click += new EventHandler(buton1_Click);
text1 = new RichTextBox();
text1.Location = new Point(30,40);
text1.Size = new Size(700,500);
text1.Font = new Font("Modern",14,FontStyle.Bold);
this.Controls.Add(buton1);
this.Controls.Add(text1); }
private void buton1_Click(object sender,System.EventArgs e){
text1.Clear();
string path = @"C:\\Fructe.txt";
string[] readText = File.ReadAllLines(path);
foreach (string sir in readText)
text1.AppendText(sir + "\n");
}}
Salvati fila cu numele CitesteFila.cs si compilati.
-111-
In exemplul de mai sus,se utilizeaza un obiect de tip File,pentru a
citi datele dintr-o fila de tip text,si un obiect de tip RichTextBox,
pentru a prezenta datele cu un font special.Datele citite pot fi procesate
analizate,filtrate sau reformatate si apoi pot fi salvate intr-o fila
noua.
EXEMPLU: using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
public class Form1 : Form{
public static void Main() { Application.Run(new Form1()); }
private Button buton1;
private RichTextBox text1;
public Form1() {
this.Size = new Size (800,600);
buton1 = new Button();
buton1.Left = 20;
buton1.Text = "Citeste fila";
buton1.Click += new EventHandler(buton1_Click);
text1 = new RichTextBox();
text1.Location = new Point(30,40);
text1.Size = new Size(700,500);
text1.Font = new Font("Modern",14,FontStyle.Bold);
this.Controls.Add(buton1);
this.Controls.Add(text1); }
private void buton1_Click(object sender,System.EventArgs e){
text1.Clear();
string path = @"C:\\Fructe.txt";
string final = "";
string[] readText = File.ReadAllLines(path);
foreach (string sir in readText){
final = "";
string[] arie2 = sir.Split(new Char[] {'!','.',',',':','?'});
foreach (string sir2 in arie2)
final = final + sir2 + "|";
text1.AppendText(final + "\n");
using (StreamWriter sw = File.AppendText(@"C:\\Salvare.txt"))
{ sw.WriteLine(final); }
}}}
Salvati fila cu numele ScrieFila.cs si compilati.Fata de exercitul
precedent,observati ca fiecare rand citit din fila este separat in functie
de semnele de punctuatie,in siruri.Apoi,fiecare semn de punctuatie este
inlocuit prin separatorul "|" (adica textul este reformatat).In final se
construieste un obiect de tip StreamWriter pentru a scrie datele intr-o
fila noua,special creata.
System.IO contine numeroase stream-uri specializate : BinaryReader,
BinaryWriter,BufferedStream,FileStream,MemoryStream,Stream,StreamReader,
StreamWriter,TextReader,TextWriter.Cititi cu atentie proprietatile si
metodele fiecarui stream,inainte de a alege obiectul care se potriveste
cel mai bine cu necestiatile din aplicatie.Oferta este foarte bogata si
extrem de maleabila.
-112-
System.Diagnostics
Contine clase ce permit o serie de operatii de mententanta,printre
care merita remarcate: monitorizarea performantei sistemului si a
proceselor aflate in executie,monitorizarea conexiunilor active cu alte
aplicatii si resurse din retea (event logs).Dintre aceste clase,trebuie
mentionate: Debug,EventLog,PerformanceCounter,Process,Stopwatch,Switch,
Trace si TraceListener.
O etapa importanta in monitorizarea sistemului de operare o reprezinta
evaluarea proceselor aflate in executie.Pentru acest scop,se poate apela
la clasa Process.
EXEMPLU:
using System;
using System.Diagnostics;
using System.ComponentModel;
class Procese{
static void Main(){
Process [] localAll = Process.GetProcesses();
foreach (Process p1 in localAll)
{
Console.Write("Id = {0} ",p1.Id);
Console.WriteLine("Nume = {0}",p1.ProcessName);
}
Console.ReadLine();
}}
Salvati fila cu numele Procese.cs si compilati.
O astfel de aplicatie este asemanatoare cu Task Manager din Windows XP,
si poate fi apelata in orice moment,pentru a identifica ce procese se
afla in executie intr-un anumit moment dat.Identificarea proceselor are
rost doar in cazul mediului de executie multitasking,cu mai multe procese
executate in paralel.Identificarea proceselor este esentiala atunci cand
se supraincarca memoria de operare si atunci cand doriti sa echilibrati
dimensiunea modulelor ce formeza o aplicatie,pentru a creste viteza de
executie.
Clasa Process se poate utiliza si pentru a lansa in executie un anumit
process,sau un anumit modul executabil.
EXEMPLU:
using System;
using System.Diagnostics;
using System.ComponentModel;
class ProcesNou {
start void main() {
Process.Start("Iexplore.exe","www.gsp.ro");
}}
Salvati fila cu numele Proces1.cs si compilati.Exemplul de mai sus
deschide automat fila gsp.ro cu browserul implicit (IExplore.exe).In
mod similar,puteti deschide automat doua sau mai multe module,necesare
pentru a crea mediul de memorie in care se desfasoara aplicatia,sau pur
si simplu pentru a deschide simultan programele preferate.
-113-
O alta activitate de mentenanta pentru sistem,implica cronometrarea
duratei de executie pentru anumite pocese,sau seturi de operatii.Pentru
simplificarea acestei activitati,System.Diagnostics contine un cronometru
simplu,extrem de usor de implementat: se creaza obiectul, se porneste cu
Start,se opreste cu Stop si apoi se evalueaza timpul scurs cu ajutorul
proprietatii Elapsed.
EXEMPLU:
using System;
using System.Diagnostics;
using System.Windows.Forms;
public class Form1: Form{
public static void Main() { Application.Run(new Form1()); }
private Button buton1,buton2;
private RichTextBox t1;
private Stopwatch s1;
public Form1(){
buton1 = new Button();
buton1.Left = 120;
buton1.text = "Start";
buton1.Click += new EventHandler(buton1_Click);
buton2 = new Button();
buton2.Left = 210;
buton2.Text = "Stop";
buton2.Click += new EventHandler(buton2_Click);
t1 = new RichTextBox();
s1 = new Stopwatch();
this.Controls.AddRange(new Control[]
{ buton1,buton2,t1} );
}
private void buton1_Click(object sender,System.EventArgs e) {
t1.Clear();
t1.Appendtext("Start cronometru" + "\n");
s1.Start();
}
private void buton2_Click(object sender,System.EventArgs e) {
s1.Stop();
TimeSpan ts = s1.Elapsed;
string interval = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours,ts.Minutes,ts.Seconds,ts.Miliseconds / 10);
t1.AppendText(interval + "\n");
t1.Appendtext("Stop cronometru");
}}
Salvati fila cu numele Cronometru.cs si compilati.Observati ca timpul
scurs intre Start si Stop este salvat in proprietatea Elapsed sub forma
unei date de tip TimeSpan,adica separat in ore,minute secunde si milisec.
Cronometrarea proceselor are rost atat pentru a evalua performanta
sistemului,cat si pentru a stabili intervalele de timp la care urmeaza
sa fie puse in executie procesele automate ("timeing-ul" unor procese).
Deasemenea,cronometrul se poate utiliza si pentru a limita timpul de
acces la o anumita resursa.
-114-
Debug si Trace sunt doua clase concepute special pentru depanarea
codului,sau pentru a urmari parametrii de executie ai unei aplicatii.
Se utilizeaza alternativ iar compilarea trebuie facuta cu optiunile:
d/DEBUG si respectiv d/TRACE.Cele doua clase sunt practic identice si
sunt destul de asemanatoare cu Console.Out,dar adauga si cateva metode
specifice: Assert,Fail,Indent si Unindent precum si un set complet de
metode Write si WriteLine.Practic,cele doua clase se utilizeaza pentru
a scrie output intr-un stream de iesire.In timpul executiei,datele marcate
cu Trace sau Debug vor fi selectate si extrase pentru postanaliza.
EXEMPLU:
using System;
using System.IO;
using System.Diagnostics;
class Test {
static void Main(){
Console.WriteLine("Vezi fila Depanare.txt");
FileStream fs = new FileStream("Depanare.txt",FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
Console.SetOut(sw);
Console.WriteLine("Inceputul inregistrarii:");
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
Trace.AutoFlush = true;
Trace.Indent();
int x;
x= 23 + 7;
x= x + 15;
x= x * 3;
Trace.WriteLine("Valoarea actuala a lui x este: ");
Trace.WriteLine(x);
Trace.Unindent();
sw.Close();
Console.ReadLine()
}}
Salvati fila cu numele Trace1.cs si compilati cu: csc /d:TRACE Trace1.cs
in exemplul de mai sus,datele pentru output sunt dirijate spre o fila
text externa.In acest mod,se poate urmari o anumita valoare in cursul unor
operatii succesive,sau se pot verifica diferiti parametri in momente
succesive ale executiei.O astfel de fila,se poate crea si pentru a arhiva
valorile introduse de utilizator in timpul executiei (pentru back-up).
Datele marcate cu Trace sau Debug pot fi trimise simultan spre mai
multe locatii.Pentru acest scop,se adauga cate un Listener pentru fiecare
dintre locatiile dorite.Exemplu: se pot dirija datele simultan spre o
fila de arhivare,spre Console si spre o fereastra de tip text.Colectia de
auscultatori (Listeneri) este comuna pentru ambele clase,dar datele nu se
pot incrucisa deoarece la compilare se utilizeaza doar una dintre optiuni.
Acest mecanism a fost conceput pentru depanarea codului,dar se poate
aplica pentru diverse alte scopuri.Exemple: se pot arhiva preferintele
fiecarui utilizator,se pot analiza numarul de executii si optiunile alese,
se poate genera un raport de executie...etc.
-115-
Microsoft Visual C# 2008 Express Edition
In capitolele anterioare au fost prezentate elementele de baza ale
limbajului C# si structura platformei .Net.Notiunile prezentate sunt
suficiente pentru a putea dezvolta programe mici,cu fila unica sau cu
un numar limitat de resurse si module executabile.Pentru a favoriza
dezvoltarea unor aplicatii complexe,la standard profesional,compania
Microsoft a dezvoltat si oferit programatorilor un set de interfete
visuale,cu scopul de a simplifica managementul resurselor,designul visual,
conceptia si depanarea codurilor.Aceste interfete sunt grupate sub numele
de Visual C# Express Edition si au fost publicate in mai multe versiuni,
denumite in functie de anul aparitiei (2005,2008,2010...etc).
O astfel de platforma ofera urmatoarele facilitati:
-un compilator pentru limbajul C#,incorporat (asemanator cu csc.exe)
-un Help visual interactiv,denumit IntelliSense
-o fereastra speciala pentru output de tip Debugg si Trace
-un mediu vizual de design pentru obiectele de tip Windows Forms
-suport logistic pentru bibliotecile Windows Presentation Foundation (WPF)
-suport logistic pentru aplicatiile ce contin baze de date locale
-limbaj integrat pentru interogari (LINQ)
-acces la serviciile de tip Windows Communication Foundation (WCF)
Platforma contine mai multe interfete,specializate pentru un anumit
tip de aplicatie.Cu ajutorul lor,se pot creea:
-aplicatii Windows cu ferestre de tip Form
-aplicatii Windows de tip Window Presentation Foundation
-aplicatii de tip Console (similare cu cele prezentate anterior)
-biblioteci de clase si biblioteci DLL
-aplicatii pentru baze de date ce utilizeaza serverul SQL
-jocuri PC bazate pe tehnologia DirectX
Mai mult decat atat,platforma vizuala nu numai ca organizeaza automat
toate filele de resurse, dar ofera si un schelet de cod,in care nu mai
trebuie decat sa completati expresiile ce formeaza aplicatia.In acest mod,
programele vor avea o structura standardizata,foarte usor de urmarit si
depanat,chiar daca programul a fost editat de un alt programator.Daca se
respecta scheletul construit automat,programele vor putea fi depanate mai
usor si utilizand programe de verificare automatizate.
Toate aceste facilitati,grupate la un loc,formeaza mediul software in
care urmeaza sa fie dezvoltat programul si poarta numele de Integrated
Development Enviroment (IDE).Principalele instrumente de lucru din IDE
sunt:
-Code Editor : este fereastra in care se editeaza codurile
-Windows Form Designer : este instrumentul pentru design visual
-Data Explorer : permite vizualizarea datelor din bazele de date
-Debugger: afiseaza erorile depistate de compilator
-Toolbars: sunt barele pentru instrumente visuale
-Project Node: prezinta arborele binar al filelor de resurse
-Class View: afiseaza proiectul sub forma de clase si metode
-Output window: afiseaza informatiile generate in timpul constructiei
-Properties window: afiseaza proprietatile obiectelor
-Toolbox window: contine obiectele pentru design
-Task List: afiseaza lista de sarcini aflate pe rol
-116-
Programul poate fi descarcat de la adresa www.microsoft.com.Instalarea
nu ridica probleme deosebite.Este recomandabil sa instalati si referinta
Help MSDN Express Library.Dupa instalare,este recomandabil sa urmariti si
aplicatia video in care este prezentata interfata visuala,afisata in
caseta Getting Started sub numele: Video Feature Tour.Un alt wizard simplu
denumit: Create Your First Application,prezinta primii pasi necesari
pentru a creea o aplicatie simpla.Daca doriti sa verificati cunostiintele
dobandite in capitolele anterioare,este bine sa incepeti cu o aplicatie
de tip Consola.
EXEMPLU:
Din meniul File,alegeti New Project si apoi selectati optiunea Console
Application.Se va deschide automat o fila de tip text,cu extensia .cs,
denumita Program.cs in care este preeditat scheletul aplicatiei format
din namespace ConsoleApplication1,o clasa denumita Program si functia
Main().Pentru a gestiona resursele aplicatiei,puteti utiliza fereastra
denumita: Solution Explorer (la stanga ecranului).In aceasta fereastra
puteti naviga prin intregul mediu de dezvoltare (IDE) si puteti observa
toate filele din proiect.In aceasta etapa nu figureaza decat fila de
start: Program.cs.
Sa presupunem ca doriti sa editati un executabil cu care sa deschideti
automat ziarul preferat (Gazeta Sporturilor).Este necesar sa adaugati in
lista de resurse si: using System.Diagnostics.
Apoi includeti in functia Main() urmatoarea linie de comanda:
Process.Start("Iexplore.exe","www.gsp.ro");
Pentru a compila si previzualiza proiectul apasati tasta F5.
Daca nu exista nici o eroare,proiectul va fi compilat si executat.Acelasi
rezultat se poate obtine si selectand meniul Build si apoi Build Solution.
Daca exista erori,acestea vor fi afisate in fereastra de depanare rapida
denumita: Error List.In caz ca utilizati un alt browser implicit,trebuie
sa specificati denumirea si adresa corecta.
Daca doriti sa schimbati numele aplicatiei,sau numele clasei inlocuiti
identificatorul namespace (Exemplu: ProgramulMeu) si respectiv cel al
clasei (Exemplu: Gazeta Sporturilor).Apoi reconstruiti cu Build sau cu
Rebuild Solution.
In final,salvati programul selectand Build si Publish.
Se va deschide un wizard automat in care apasati butonul Browse si alegeti
adresa de destinatie.Puteti alege modul de arhivare,in functie de
utilizarea finala.Alegeti instalarea de pe CD sau DVD.Aplicatia nu va fi
actualizata in viitor,asa ca puteti utiliza optiunea implicita.
Aplicatia a fost salvata cu numele implicit: ConsoleApplication1.In
continuare,programul va oferi cate un nume implicit pentru fiecare proiect
nou: ConsoleApplication2....etc.Daca doriti sa folositi un nume ales de
d-voastra,utilizati fereastra Solution Explorer pentru a schimba numele
proiectului,sau cel al modulului executabil.
Inainte de a parasi proiectul,este bine sa salvati fila .cs,cu optiunea
SaveAs,la aceeasi adresa la care a fost publicat proiectul.Fila este
salvata si implicit,dar la o adresa mult mai greu de navigat.
In continuare,pentru a putea actualiza sau modifica proiectul,puteti
sa redeschideti fila .cs cu optiunea Open File.
Pentru a beneficia de utilitarul IntelliSense,este suficient sa
amplasati indicatorul mouse pe codul dorit (in fereastra de editare).
-117-
Windows Forms Application
Termenul de "visual" aplicat platformei Microsoft Visual C sharp,
provine de la fereastra de design in care toate obiectele visuale pot fi
previzualizate inca din etapa de editare a programului.In aceasta ferastra
se va proiecta aspectul interfetei grafice cu utilizatorul.Principalul
avantaj il reprezinta faptul ca obiectele se pot redimeniona sau pot fi
repozitionate dupa bunul plac,cu ajutorul indicatorului mouse.Nu mai este
necesar sa recompilati codul progresiv,de zeci de ori,pentru a obtine
rezultatul scontat.Pur si simplu,asezati obiectele pe panoul de lucru si
apoi alegeti culorile,dimensiunile,pozitia,grupurile de obiecte...etc.
Inca din etapa de design,obiectele cu care lucrati sunt obiectele
reale din program,cu proprietati,metode si evenimente.Pentru a observa
toate amanuntele unui obiect,se poate utiliza fereastra Properties.Daca
aveti un minimum de experienta cu orice alta platforma visuala (Delphi,
C,Visual Basic etc.),interfata grafica din C# va fi extrem de usor de
exploatat.In caz contrar,este recomandabil sa utilizati un tutorial din
reteaua Internet.Acest manual nu va prezenta exhaustiv toate operatiile
si tastele short-cut,sau strategiile de design grafic,ci va prezenta doar
cateva solutii simpliste,exemplificative.
Frecvent,incepatorii deschid platforma de lucru,inainte de a sti exact
ce anume doresc sa faca.Apoi se orienteaza "vazand si facand",pana cind
programul este cat de cat functional.Pentru a realiza programe bune,este
esential ca munca sa inceapa fara calculator.In prima etapa,trebuie sa
formulati clar premiza programului: ce anume doriti sa faca.In etapa
urmatoare,este recomandabil sa va imaginati cum anume doriti sa fie
interfata cu utilizatorul: cu butoane,cu casete de dialog,cu diagrame si
grafice interactive,prezentare video sau audio...etc.Apoi este bine sa
desenati pe hartie schema de baza,cu obiectele si pozitia lor relativa.In
cazul programelor complexe,este util sa desenati si o diagrama de flux,in
care sa proiectati ordinea de executie a principalelor seturi de operatii.
Diagramele nu trebuie sa contina amanunte si solutii tehnice,ci doar
schema de principiu.Solutiile se vor dezvolta ulterior,in functie de
complexitatea mediului de executie.In etapa urmatoare,studiati atent toate
resursele oferite de platforma .Net si alegeti cu atentie obiectele pe
care doriti sa le exploatati,apoi alegeti metodele si proprietatile cu
care doriti sa implementati functionalitatea programului.De cele mai multe
ori,exista doua sau mai multe obiecte asemanatoare.Exemplu: pentru a stoca
temporar seturi de date se pot utiliza: arii de date,liste,dictionare,
stive,colectii,stream-uri etc.Alegerea se va face atat in functie de
experienta d-voastra anterioara,cat si in functie de mediul de executie.
Pe cat posibil,se va alege solutia ce mai simpla,cu minimum de operatii
si cu minimum de consum de memorie.Daca aveti o solutie prefabricata din
alt program,va fi intotdeauna usor de adaptat,sau de reutilizat.Este bine
sa utilizati obiectele cu care sunteti deja familiarizati si solutiile
tehnice pe care le stapaniti cel mai bine.In momentul in care deschideti
platforma de lucru,trebuie sa stiti exact ce anume doriti sa faceti si
cum.Daca programul va avea nevoie si de resurse software externe,este
indicat sa organizati toate aceste resurse inainte de a incepe editarea
programului.La nevoie,este bine sa va consultati si cu persoane ceva mai
experimentate,inainte de a incepe munca propriu zisa.
-118-
Platforma Visual este un mediu de dezvoltare foarte comod,dar nu face
minuni.Se utilizeaza exact aceleasi obiecte si tehnici de programare ca
si in cazul compilatorului csc.exe.Diferenta consta in fereastra de
design visual si in cele cateva instrumente ajutatoare,menite doar sa
simplifice organizarea si conceptia programului.Orice program creat cu
Visual C# poate fi creat sau transpus si pentru alte compilatoare de C#.
Exemplu OpenFile
Pentru un prim exemplu,sa presupunem ca doriti sa creati o aplicatie
de tip Windows cu care sa puteti deschide orice fila de tip text,cu un
anumit set de fonturi.Programul va utiliza o fereastra,un buton si un
obiect RichTextBox pentru afisarea textului.Pentru a simplifica cat mai
mult navigarea se va utiliza un obiect de tip OpenFileDialog.Cele trei
obiecte vor functiona in felul urmator:
1. -la apasarea butonului se deschide obiectul OpenFileDialog cu metoda
ShowDialog()
2. -dupa selectarea filei,textul este copiat intr-un strem si apoi
transferat in obiectul de afisare RichTextBox,folosind metoda
LoadFile()
Dupa proiectarea schemei de principiu,se poate trece la implementare.
Din meniul File,alegeti New Project si apoi Windows Forms Application.
Se va deschide automat fila de proiect WindowsFormsApplication1.Observati
fereastra Form1.cs[Design] in care este afisata fereastra Form1 si cele
doua ferestre ajutatoare: Solution Explorer si Properties.In plus,la
dreapta ecranului este afisata o bara de instrumente (Toolbox) in care
sunt afisate toate obiectele visuale de tip Windows Forms.Daca doriti sa
limitati numarul de obiecte afisate,executati un click pe butonul de
langa textul: All Windows Forms si alegeti alt meniu:
Exemplu: Common Controls
Fereastra Form1.cs,este fereastra de design in care se va proiecta
interfata grafica cu utilizatorul.In aceasta fereastra,obiectele visuale
vor fi afisate asa cum vor fi reprezentate si in programul final.
Pentru a schimba numele proiectului,alegeti din meniul Project,
optiunea Properties (ultima) si apoi alegeti numele dorit pentru
Assembley Name: Exemplu: FilaText
Apoi folositi cursorul orizontal si alegeti un nume pentru
Default namespace: Exemplu: FilaText
In aceasi interfata,puteti alege versiunea platformei .Net utilizata
ca sursa pentru resurse,tipul de output,obiectul de start si imaginea
icon folosita pentru executabilul creat,tipul de manifest si resursele
incluse automat.Restul meniurilor din interfata permit setarea altor
proprietati din proiect.
Fereastra Form1 este fereastra Windows utilizata ca suport (container)
pentru restul obiectelor din program.Pentru a schimba aspectul acestei
ferestre,selectati fereastra cu un click si apoi urmariti fereastra
Properties.Pentru a schimba numele ferestrei,alegeti proprietatea Text
si editati noul nume: Afisare text
Fereastra este insa prea mica pentru a cuprinde o pagina de text.
Alegeti proprietatea Size si schimbati valorile cu: 800;600
Daca doriti o alta culoare de fond,puteti utiliza proprietatea
BackColor sau puteti adauga o imagine cu BackgroundImage.
Proprietatea Location poate seta pozitia ferestrei pe ecran.
-119-
Daca doriti sa studiati si codul aflat in spatele ferestrei de design
executati un dublu click pe fereastra.Se va deschide fereastra Form1.cs
in care puteti observa bibliotecile importate automat si scheletul de
cod creat implicit.Proiectul utilizeaza implicit spatiul denumit
WindowsFormsApplication1.Daca doriti un alt identificator pentru namespace
puteti schimba acest nume,dar va trebui sa repetati operatia pentru toate
filele de cod din program.Daca doriti sa vedeti si fila principala din
program,alegeti din fereastra Solution Explorer fila Program.cs.In
aceasta fila se gaseste functia Main() si link-urile spre restul filelor
din program.
Apoi reveniti la fereastra From1.cs[Design] pentru a continua
dezvoltarea interfetei.Alegeti din Toolbox un obiect de tip Button si
trageti cu butonul mouse apasat pana cand obiectul apare in fereastra
Form1.Asezati butonul in pozitia dorita si apoi schimbati textul in
fereastra Properties,alegand proprietatea Text:
Exemplu: Citeste Textul
La nevoie redimensionati obiectul.
In continuare,alegeti din Toolbox si trageti in fereastra un obiect
de tip RichTextBox.Amplasati obiectul imediat sub buton si apoi
schimbati proprietatea Size la valorile: 725;475
Alegeti fontul preferat,cat mai usor de citit:
Exemplu: Microsoft Sans Serif;12pt;style Bold.
Pentru a seta fontul,apasati butonul ... din proprieatatea Font.
Cele trei obiecte,vor forma interfata grafica cu utilizatorul.Daca
nu sunteti multumiti de aspect,utilizati fereastra Properties pentru
a schimba culorile,pozitia,dimensiunile...etc.
Pentru a simplifica functionalitatea,selectati din Toolbox si trageti
in fereastra si un obiect de tip OpenFileDialog.Acest obiect nu este
visual in forma neactivata,asa ca nu va fi reprezentat in fereastra
Form1,dar va aparea in fereastra de design sub forma unei pictograme mici
insotita de numele obiectului: openFileDialog1.
In continuare se poate dezvolta functionalitatea programului.Pentru
a edita metoda Click() a butonului,este suficient sa executati un dublu
click pe buton (sau alegeti butonul Events din fereastra Properties)
Se va afisa fereastra Form1.cs cu scheletul metodei gata editat.
Completati intre acolade urmatoarea expresie:
openFileDialog1.ShowDialog();
Apoi trebuie editata metoda Click pentru butonul Open din obiectul
openFileDialog1 (cel cu care se alege fila text).Pentru acest scop,
selectati obiectul openFileDialog1 si alegeti din fereastra Properties
butonul Events (cel cu un fulger),apoi executati un dublu click pe
evenimentul FileOk.Completati metoda astfel:
Stream myStream = null;
try { if((myStream = OpenFileDialog1.OpenFile()) != null)
{ using (myStream)
{ richTextBox1.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}}}
catch (Exception ex)
{ MessageBox.Show("Nu gasesc fila.Eroare: " +ex.Message); }
Programul este deja complet si functional.
-120-
In aceasta configuratie,obiectul OpenFileDialog va deschide automat
toate filele din directorul selectat.Pentru a simplifica alegerea
filelor de tip text,se poate seta un filtru,cu ajutorul proprietatii
Filter.Pentru acest scop,alegeti obiectul openFileDialog1 din fereastra
de design,utilizati fereastra Properties si editati proprietatea Filter
astfel: (*.txt)|*.txt
Inainte de compilare,verificati fereastra Error List.In mod normal
apare un mesaj de avertizare,prin care se semnaleaza faptul ca tipul
Stream nu este definit in program.Executati un dublu click pe Form1 si
adaugati in lista de biblioteci si System.IO
Acum fereastra Errors este goala si se poate trece la compilarea si
previzualizarea aplicatiei.
Apasati tasta F5.
Daca nu a intervenit nici o eroare,programul este functional.Puteti
naviga pe intregul disc,si puteti deschide orice fila de text,utilizand
fonturile preferate.Este momentul pentru ultimele ajustari.Daca nu
sunteti multumiti de fonturi,sau de incadrarea in pagina,puteti sa
alegeti alte fonturi,sa schimbati dimensiunile ferestrei sau cele ale
casetei RichTextBox.Optional,modificati culorile,adaugati unul sau mai
multe obiecte Label cu explicatiile dorite,sau afisati numele si sigla
d-voastra pentru a semnala autorul programului...etc.
In final,construiti aplicatia cu Build,salvati programul cu Publish si
la final salvati si proiectul,pentru a putea fi dezvoltat sau modernizat
ulterior.Este util sa pastrati toate filele de cod,pentru a putea
reutiliza in viitor,unele secvente de cod,sau chiar module intregi.
De exemplu,aceasta aplicatie va putea fi inclusa integral,intr-un
program mai mare,sub forma unui modul extern.Pur si simplu adaugati in
interfata respectiva un buton,care la metoda Click lanseaza in executie
acest modul ( cu Process.Start()).
Acest gen de aplicatie a fost exemplificat si pentru compilatorul
csc.exe.Daca doriti sa procedati ca un profesionist,puteti analiza putin
cele doua aplicatii,comparativ: -timpul de executie,viteza de executie,
spatiul de memorie ocupat,portabilitatea pe alte platforme,integrarea in
alte programe,depanarea si compilarea,operatiile de design...etc.
In continuare,puteti utiliza aceasta aplicatie pentru a verifica o
parte dintre instrumentele ajutatoare oferite de platforma visuala.
Astfel,daca selectati una dintre filele de cod,de exemplu Form1.cs
observati ca deasupra ferestrei de editare exista si doua casete de tip
ListBox ce permit sa va orientati mai usor in program.Prima dintre ele
ofera un link spre alte ferestre si module din program,iar cea de a doua
ofera un link spre principalele structuri din fila existenta.
Exemplu: pentru a cauta codul pentru metoda Click() pentru butonul
button1 este suficient sa alegeti in cea de a doua caseta optiunea
button1_Click() si codul va fi derulat automat pana la metoda dorita.
Acest navigator automat,poate fi foarte util in cazul filelor foarte mari.
In exemplul de mai sus,am pastrat toate denumirile implicite create
automat.Daca doriti,puteti sa inlocuiti toti identificatorii cu alte nume
mai scurte si mai comode.Viata d-voastra va fi mult mai usoara,dar se va
complica munca oricarui alt programator,obisnuit sa pastreze aceste nume
implicite.Alegerea va apartine si depinde si de destinatia finala a
programului: freeware,shareware,strict privat,comercial...etc.
-121-
Exemplu Album Foto
Atunci cand o aplicatie Windows utilizeaza si file de resurse externe,
exista doua tipuri de solutii pentru implementare:
1.resursele sunt fixe,caz in care pot fi importate si inglobate
permanent in aplicatie
2.resursele sunt variabile,in functie de dorinta utilizatorului si
trebuie importate sau eliberate dinamic prin operatii de tip I/O.
Prima situatie este banala si nu necesita o descriere separata.Pur si
simplu se importa fila de resurse in proiect,fie direct fie intr-un
director special denumit Resources (creat implicit).Pur si simplu se
trage fila cu butonul mouse apasat,spre fereastra Solution Explorer.
Apoi se creaza link-urile interne necesare.
Cea de a doua situatie,este putin mai complexa.Este necesar ca aplicatia
sa tina permanent evidenta resurselor importate.Pentru acest scop,se poate
utiliza un obiect de tip colectie (Lista,Dictionar,Arie,Stiva etc) sau se
poate apela la o fila de arhivare.Solutia clasica include o baza de date,
un tabel preformatat si serverul SQL.Baza de date asigura securitatea
informatiilor,iar serverul asigura un auscultator (listener) si operatiile
de gestiune si control.Totusi,serverul SQL ocupa 800 Mb de memorie,iar
conexiunea la server consuma din capacitatea de lucru a procesorului.In
plus,exista numeroase situatii banale in care nu este necesara securizarea
datelor.In toate aceste situatii,evidenta resurselor din program se poate
organiza cu o simpla fila de tip text.
EXEMPLU: Sa presupunem ca doriti sa realizati un album de familie,
in care fotografiile sa poata fi derulate cu un singur buton,iar clientul
sa poata organiza numarul si ordinea fotografiilor dupa bunul plac.In plus,
trebuie ca aplicatia sa fie portabila si sa functioneze la orice adresa
de memorie.Se va utiliza o fereastra Windows,un buton si un obiect de tip
PictureBox.Pentru a organiza fotografiile,se va utiliza o fila de tip text,
in care utilizatorul va scrie sub forma de lista,numele si extensia pentru
fiecare fila dorita,astfel:
Foto1.jpg
Foto2.jpg
Foto3.jpg
Salvati fila cu numele Poze.txt.
In continuare,programul va deschide fila text si va copia lista de
resurse intr-un obiect de tip arie,de unde vor putea fi preluate rotativ,
pentru a fi afisate in obiectul PictureBox.
Platforma Microsoft Visual C sharp,ridica o mica problema atunci cand
resursele locale trebuie sa fie incarcate dinamic.Directorul implicit al
proiectului,cel in care se proiecteaza etapa de design,este la o adresa
destul de dificil de controlat (in Local Settings).Din acest motiv,este
recomandabil ca inainte de a incepe lucrul,sa salvati proiectul la o
adresa mai accesibila,apoi sa reincarcati proiectul de la aceasta adresa.
Exemplu: salvati pe unitatea C un director nou,denumit Aplicatii.Acest
director va fi utilizat pentru designul proiectului si pentru a putea
organiza resursele locale (cele initiale).
Apoi deschideti un nou proiect de tip Windows Forms Application.
Eventual redenumiti proiectul,apoi alegeti din meniul File optiunea
Close solution si salvati proiectul la adresa :
C:\\Aplicatii
-122-
Apoi,alegeti din meniul File optiunea Open Project si reincarcati
proiectul,de la adresa C:\\Aplicatii.In fereastra Solution Explorer va
apare arborele proiectului.Pentru a continua,selectati Form1.cs.
Pentru a putea continua editarea,este recomandabil sa verificati
care este directorul curent al proiectului in etapa de design.Pentru
acest scop,adaugati un buton si o eticheta Label,apoi executati un
dublu click pe buton.
Completati metoda button1_Click() astfel:
label1.Text = Directory.GetCurrentDirectory();
apoi adaugati in lista de biblioteci si:
using System.IO;
Apasati tasta F5 pentru a compila proiectul,apoi apasati butonul.
In mod normal se va afisa urmatoarea adresa:
C:\Aplicatii\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug
Aceasta este adresa implicita la care trebuiesc adaugate toate
resursele locale ale proiectului,adica fila Poze.txt si fotografiile.
In continuare,proiectul este usor de realizat.Deschideti fereastra
Form1.cs[Design],adaugati un obiect PictureBox si redimensionati fereastra
si pictureBox1 dupa bunul plac. (Exemplu: 800/600 si 750/550).Alegeti
culorile dorite,fontul pentru label,apoi executati un dublu click pe
buton si modificati codul astfel:
public partial class Form1 : Form {
Bitmap bmp;
String [] poze;
public int pozitie,numar;
public Form1() {
InitializeComponent();
pozitie = 0;
string path1 = Directory.GetCurrentDirectory()+"\\Poze.txt";
poze = File.ReadAllLines(path1);
bmp = new Bitmap(Directory.GetCurrentDirectory()+"\\"+poze[0]);
pictureBox1.Image = (Image)bmp;
this.Refresh();
label1.Text = poze[0];
numar = poze.Length; }
private void button1_Click(object sender,EventArgs e) {
if (pozitie < numar - 1) {
pozitie = pozitie + 1;
bmp = new Bitmap(Directory.GetCurrentDirectory()+"\\"+poze[pozitie]);
}
else {
bmp = new Bitmap(Directory.GetCurrentDirectory()+"\\"+poze[0];
pozitie = 0;
}
label1.Text = poze[pozitie];
pictureBox1.Image = (Image) bmp;
this.Refresh(); }
private void Form1_Load(object sender,EventArgs e) { }
}}
Verificati ultimele detalii de design si apoi apasati tasta F5 pentru
compilare si executie.
-123-
Daca nu a intervenit nici o eroare,proiectul integral poate fi
recuperat din directorul Debug de la adresa C:\Aplicatii.....
Pentru a verifica portabilitatea aplicatiei,creati pe Desktop un
director nou,denumit Test,in care copiati toate filele din directorul
Debug,inclusiv fila Poze.txt si filele .jpg.
Pentru a verifica si incarcarea dinamica,schimbati ordinea din lista
editata in fila Foto.txt,adaugati fotografii noi,sau eliminati o parte
dintre ele.
Pentru a dezvolta proiectul se pot adauga butoane suplimentare pentru
navigatie,sau pentru personalizarea interfetei,cursoare pentru a putea
redimensiona fereastra sau imaginea,un buton OpenFile,pentru a putea
deschide si alte imagini decat cele din fila de resurse,un player audio
pentru fundalul sonor,un obiect Textbox in care se afiseaza explicatii
pentru fiecare imagine,link-uri automate spre resurse din retea...etc.
Exista si situatii in care nu doriti ca utilizatorul sa stie cum se
face gestiunea resurselor.In acest caz,puteti sa adaugati si o interfata
visuala cu casete tip TextBox si Liste sau Dictionare in care clientul
alege vizual filele de resurse.Resursele pot fi arhivate intr-o fila
locala cu atributul hidden.In acest caz,depanarea si controlul nu se va
putea face decat de catre administratorul autorizat (cel care are acces
la fila .txt).
Prin acest mecanism simplu,se pot inlocui un numar foarte mare de
operatii de securizare si control,se reduce consumul de memorie si
implicit creste viteza de executie.Acest tip de solutie,nu se poate
utiliza atunci cand datele clientului au caracter secret.Fila tip text nu
ofera un grad de securitate acceptabil si poate fi corupta sau citita
extrem de usor.Societatile comerciale,firmele private sau orice alt gen
de date cu caracter profesional,se vor proteja cu ajutorul serverelor si
al parolelor de acces.
Filele tip text se pot utiliza si pentru solutii mai complexe.In acest
caz,listele vor contine un text formatat,ce poate fi apoi descompus si
analizat cu ajutorul unui procesor de text.
EXEMPLU:
Foto1.jpg|600;400|Text explicativ
Foto2.jpg|400;200|Text explicativ
Foto3.jpg|500;300|Text explicativ
In exemplul de mai sus,formatul textului este dat de separatorul |.
Textul poate fi descompus cu Split() in trei string-uri diferite ce contin
numele resursei,dimensiunea si textul explicativ.Datele astfel descompuse
vor putea fi utilizate,la fel ca si cele dintr-un tabel.
Acest gen de solutii,au mai ales un caracter didactic si dezvolta
tehnicile de programare ale studentilor si incepatorilor,dar pot oferi si
o solutie alternativa pentru tehnologiile standard.
O solutie asemenatoare de gestiune a resurselor locale,include doar o
interfata grafica,in care utilizatorul face selectii si grupeaza setul
de resurse in containere de tip ListBox sau Dictionary.In acest caz,
selectiile vor avea doar valoare de instanta si nu vor putea fi reluate
sau repetate la executiile viitoare.Acest gen de solutie se prefera
atunci cand nu este important sa se arhiveze optiunile clientului (pentru
a elibera memoria de zeci si sute de file tip client in care sunt arhivate
preferintele fiecarui client).
-124-
Exemplu SoundPlayer
O aplicatie Windows poate include si un fundal sonor.Fisierele audio,
pot contine explicatii si recomandari pentru utilizare,sau pur si simplu
pot adauga un fundal muzical.Pentru a nu incomoda munca utilizatorului,
este recomandabil ca toate operatiile sa se execute automat.Sa presupunem
ca doriti sa adaugati un set de melodii ce vor fi interpretate aleator.
Pentru organizarea melodiilor se va utiliza un folder special,denumit
Melo,in care se arhiveaza fisiere de tip .wav.Redarea fisierelor se va
face cu un obiect de tip SoundPlayer,iar bucla de repetitie se va putea
structura cu ajutorul unui obiect de tip Timer.Controlul se va asigura cu
ajutorul unui buton simplu,la care se pot adauga si doua etichete pentru
a afisa melodia si durata.
Deschideti un proiect nou si adaugati in fereastra Form1 un buton si
doua etichete.Modificati textul butonului in "Play",textul primei etichete
(label) in "Melodia" iar textul celei de a doua etichete in "Durata".
Apasati tasta F5 pentru a compila rapid proiectul,apoi alegeti din meniul
File optiunea Close Solution si salvati proiectul in C:\Aplicatii cu
numele MusicPlayer.In acest moment se pot adauga resursele locale.La
adresa C:\Aplicatii\MusicPlayer\MusicPlayer\bin\Debug adaugati un folder
denumit Melo in care arhivati una sau mai multe fisiere cu extensia .wav.
In acest moment,proiectul contine toate elementele necesare.Se poate
trece la editarea codului.Redeschideti proiectul cu File/Open Project,
si adaugati un obiect de tip Timer.Executati un dublu click pe buton si
modificati fila Form1.cs astfel;
adaugati: using System.IO;
using System.Media;
using System.Timers;
editati metoda button1_Click() astfel:
timer1.Start();
this.PlayMusic();
adaugati metoda PlayMusic astfel:
public void PlayMusic() {
SoundPlayer player = new SoundPlayer();
DirectoryInfo d = new DirectoryInfo("Melo");
FileInfo[] fis = d.GetFiles();
int status = fis.Length;
Random numar = new Random();
int selectie = numar.Next(status);
player.SoundLocation = "Melo\\" + fis[selectie].Name;
int timp = Convert.ToInt32(fis[selectie].Length/100);
timp = timp * 55;
timp = Convert.ToInt32(timp/100);
timp = Convert.ToInt32(timp + timp / 60 + 5000);
timer1.Interval = timp;
label1.Text = fis[selectie].Name;
label2.Text = Convert.ToString(timp / 1000) + " secunde";
player.Load();
player.Play();
player.Dispose();
-125-
d = null;
fis = null;
numar = null;
GC.Collect();
}
in final editati metoda timer_Tick astfel:
private void timer1_Tick(object sender, EventArgs e)
{ this.PlayMusic() }
Daca fereastra de debugg nu contine erori,compilati si executati
apasand tasta F5.
Analizand putin exemplul,se observa urmatoarele operatii:
-la apasarea butonului se porneste timerul
-la fiecare tick,se construieste un obiect nou de tip SoundPlayer
-se citesc toate filele din directorul Melo si se alege una,aleator
-durata melodiei se calculeaza aproximativ,utilizand lungimea fisierului
( aproximativ 10 Mb / minut in cazul fisierelor .wav)
-se afiseaza numele melodiei si durata
-se seteaza intervalul timerului egal cu durata melodiei alese
-se pune in executie obiectul SoundPlayer
-se elibereaza complet memoria
-se forteaza GarbageCollector
In cazul fisierelor .wav,o melodie poate ocupa zeci de Mb.Din acest
motiv,este esential ca memoria sa fie complet eliberata dupa fiecare
melodie.Daca doriti ca fisierele sa fie executate intr-o anumita ordine
fixa,algoritmul aleator se va inlocui cu o lista simpla de unde vor fi
citite succesiv.
Aceasta aplicatie nu contine decat o functionalitate rudimentara.Am
eliminat intentionat toate artificiile de design, pentru a reduce la
maximum consumul de memorie.Modulul executabil nu consuma mai mult de
9 Kb.Acest gen de modul,poate fi incorporat intr-o aplicatie mai mare,
sub forma de functionalitate optionala.Pentru a crea un MusicPlaer complet
trebuie adaugata si o interfata grafica in care utilizatorul sa poata
alege si grupa melodiile dupa bunul plac,cu cateva click-uri de mouse.
Optional se pot crea link-uri spre diverse adrese de retea,de unde se pot
descarca automat melodiile dorite, sau se pot conecta doua sau mai multe
astfel de module,pentru a realiza mixaje sonore.
Nu este obligatoriu ca fisierele sa contina muzica.Pot fi mesaje si
indicatii,sunete optionale sau semnale de avertizare...etc.
Obiectul SoundPlayer nu este destinat pentru aplicatii complexe de tip
MediaPlayer ci doar pentru efecte sonore simple,sau pentru redarea unor
fisiere audio in format .wav.Obiectul nu recunoaste si nici nu decodeaza
nici unul dintre fisierele audio cu compresie (.Mp3,.midi etc.).Pentru
acest gen de situatii,se poate apela direct la Windows MediaPlayer (vezi
si exemplul urmator).
Complexitatea solutiei se va alege in functie de ponderea pe care o
ocupa in program operatiile de tip audio.Daca fundalul sonor este doar
optional,se va alege solutia cea mai simpla si economica,iar daca este o
aplicatie specializata pentru fisierele audio se va prefera un obiect mai
complex (dintre cele aflate in lista Choose Toolbox Items).
-126-
Exemplu MediaPlayer
In interfata grafica sunt incluse toate componentele visuale utilizate
in mod curent pentru design.Paleta de componente nu epuizeaza insa toate
resursele ce pot fi exploatate in proiect.Atunci cand este necesar,paleta
de componente poate fi completata cu orice control de tip ActiveX instalat
in calculator.Paleta de controale ActiveX depinde de programele instalate
in calculatorul d-voastra si poate fi activata alegand din meniul Tools,
optiunea Choose Toolbox Items.
Un exemplu concret il reprezinta aplicatiile audio, pentru file cu un
format oarecare de compresie.Pentru a deschide si executa astfel de file
se poate apela la controlul implicit din mediul Windows denumit Windows
MediaPlayer.Cu un asfel de control,se poate crea o aplicatie similara cu
cea precedenta,dar capabila sa deschida orice format audio.Proiectul va
include un buton,un obiect MediaPlayer si cateva etichete Label.Fisierele
se vor organiza intr-un folder,denumit Melo,la fel ca si in exemplul
anterior.
EXEMPLU: Deschideti un proiect nou si adaugati un buton,apoi salvati
proiectul in C:\Aplicatii pentru a avea acces la resurse.Adaugati in
directorul Debug un folder denumit Melo,in care puteti arhiva mai multe
fisiere audio cu format diferit: mp3,midi,wav,avi ...etc.
Redeschideti proiectul.Pentru a adauga un control MediaPlayer alegeti
din Tools optiunea Choose Toolbox Items si selectati COM Components,apoi
bifati componentul Windows Media Player si confirmati cu OK.Noul control
va apare in Toolbox in grupul Components (ultimul).Adaugati in fereastra
Form1 un control Media Player si 5 etichete Label.Redimensionati toate
obiectele pana obtineti aspectul dorit,modificati textul pentru buton in
Play sau Start si pentru cele 5 etichete in: Adresa,Status,Autor,Titlul
si Albumul.Adaugati si un control de tip Timer.Apoi executati un dublu
click pe buton si modificati codul astfel:
adaugati using System.IO;
editati urmatoarea metoda:
public void PlayMusic() {
DirectoryInfo d = new DirectoryInfo("Melo");
FileInfo[] fis = d.GetFiles();
int status = fis.Length;
Random numar = new Random();
int selectie = numar.Next(status);
label1.Text = "Melo\\"+fis[selectie].Name;
axWindowsMediaPlayer1.URL = label1.Text;
label2.Text =
axWindowsMediaPlayer1.currentMedia.sourceURL.Length.ToString();
label3.Text = axWindowsMediaPlayer1.currentMedia.getItemInfo("Artist");
label4.Text = axWindowsMediaPlayer1.currentMedia.getItemInfo("Title");
label5.Text = axWindowsMediaPlayer1.currentMedia.getItemInfo("Album");
axWindowsMediaPlayer1.Ctlcontrols.play();
d = null;
fis = null;
numar = null;
GC.Collect();
}
-127-
modificati metoda pentru buton astfel:
private void button1_Click(object sender,EventsArgs e) {
PlayMusic();
timer1.Start();
}
apoi adaugati metoda timer1_Tick astfel:
private void timer1_Tick(object sender,Events Args e) {
if ( axWindowsMediaPlayer1.status == "Stopped")
PlayMusic();
label2.Text = axWindowsMediaPlayer1.status;
}
Verificati fereastra View Error List si corectati eventualele erori,apoi
compilati si testati aplicatia apasand tasta F5.
In final,puteti adauga un icon personalizat sau puteti modifica
Fila AssembleyInfo.cs pentru a schimba fila manfiest.Este bine sa testati
cu atentie modul de executie si memoria consumata.Pentru acest scop,puteti
lansa programul in executie si apoi deschideti utilitarul Task Manager
si urmariti memoria consumata si randamentul de procesare.
Obiectul Windows Media Player este mult mai complex decat obiectul
SoundPlayer,dar fiind un obiect de tip ActiveX extern,nu va fi afisat in
fereastra Properties decat cu un set minimal de proprietati.Pentru a
putea exploata intregul set de metode si proprietati trebuie sa studiati
cu atentie documentatia tehnica a controlului,sau puteti sa editati in
fereastra de cod numele obiectului (axWindowsMediaPlayer1) si apoi sa
utilizati wizardul IntelliSense.
Atunci cand proiectul apeleaza la resurse externe,apar o serie intreaga
de probleme de portabilitate.Controlul Windows Media Player este integrat
in mediul Windows (sub o versiune sau alta) asa ca va putea fi apelat la
orice utilizator de Windows.Totusi,pachetul ce contine programul va trebui
sa includa si filele AxInterop.WMPlib.dll,respectiv Interop.WMPLib.dll
(generate automat in directorul Debug).
In situatiile in care utilizati controale ActiveX ce nu sunt incluse in
sistemul de operare,va trebui sa adaugati in pachet si controlul ActiveX,
impreuna cu solutia de instalare in calculatorul gazda si cu un set
minimal de informati explicative.
In general, aplicatiile dezvoltate in mediul Visual C sharp pot contine
nenumarate tipuri de resurse,setate pentru diverse tipuri de configuratii
hardware.Pentru orice program in care se includ si solutii diferite de
cele implicite,este bine ca programul sa includa si o fila in care sunt
specificate sub forma de lista toate resursele hardware si software
necesare pentru proiect,precum si explicatii detaliate de instalare.
In exemplul de mai sus,gestiunea resurselor locale se face extrem de
simplu.Pur si simplu se trag filele dorite in directorul Melo.Atunci cand
se lucreaza cu resurse mai complexe,acest gen de operatii nu pot fi facute
simplist si este necesar sa adaugati si o aplicatie auxiliara cu ajutorul
careia utilizatorul sa poata sa-si organizeze resursele.Exemplu: daca
resursele sunt gestionate intr-o baza de date,utilizatorul trebuie sa
primeasca si o interfata grafica prin care sa poata adauga sau elimina
fisiere din arhiva.Facultativ se pot adauga si masuri de securizare a
datelor prin parole de acces,conturi de utilizator,criptare si decriptare
a datelor,semnaturi digitale...etc.
-128-
Exemplu ChartFX
In majoritatea lucrarilor stiintifice,apare si necesitatea de a putea
prezenta serii de date,sub forma de histograme,diagrame,grafice etc.
Exista un set intreg de solutii posibile.Cea mai simpla solutie este sa
desenati diagramele cu Paint si sa le prezentati sub forma de imagini
simple.Totusi realizarea unui astfel de desen este destul de laborioasa
si consuma mult timp.Pentru astfel de operatii,exista un control ActiveX
specializat,denumit ChartFX,ce poate fi importat in interfata grafica la
fel ca si Windows Media Player,din Tools/Choose Toolbox Items.
Deschideti un proiect nou si adaugati ChartFx in lista de componente.
(vezi exemplul precedent).Alegeti un astfel de obiect si apoi modificati
dimensiunile dupa bunul plac.Obiectul va fi initializat cu un set de
valori atribuite aleator.Pentru a putea obtine graficul dorit,executati
un click drept pe obiect si alegeti Properties.Se va deschide fereastra
Properties cu un set de meniuri.Alegeti Tools si apoi bifati casetele
ToolBar si Legend iar apoi confirmati cu Apply si OK. Restul de meniuri se
pot utiliza pentru a personaliza aspectul. In meniul Data Values alegeti
cate serii de valori doriti sa prezentati si cate valori vor fi in fiecare
serie, iar in meniul appearance alegeti stilul de prezentare.
Redimensionati obiectul astfel incat sa fie vizibila intreaga bara de
instrumente (ToolBar),apoi puteti sa previzualizati datele apasand tasta
F5.Dupa compilare,fereastra Form1 va fi activa,iar bara de instrumente va
fi functionala. Pentru a putea introduce valorile dorite,selectati butonul
Tools (cel cu un ciocan) si bifati optiunea Data Editor. In fereastra se
va afisa o grila,in care puteti introduce seriile de valori dorite.
Pentru a seta valorile introduse, apasati butonul Copy to clipboard
(cel cu un aparat de fotografiat), apoi alegeti din nou butonul Tools si
deselectati optiunea Data Editor.
In acest moment, obiectul va afisa datele introduse de d-voasta.
Cu butoanele Area Chart, Pie Chart ...etc puteti sa schimbati forma de
prezentare,iar cu butonul 3D puteti opta intre graficele 2D sau 3D.Cu
butonul Rotate the chart puteti schimba unghiul de incidenta al coloanelor
3D iar cu butonul Edit Titles puteti adauga titlurile explicative.Optional
pueti adauga si grile orizontale,verticale sau mixte. Cand graficul are
aspectul dorit,salvati fila la adresa dorita,utilizand butonul Export.
In final,salvati aplicatia la adresa dorita. Fila salvata va putea fi
reincarcata ori de cate ori doriti, fie cu butonul Import (primul) fie
cu ajutorul unei comenzi.
Exemplu: salvati fila dorita in directorul Debug cu numele Grafic1.CHF
adaugati un buton
editati metoda clic pentru buton astfel:
private void Button1_Click(object sender,EventArgs e) {
axChartFx1.ImportFile("Grafic1.CHF");
}
Recompilati cu F5.La executie,graficul se va putea incarca apasand pe
buton.Pentru o prezentare mai complexa,un set de grafice se poate incarca
intr-o lista de derulare,la fel ca la albumul foto.Eventual,adaugati un
timer care schimba graficele automat,simultan cu un set de texte
explicative,sau adaugati si un fundal sonor in care prezentati toate
informatiile necesare.
-129-
Exemplu TextToHTML Converter
Un alt gen de aplicatii simple,sunt cele ce implica opratii de analiza
si procesare a unui text,sau de reformatare.Sa presupunem ca doriti sa
includeti intr-un site Web,un set de texte mai vechi,editate cu Notepad.
Pentru a putea converti fila text in fisier hipertext,trebuie adaugat un
set de tag-uri,pentru fiecare rand de text.Sunt necesare un obiect de tip
OpenFile,pentru a deschide fila text si o functie simpla prin care se
face reformatarea textului.
Deschideti un proiect nou, adaugati un buton, schimbati eticheta
butonului in Open sau Conversie sau ceva similar,apoi adaugati si un
obiect de tip OpenFileDialog.
Executati un dublu click pe buton si editati metoda button1_Click
astfel:
openFileDialog1.ShowDialog;
Pentru a putea executa operatii I/O adaugati in lista de import si
using System.IO;
Apoi selectati obiectul OpenFileDialog1 si executati un dublu
click pe evenimentul FileOk.Completati metoda FileOk astfel:
private void openFileDialog1_FileOk(object sender,CancelEventArgs e) {
string path = @openFileDialog1.FileName;
string[] readText = File.ReadAllLines(path);
string[] arie2 = path.Split(new Char[] { '\\' });
int nr = arie.Length;
string nume = arie2[nr - 1];
string adresa = @"C:\\Aplicatii\\Arhiva\\" + nume + ".html";
using (StreamWriter sw = File.AppendText(adresa))
{
sw.WriteLine("");
sw.WriteLine("");
foreach (string sir in readText)
{
sw.WriteLine("
" + sir + "
");
}
sw.WriteLine("
Dostları ilə paylaş: |