Documente Academic
Documente Profesional
Documente Cultură
Laboratorul 4
1. Obiective
Obiectivele principale ale laboratorului 4 sunt urmãtoarele:
În plus, ne propunem:
Subiectele din help sunt asociate în general cu un identificator unic. Acesta se insereazã printr-o
notã de subsol (footnote) cu caracterul „#”, înaintea titlului paginii respective. Deschiderea unei
anumite pagini de help, atât din fiºierul „cuprins”, cât ºi dintr-un program, se face pe baza acestui
identificator. Paginile sunt despãrþite cu „page break”.
:Base Exemplu.hlp
:Title Exemplu de fisier .hlp
:Index=Exemplu.hlp
1 Capitolul 1
2 Pagina 1=Topic_id1
2 Pagina 2=Topic_id2
1 Capitolul 2
2 Pagina 3=Topic_id3
„Base” reprezintã numele fiºerului de help, titlul determinã textul ce va apãrea pe bara ferestrei
help-ului, index-ul sugereazã fiºierul de unde se va face indexarea (în cazul nostru, acelaºi fiºier). În
continuare, se descrie structura help-ului într-o manierã arborescentã. Numerele din faþa
denumirilor de capitole reprezintã nivelul în arbore al subiectului respectiv:
Se observã cã legãtura la paginile corespunzãtoare se face pe baza identificatorului de subiect (topic id).
Dacã se doreºte includerea unor imagini, acestea sunt pur ºi simplu inserate în fiºierul rtf ºi vor
apãrea în mod automat ºi în help.
Într-o altã paginã se va scrie textul care se doreºte sã aparã (în cazul nostru: Textul apare intr-o
fereastra mica). În faþa sa, va fi inseratã o notã de subsol marcatã „#”, iar conþinutul notei va fi
identificatorul menþionat anterior (POPUP).
Pentru realizarea unei legãturi la altã paginã, se va sublinia dublu textul corespunzãtor legãturii,
care va fi urmat de identificatorul subiectului paginii la care se vrea sã se sarã.
Pentru a realiza un astfel de fiºier, trebuie create mai întâi paginile .html cu informaþiile utile. În
tab-page-ul Project se apasã al doilea buton din stânga, Add/Remove topic files. Este suficientã
includerea paginii de index, de la care se presupune cã existã legãturi cãtre celelalte pagini. Se
creeazã apoi câte un fiºier Contents ºi Index.
În tab-page-ul Contents, se pot insera subiectele corespunzãtoare unor anumite pagini. Pentru
aceasta se folosesc butoanele din stânga Insert a heading (un nod în arbore) ºi Insert a page (o
frunzã).
Pentru generarea automatã a opþiunii de cãutare în lista de cuvinte a paginilor, se apasã primul
buton din stânga din tab-page-ul Project, numit Change project options, iar în pagina Compiler se
bifeazã cãsuþa Compile full-text search information.
Cel mai simplu mod de deschidere a unui fiºier help este printr-un apel la sistemul de operare. În C#
apelul este de forma:
System.Diagnostics.Process.Start("nume fiºier");
C# mai conþine însã o clasã specializatã, numitã HelpProvider. Se introduce în formã un astfel de
obiect ºi apoi din fereastra de proprietãþi se seteazã numele fiºierului CHM asociat în câmpul
HelpNamespace. Desigur aceastã operaþie ºi cele descrise în continuare pot fi fãcute ºi prin
program. Apoi, pentru fiecare control din formã pentru care dorim sã aparã help atunci când apãsãm
tasta F1, trebuie sã modificãm urmãtoarele proprietãþi:
3.3. Help
O modalitate alternativã de activare a unui help CHM este prin folosirea clasei Help. Aceasta are
un numãr de metode statice specifice, precum ShowHelp, ShowHelpIndex, ShowPopup.
Help.ShowHelp(this, "Exemplu.chm");
deschide fiºierul Exemplu.chm
Help.ShowHelpIndex(this,"Exemplu.chm");
deschide pagina de index a fiºierului Exemplu.chm
Documentaþia XML se realizeazã automat prin includerea în codul sursã a comentariilor triple:
liniile care încep cu /// ºi care preced un tip definit de utilizator cum ar fi o clasã, un delegat sau o
interfaþã, un membru precum un câmp, eveniment, proprietate, metodã, sau un namespace.
Cele douã formulãri sunt echivalente, dar a doua precizeazã scopul codului pe când prima spune
doar ce face codul. În timpul întreþinerii acelei pãrþi din cod, motivele pentru care aceasta existã se
vor schimba mult mai rar decât modalitãþile prin care se va realiza efectiv obiectivul. Întreþinerea
celui de-al doilea tip de comentarii este deci mult mai uºoarã. Comentariile bune explicã de ce, nu
cum. De asemenea, se poate folosi un comentariu peentru a explica alegerea unei anumite
implementãri. Dacã existã douã strategii de implementare posibile ºi se opteazã asupra uneia din
ele, atunci trebuie analizat dacã meritã sã se adauge un comentariu pentru a explica motivele
alegerii.
Când ne aflãm în situaþia de a scrie comentarii dense pentru a explica codul, trebuie sa facem un pas
înapoi. Nu existã cumva o problemã mai mare care trebuie rezolvatã?
Unele persoane susþin cã antetul ar trebui sã furnizeze o listã cu toate funcþiile, clasele, variabilele
globale ºi aºa mai departe, care sunt definite în fiºier. Acesta este un dezastru pentru întreþinere; un
astfel de comentariu devene rapid învechit. Antetul fiºierului trebuie sã continã înformaþii despre
scopul fiºierului (de exemplu implementarea interfeþei IA) ºi o declaraþie cu drepturile de
Antet-ul nu trebuie sã conþinã informaþii care ar putea deveni uºor învechite, precum data când a
fost ultima oarã modificat fiºierul. Aceasta probabil nu ar fi actualizatã des ºi ar induce în eroare.
De asemenea nu trebuie sã conþinã un istoric al fiºierului sursã care sã descrie toate modificãrile
fãcute. Dacã trebuie sã derulezi peste 10 pagini din istoricul modificarilor pentru a ajunge la prima
linie de cod, atunci devine incomod lucrul cu fiºierul. Din acest motiv, unii programatori pun o
astfel de listã la sfârºitul fiºierului, dar acesta va deveni nerezonabil de mare ºi se va încãrca mai
încet.
Degradarea comentariilor
Orice cod neîntreþinut corect tinde sã se degradeze, pierzând din calitatea proiectãrii originare.
Totuºi, comentariile tind sã se degradeze mult mai repede decât oricare altã parte de cod. Ele îºi
pierd sincronizarea cu codul pe care-l descriu ºi pot deveni profund supãrãtoare. Cea mai simplã
soluþie este aceasta: când se reparã, adaugã, sau modificã codul, se reparã, adaugã, sau modificã
orice comentariu din jurul sãu. Nu se modificã câteva linii ºi atât. Trebuie sã ne asigurãm cã orice
modificare din cod nu le va transforma în comentarii neadevãrate. Corolarul este urmãtorul: trebuie
sã creãm comentarii uºor de actualizat, dacã nu, ele nu vor fi actualizate. Comentariile trebuie sã fie
clar legate de secþiunea lor de cod ºi nu trebuie plasate în locaþii obscure.
Metoda de mai sus determinã afiºarea dialogului. Dacã acesta se executã corect (utlizatorul a ales
un fiºier), este disponibilã proprietatea open/saveFileDialog.FileName, care conþine numele
fiºierului dorit (cale completã ºi nume).
Câteva proprietãþi:
open/saveFileDialog.DefaultExt – extensia ataºatã în mod automat fiºierului;
open/saveFileDialog.Filter – Dialogul de selecþie de fiºiere include un combobox
cu tipurile fiºierelor. Când utilizatorul alege un tip de fiºier din listã, numai fiºierele de tipul
selectat sunt afiºate în dialog. Filter poate fi setat în Properties sau în sursã, în formatul:
"Text files (*.txt)|*.txt";
open/saveFileDialog.InitialDir – directorul implicit unde se deschide dialogul.
Poate fi de exemplu MyDocuments, dacã aceastã proprietate nu este specificatã. Pentru
directorul în care se aflã programul, se foloseºte „ . ”.
11
7. Aplicaþii
7.1. Realizaþi o interfaþã pentru desenarea unui pãtrat magic, cu ajutorul clasei MagicBuilder, din
arhiva laboratorului.
Indicaþii:
Un pãtrat magic este o matrice pãtraticã de dimensiune n, care conþine numerele întregi din
intervalul 1 n 2 ºi în care suma elementelor pe linii, coloane ºi diagonale este aceeaºi.
Pentru salvarea graficului, trebuie sã se foloseascã un obiect de tip Bitmap, care dispune de funcþii
de salvare/încãrcare a imaginilor. Deoarece obiectul Bitmap va fi folosit atât pentru desenarea
într-un PictureBox cât ºi pentru salvarea imaginii într-un eveniment de apãsare a unui buton, va
trebui sã avem un câmp în clasã, alocat în constructorul ferestrei:
12
_bmp.Save(saveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Png);
7.2. Creaþi un fiºier HLP sau un fiºier CHM pentru programul Pãtratul magic.
7.3. Creaþi o documentaþie API pentru clasa MagicBuilder folosind programul NDoc.
Comentariile triple trebuie introduse cu o linie mai sus de prima linie a clasei, câmpului sau metodei
comentate.
Exemple:
/// <summary>
/// Clasa pentru construirea unui patrat magic
/// </summary>
public class MagicBuilder
...
/// <summary>
/// Constructorul clasei pentru patratul magic
/// </summary>
/// <param name="size">Dimensiunea patratului</param>
public MagicBuilder(int size)
...
/// <summary>
/// Metoda care returneaza patratul construit
/// </summary>
/// <returns>Matricea corespunzatoare patratului magic</returns>
public int[,] BuildMagicSquare()
...
7.4. Opþional. Studiaþi programul de generare a unui antet cu informaþii pentru o sursã de program
(ProgramHeader.exe). Una din cerinþele proiectului este ca fiecare fiºier sursã sã aibã un astfel de
antet. Nu se cere implementarea unui astfel de program de generare.
13