[C# WinForms] Reținerea dimensiunii unei ferestre de la o sesiune la alta

1. În Visual Studio se creează un proiect nou cu limbajul C#, de tip Desktop App sau Windows Forms App. Se observă că se creează automat în acest proiect un formular (Form1) și mai multe fișiere vizibile în panoul din dreapta-sus numit Solution Explorer. Imediat apoi se deschide automat fișierul Form1.cs in modul Design.


2. Se deschide elementul Properties din panoul Solution Explorer cu săgeata din stânga lui Properties. În interiorul sublistei se vede numele de fișier „Settings.settings”. Se face dublu-clic pe el. Se deschide un nou tab corespunzător.


3. În noul tab se poate introduce o nouă înregistrare (rând), mai exact în tabelul cu coloanele „Name”, „Type”, „Scope” și „Value” (ro. Valoare). Înregistrările din tabel sunt setări pe care programul le poate citi sau/și scrie. Inițial nu există nici una. În celula din coloana „Name” (ro. Nume) se introduce un identificator de variabilă care va fi folosit în programul care se scrie pentru a citi/scrie setarea. Coloana „Type” (ro. Tip) cuprinde ComboBox-uri (casete de selectare) care conțin variante de tipuri de date posibile pentru setările programului, dintre care pentru o setare se alege tipul ei. Celula din coloana „Scope” (ro. Domeniu) conține o alegere a dezvoltatorului programului între „User” (ro. Utilizator) și „Application”. Setările cu domeniul „User” pot fi scrise și citite din programul creat, pentru fiecare utilizator al sistemului de operare în parte, dar cele „Application” nu pot fi decât citite din programul creat (nu pot fi scrise).


4. În figura următoare s-a creat o setare de tipul System.Drawing.Size (ro. Dimensiune) numită „Form1Size”. În coloana „Scope” se alege „User” și în coloana „Value” se introduc 2 numere întregi separate prin virgulă și, eventual, spații care reprezintă în general lățimea și, respectiv, înălțimea unui obiect (în cazul dat, un formular/o fereastră).


5. Se va vedea mai jos în acest articol cum se accesează setările din cod. După modificarea paginii Settings.settings se apasă butonul Save (Ctrl+S) (ro. Salvează) sau butonul Save All (Ctrl+Shift+S) (ro. Salvează toate).

Se dorește ca setările programului, salvate automat în general într-un fișier de pe calculatorul pe care este instalat sau rulat programul, să fie citite la pornirea programului și salvate pe disc la închiderea ferestrei programului (dacă s-au creat mai multe ferestre, se consideră fereastra principală). Formularul principal, inițial numit „Form1”, are două evenimente care trebuie interceptate pentru a realiza ce se propune: „Load” (ro. „încărcare”) si „FormClosing” (tradus aproximativ „în timpul închiderii formularului”). Dedesubt se vede evenimentul „Load”. Pentru a crea o metodă care interceptează acest eveniment (en. „[event] handler”) se face dublu-clic pe rândul „Load” din tabelul din panoul Properties din dreapta-jos (se poate mai simplu prin dublu-clic pe spațiul gol din formular în designer):


6. După dublu-clic se deschide Form1.cs în editorul de cod, dar designerul poate rămâne deschis într-un tab separat. Cursorul de editare al codului este poziționat în noua metodă „Form1_Load”. Codul scris între cele 2 acolade, între care se află cursorul de editare, se execută la încărcarea ferestrei (Form1).


7. Se scrie doar un sigur rând de cod între cele 2 acolade, deoarece setările programului sunt încărcate automat la pornirea lui (nu e nevoie de o instrucțiune pentru asta): Size = Properties.Settings.Default.Form1Size;



8. Se comandă întoarcerea la designerul lui Form1 și se face la fel cum s-a făcut pentru „Load” dar pentru „FormClosing”, eveniment care se apelează când fereastra este în proces de închidere (există și evenimentul „FormClosed” care are altă semnificație):


9. Astfel se deschide editorul de cod într-o nouă metoda, „Form1_FormClosing”:


10. Se pun în ea 2 rânduri de cod:

Properties.Settings.Default.Form1Size = Size;
Properties.Settings.Default.Save();

Primul rând setează proprietatea pentru sesiunea curenta și al doilea salvează setările (inclusiv cele setate altundeva) pe disc pentru viitoarele porniri ale programului.

Fișierul Form1.cs arată astfel:

Observații

1. Programul nu ține cont că fereastra poate primi dimensiune mare și prin maximizare. Pentru a ține cont de maximizare, se folosesc fie proprietatea MaximizeBox pentru a împiedica maximizarea ferestrei, fie evenimentul SizeChanged împreună cu proprietatea WindowState pentru a monitoriza când se schimba dimensiunea și starea de maximizată a ferestrei în același moment (în același grup de evenimente de la SO mânuite în aceleași momente).

2. Odată ce setarea Form1Size de tip Size a fost creată în designerul fișierului Settings.settings din secțiunea Properties a proiectului pe care l-am numit „cs-remember-form-size” și fișierul Settings.settings a fost salvat, valoarea setării Form1Size nu mai poate fi schimbată decât prin codul programului. Chiar dacă dăm comanda Build > Clean solution și apoi recompilăm programul în aceeași configurație de construcție ca la început (de ex., Debug sau Release), valoarea din designerul Settings.settings nu mai ajunge să fie folosită de program decât la operațiunea Publish din meniul contextual al proiectului. Odată publicat cu Publish, valoarea setării rămâne ca la prima instalare a programului din dosarul de publicare (implicit dosarul acesta este „publish” din directorul proiectului) până la folosirea programului pt. redimensionarea ferestrei, sau până la dezinstalare și reinstalare (uneori și opțiunea din programul de dezinstalare numită „Restore the application to its previous state” funcționează).

3. Pagina cu setările programului se poate deschide și făcând clic-dreapta pe „cs-remember-form-size” (numele proiectului creat) în Solution Explorer (Ctrl-W, S) și selectând Properties (Alt-Enter) din meniul contextual apărut, și în noul tab deschis se selectează în bara de navigare din stânga pagina „Settings”.

4. Documentația oficială legată de pagina de Setări din Visual Studio este aici (EN).

5. Într-un program serios, e nevoie de câte 1-2 setări asemănătoare celei descrise în acest articol pentru fiecare fereastră a programului, una pentru dimensiunea ferestrei (dacă fereastra este redimensionabilă), și cealaltă pentru poziția ferestrei pe ecran.

Niciun comentariu:

Trimiteți un comentariu