miercuri, 8 iunie 2016

C#25 Progress bar, Timer

Progress Bar

 Acesta este un control care afișează progresul unei activități lente sub forma unei bare orizontale. Proprietatea Value reprezintă progresul activității și parcurge în timp plaja de valori dintre Minimum și Maximum cu pasul Step.  Minimum, maximum și step se vor configura la design time din panoul proprietăți.  Efectuarea unui pas este dată de execuția metodei PerformStep() ca în acest exemplu:

for(int i=p.Minimum; i=p.Maximum; i+=p.Step)
{
      p.PerformStep();
}

unde p este un obiect progressBar.

Timer

 Acesta este un cronometru care emite evenimente de tip Tick la intervale programabile, multiplu de 1 milisecundă.


Aplicația

Utilizează un control  Timer care declanșează un eveniment Tick la fiecare 2 secunde, timp de  20 de secunde. Numărul de secunde scurse se afișează într-un control Label, iar progresul se vizualizează într-o bară de progres. Cronometrul se oprește după 20 de secunde și poate fi repornit cu butonul Start.  Acest Timer îl vom denumi winTimer.
Al doilea control Timer afișează ora curentă.  Îl vom denumi SystemTimer. Vom seta din proprietăți proprietatea Enabled pe true (implicit pleacă dezactivat).
Ambele Timere vor avea proprietatea Interval setată pe 1000 (un Tick la o secundă).
Utilizăm două etichete Label al căror text afișat (Text din Properties) îl ștergem. Va fi afișat prin program un text special.
 Aducem un buton pe care scriem Start și pe care îl programăm cu metoda Click din aplicația următoare.
Aducem în formă un progressBar pe care îl configurăm astfel: Maximum = 20, Step = 2.
Mai creăm o variabilă membru în clasa Form1 numită time, de tip întreg, care va contoriza impulsurile de la 0 la 20, apoi  va fi resetată:

private int time = 0;


namespace Timer
{
    public partial class Form1 : Form
    {
        private int time = 0;
        public Form1()
        {
            InitializeComponent();

        }

        private void progressBar1_Click(object sender, EventArgs e)
        {

        }

        private void winTimer_Tick(object sender, EventArgs e)
        {
            time += 2; //incrementeaza contorul  la 2 secunde
            // afisam contorul secundelor (cronometrul)  in eticheta
            label2.Text = string.Format("{0}",time);
            //incrementarea barei de progres
            progressBar1.PerformStep();
            if(time==20) //daca s-au scurs 20 secunde cronometrul se opreste
            {
                winTimer.Stop();
                progressBar1.Enabled = false; //oprim
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            winTimer.Enabled = true;
            if(time==20)
            {
                time = 0;
                progressBar1.Value = 0;
            }
        }

        private void SystemTimer_Tick(object sender, EventArgs e)
        {
            //proprietatea Now a clasei dateTime returneaza ora exacta
            label5.Text = System.DateTime.Now.ToLongTimeString();
        }
    }
}

duminică, 29 mai 2016

C#24 Transparency & Opacity, TrackBar, NumericUpDown, DomainUpDown


 Plasăm în fereastra aplicației controalele: NumericUpDown, DomainUpDown și TrackBar, a căror funcționalitate va reieși clar din aplicația următoare. Mai punem un buton pe care scriem revenire.

În esență, acestea sunt controale prin care putem trimite un input dintr-o gamă sau plajă restrânsă de itemi sau valori. Vom regla cu ajutorul lor opacitatea / transparența ferestrei aplicației, într-o gamă de la 100% (opac) la 0% (total transparent).

Introducem itemii lui DomainUpDown prin panoul Proprietăți, proprietatea Items. Introducem 5 itemi, cu valorile Opacitate 0%, Opacitate 25%, Opacitate 50%, Opacitate 75% și Opacitate 100%. Tot aici setăm proprietatea Text la valoarea Opacitate 100%.

Modificăm proprietatea Maximum a lui NumericUpDown la valoarea 5 (implicit este 100).

Scriem evenimentul Click al butonului revenire.

În timpul rulării vom evita opacitatea 0% deoarece butoanele de închidere a aplicației nu mai sunt accesibile.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Opacity
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            this.Opacity = 1 - (double)trackBar1.Value / 10;
        }

        private void domainUpDown1_SelectedItemChanged(object sender, EventArgs e)
        {
            this.Opacity = 1 - (double)domainUpDown1.SelectedIndex / 5;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            this.Opacity = 1 - (double)numericUpDown1.Value / 5;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Opacity = 1;
            trackBar1.Value = 0;
            numericUpDown1.Value = 0;
            domainUpDown1.Text = "Opacitate 100%";
        }
    }
}

sâmbătă, 21 mai 2016

C#23 Fonturi

Fonturi

Fonturile nu sunt controale ci obiecte ale clasei Font definită în spațiul de nume System.Drawing. Un obiect de tip Font încapsulează un format particular de caracter (exemplu: arial, TimesNewRoman, etc), stilul (bold, italic, underline, normal) și mărimea.
Toate controalele de bază au proprietatea Font, prin care se permite setarea forma literelor afisate pe control la designtime. De exemplu, setarea fontului unei etichete label la designtime se face așa:

e.Font = new Font ("Arial", 10, FontStyle.Italic);

Stilurile fonturilor

FontStyle este o enumerare (un set de constante numerice cu nume simbolice) definită în spațiul de nume System.Drawing. Membrii enumerării sunt Regular, Bold, Italic, Underline și Strikeout.

O porțiune de text poate avea un cumul  de mai multe stiluri. Acest efect se realizează simplu, prin operații de tip ȘI și SAU  logic pe biți între două sau mai multe stiluri.

Aplicația FontStyle

- deschidem o aplicație nouă, în care folosim un control RichTextBox și un control ToolStrip.
- Din ToolStrip generăm 3 butoane.
- Modificăm proprietatea DysplayStyle a butoanelor la valoarea Text, ceea ce ne permite să scriem un text pe butoane.
- Vom atribui proprietăților Text valorile e Bold, Italic și Underline.
-Facem dublu click pe RichTextBox, ceea ce va genera metoda textChanged, care rămâne vidă.
-Andocăm  richtextBoxul.
-scriem metoda click pentru fiecare din cele 3 butoane. Pentru butonul Bold:

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            Font vechiulFont, noulFont;
            //returneaza fontul folosit in textul selectat
            vechiulFont = richTextBox1.SelectionFont;
            //daca vechiul font avea stilul bold, inlatura
            if(vechiulFont.Bold)
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style & ~System.Drawing.FontStyle.Bold);
            }
            else
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style | System.Drawing.FontStyle.Bold);
            }
            //inseram noul font si redam focusul controlului RichTextBox
            richTextBox1.SelectionFont = noulFont;
            richTextBox1.Focus();
        }


Codul pentru butoanele italic și Underline se obține prin copiere, cu modificarea lui Bold cu italic, respectiv Underline.

Se observă folosirea operatorului ȘI logic pe biți & și a lui SAU logic pe biți |, precum și a negației pe biți ~.

namespace FontStyle
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            Font vechiulFont, noulFont;
            //returneaza fontul folosit in textul selectat
            vechiulFont = richTextBox1.SelectionFont;
            //daca vechiul font avea stilul bold, inlatura
            if(vechiulFont.Bold)
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style & ~System.Drawing.FontStyle.Bold);
            }
            else
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style | System.Drawing.FontStyle.Bold);
            }
            //inseram noul font si redam focusul controlului RichTextBox
            richTextBox1.SelectionFont = noulFont;
            richTextBox1.Focus();
        }

        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            Font vechiulFont, noulFont;
            //returneaza fontul folosit in textul selectat
            vechiulFont = richTextBox1.SelectionFont;
            //daca vechiul font avea stilul bold, inlatura
            if (vechiulFont.Italic)
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style & ~System.Drawing.FontStyle.Italic);
            }
            else
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style | System.Drawing.FontStyle.Italic);
            }
            //inseram noul font si redam focusul controlului RichTextBox
            richTextBox1.SelectionFont = noulFont;
            richTextBox1.Focus();
        }

        private void toolStripButton3_Click(object sender, EventArgs e)
        {
            Font vechiulFont, noulFont;
            //returneaza fontul folosit in textul selectat
            vechiulFont = richTextBox1.SelectionFont;
            //daca vechiul font avea stilul bold, inlatura
            if (vechiulFont.Underline)
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style & ~System.Drawing.FontStyle.Underline);
            }
            else
            {
                noulFont = new Font(vechiulFont, vechiulFont.Style | System.Drawing.FontStyle.Underline);
            }
            //inseram noul font si redam focusul controlului RichTextBox
            richTextBox1.SelectionFont = noulFont;
            richTextBox1.Focus();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}




joi, 5 mai 2016

C#22 Controalele ListBox și ComboBox

Aceste controale afișează o listă de itemi. Itemii apar sub formă de șiruri de caractere și pot fi selectați cu mousul. Controlul comboBox combină un TextBox cu un ListBox, permițând atât selecția de itemi cât și introducerea de noi itemi.
Controlul ChechedListBox este un listBox care are în plus checkboxuri pentru selectarea itemilor nealăturați.
Itemii se pot adăuga în liste atât la design time cât și la run time.
Aplicația care urmează implementează toate cele trei tipuri de liste și ambele modalități de adaugare a itemilor.

Aplicația TestListBox

Se deschide o aplicație nouă și se aduc pe suprafața formei următoarele controale: un listBox, un comboBox, un checkedListBox și un button pentru Exit. Se aranjează aceste controale unul lângă altul, în linie sau în coloană.
Lângă aceste controale se mai aduc câteva butoane, astfel: lângă listBox și lângă comboBox,  câte un buton, iar lângă checkedListBox două butoane.

Se configurează textul afișat pe aceste butoane, după cum urmează:
butonul alăturat lui listBox: Încarcă ListBox
butonul alăturat lui ComboBox: Incarca comboBox
primul buton de lânga checkedBox; Incarca o lista
al doilea buton de langa checkedBox: Incarca alta lista

Se tratează evenimentele click ale tuturor butoanelor.

Din săgeata mică din marginea superioară a listBox-ului se alege Edit Items. Se introduc 3 siruri de caractere pe 3 linii succesive, de genul

Gogu
Gigi
Guță

Acești itemi sunt prestabiliți la design-time.

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        private Elev[] el;

        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)

        {
            listBox1.Items.Add("Gogu"); //adăugare item singur
            listBox1.Items.AddRange(new object[] { "UNU", "DOI", "TREI",  }); //adăugare  multiplă
        }

        private void button2_Click(object sender, EventArgs e)

        {
            //incepand cu apelul BeginUpdate si pana la EndUpdate
            //controlul nu se mai redeseneaza, ceea ce mareste viteza
            comboBox1.BeginUpdate();
            for (int i = 0; i < 20; i++)
                comboBox1.Items.Add("Itemul " + i);
            comboBox1.EndUpdate();
        }

        private void button3_Click(object sender, EventArgs e)

        {
            //un tablou de referinte la obiecte de tip string
            string[] copii = { "Ionel", "Viorel", "Alinel", "Dorel" };
            //sursa de date este tabloul
            this.checkedListBox1.DataSource = copii;
        }

        private void button4_Click(object sender, EventArgs e)

        {
            //cream obiectele care se insereaza in lista
            Elev[] e1 = new Elev[] { new Elev("Marius"), new Elev("Lenuta") };
            //sursa de date este e1
            this.checkedListBox1.DataSource = e1;
            //membrul  clasei Elev care se va afisa in lista
            //este proprietatea Nume
            checkedListBox1.DisplayMember = "Nume";
        }

        private void button5_Click(object sender, EventArgs e)

        {
            Application.Exit();
        }
    }
    class Elev
    {
        private string nume;
        public Elev(string n)
        { nume = n; }
        public string Nume
        { get { return nume; } }
    }
}

marți, 12 aprilie 2016

C#21 Meniu contextual. Hide & Show, Notify Icon

Meniul contextual se afișează la click cu  butonul din dreapta al mous-ului. Controlul folosit pentru acest tip de meniu este ContextMenuStrip.

Notify Icon este un icon care este plasat  pe System Tray în zona de notificare, în partea dreaptă, lângă ceas. Vom pune un buton de minimizare pe formă, al cărui efect este ascunderea (Hide) formei. Reafișarea (show) o vom realiza făcând dublu click pe iconul de notificare, sau, alternativ, apelând meniul contextual atașat acestui icon.


Aplicația

Vom extinde  una din aplicațiile  făcute anterior, sau vom crea o aplicație nouă, după dorință. Aducem pe formă următoarele controale: un ContextMenuStrip, un Button și un NotifyIcon. Căutăm pe internet un fișier de tip ico și îl descărcăm. Asociem acest fișier cu obiectul NotifyIcon, prin intermediul panoului Proprietăți. Selectăm referința meniului contextual (aceasta se află în subsolul ferestrei de design al formei) și creăm doi itemi: Hide și Show. Selectăm butonul Button1 și setăm textul afișat Hide sau Ascunde. Evenimentele click ale butonului Hide și al itemului Hide de pe ContextMenu  conțin doar instrucțiunea

                                  this.Hide();

Evenimentul click al itemului Show, precum si evenimentul dublu click al lui NotifyIcon1 contin instructiunea

                                   this.Visible=true;

Codul introdus este urmatorul:


         private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
        }

        private void hideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Hide();
        }

        private void showToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Visible = true;
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            this.Visible = true;
        }



Compilăm și lansăm în execuție.

duminică, 3 aprilie 2016

C#20 RichTextBox, ToolStrip

Controlul ToolStrip 

Acest control implementează o bară de instrumente formată din mai multe butoane, butoane drop-down, comboBox-uri, liste derulante, etichete. Caracteristic acestor bare de instrumente  este faptul că au afișată pe suprafața instrumentelor (butoanelor) lor o imagine sugestivă (care la origine este un fișier de tip JPG sau GIF oarecare), scalată automat de  sistem la dimensiunea butonului, și un text auxiliar care se afișează la staționarea timp de 1 - 2 secunde a mous-ului pe sprafața butonului. Aceste butoane dublează funcțiile meniului, de aceea codul pentru evenimentul Click este același ca cel al itemului corespunzător de meniu.


Controlul RichTextBox


Acest control preia toate caracteristicile lui TextBox, și în plus oferă posibilitatea de formatare a textului (italic, bold, underline, culoare, dimensiune, font, paragraf). Caracteristic butonului este faptul că prin andocare la fereastra părinte își maximizează suprafața de lucru. Conținutul său poate fi introdus din  tastatură sau copiat dintr-un fișier RTF.

Aplicația Editor de fișiere RTF


Deschidem o aplicatie nouă, pe care o numim RichTextBoxApp. Aducem pe forma Form1 un MenuStrip, un ToolStrip, și câte un dialog din cele studiate în lecția trecută (openFile, saveFile, font și color).

Expandăm meniul la fel ca în lecția precedentă (File -Nou -Open -Save -Exit și respectiv Format-Font  - Color).

În plus, putem adăuga un nou meniu, Edit, cu itemii Copy, Cut, Paste. Modul în care putem utiliza aceste funcții îl găsim în help-ul contextual  Microsoft Visual Studio. Îndată ce  scriem în editorul de cod numele obiectului richTextBox1 și punct, sistemul ne afișează list derulantă a metodelor disponibile.

Expandăm controlul ToolStrip și generăm atâtea butoane câte ne trebuie pentru implementarea itemilor din meniu, adică 5: nou, open, save, font și color).

Căutăm în calculator sau pe internet imagini sugestive pentru asociat cu bara de instrumente. Asocierea se face prin click dreapta pe buton, apoi Set  image...

Setăm textul auxiliar care se afișează la staționarea mous-ului pe instrumente, prin setarea corespunzătoare a proprietatii Text a fiecărui instrument, din  panoul Proprietăți.

Creăm metodele handler pentru evenimentul Click al fiecărui item de meniu, apoi copiem identic în instrumentul corespunzător. Operațiile de deschidere și închidere de fișier se fac cu ajutorul metodelor loadFile, respectiv SaveFile ale controlului richTextBox1, metode care primesc ca argument numele fișierului returnat de dialogul aferent, astfel:

               //deschide fisierul cu metoda LoadFile
       richTextBox1.LoadFile(openFileDialog1.FileName);



              //salvare fisier cu extensia .rtf
         richTextBox1.SaveFile(saveFileDialog1.FileName,  RichTextBoxStreamType.RichText);



                //portiunea selectata din text preia caracteristicile alese de utilizator
          richTextBox1.SelectionFont = fontDialog1.Font; 


                  //cod care actualizeaza culorile in document
           richTextBox1.SelectionColor = colorDialog1.Color;


Aplicația completă este următoarea:

 namespace RichTextBoxApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void nouToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //sterge textul controlului
            richTextBox1.Text = "";
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            //sterge textul controlului
            richTextBox1.Text = "";
        }

        private void deschideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            openFileDialog1.Title = "Deschide fisier";
            // seteaza tipurille de fisier
            openFileDialog1.Filter = "Fisiere text |*.txt| fisiere rtf|*.rtf";
            //in comboBox-ul File name nu vrem sa apara la deschiderea dialogului nici un nume
            openFileDialog1.FileName = "";
            //directorul care se deschide in mod implicit
            openFileDialog1.InitialDirectory = "MyDocuments";
            //atentionare daca numele nu exista
            openFileDialog1.CheckFileExists = true;
            //deschide dialogul OpennFileDialog
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //deschide fisierul cu metoda LoadFile
                richTextBox1.LoadFile(openFileDialog1.FileName);
            }
        }

        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            openFileDialog1.Title = "Deschide fisier";
            // seteaza tipurille de fisier
            openFileDialog1.Filter = "Fisiere text |*.txt| fisiere rtf|*.rtf";
            //in comboBox-ul File name nu vrem sa apara la deschiderea dialogului nici un nume
            openFileDialog1.FileName = "";
            //directorul care se deschide in mod implicit
            openFileDialog1.InitialDirectory = "MyDocuments";
            //atentionare daca numele nu exista
            openFileDialog1.CheckFileExists = true;
            //deschide dialogul OpennFileDialog
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //deschide fisierul cu metoda LoadFile
                richTextBox1.LoadFile(openFileDialog1.FileName);
            }
        }

        private void salvezaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            saveFileDialog1.Title = "salveaza fisierul";
            //extensia implicita de salvare
            saveFileDialog1.DefaultExt = ".rtf";
            //atentionare de suprascriere
            saveFileDialog1.OverwritePrompt = true;
            //deschide dialogul de salvare fisier
            if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //salvare fisier cu extensia .rtf
                richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.RichText);
            }
        }

        private void toolStripButton3_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            saveFileDialog1.Title = "salveaza fisierul";
            //extensia implicita de salvare
            saveFileDialog1.DefaultExt = ".rtf";
            //atentionare de suprascriere
            saveFileDialog1.OverwritePrompt = true;
            //deschide dialogul de salvare fisier
            if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //salvare fisier cu extensia .rtf
                richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.RichText);
            }
        }

        private void iesireToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void fontToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // se deschide dialogul font
            if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //portiunea selectata din text preia caracteristicile alese de utilizator
                richTextBox1.SelectionFont = fontDialog1.Font;
            }
        }

        private void toolStripButton4_Click(object sender, EventArgs e)
        {
            {
                // se deschide dialogul font
                if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                { //portiunea selectata din text preia caracteristicile alese de utilizator
                    richTextBox1.SelectionFont = fontDialog1.Font;
                }
            }
        }

        private void culoareToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //deschide dialogul ColorDialog
            if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //cod care actualizeaza culorile in document
                richTextBox1.SelectionColor = colorDialog1.Color;
            }
        }

        private void toolStripButton5_Click(object sender, EventArgs e)
        {
            //deschide dialogul ColorDialog
            if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //cod care actualizeaza culorile in document
                richTextBox1.SelectionColor = colorDialog1.Color;
            }
        }
    }
}

 

sâmbătă, 26 martie 2016

C#19 Menu, dialoguri predefinite

Dialogurile predefinite sunt forme standardizate de dialog,  incorporate in .NET, care pot fi inglobate in aplicatia noastra. Exemple de dialoguri predefinite sunt dialogul OpenFile, SaveFile, FontColor, PrintDialog, etc. Ele vor functiona in applicatia noastra in exact aceeasi maniera ca si in Word sau Paint, de exemplu.

Vom face o aplicatie care utilizeaza un meniu si cateva dialoguri predefinite, prilej cu care vom lucra cu cateva dintre  metodele si proprietatile membru ale acestor controale.  Celelalte metode si proprietati se pot descoperi cu ajutorul help-ului mediului de programare.
Deschidem un proiect nou, pe care il denumim DialoguriPredefinite. Tragem pe suprafata formei Form1 un control de tipul MenuStrip. Facand click pe suprafata acestui control, el se expandeaza in jos si la dreapta, creand poziti pentru noi itemi. Vom crea doua meniuri  pe bara de meniu: Fisier si Format. Sub meniul Fisier vom crea alti  trei itemi: Deschide, Salveaza  si Iesire.  Sub meniul Format cream itemul Font si itemul Color. Vom crea pentru fiecare item in parte dialogul aferent,  insa nu vom executa efectiv si operatiile de deschidere si salvare de fisier.

Adăugăm formei dialogurile predefinite, prin drag&drop de la panoul Toolbox către suprafața formei. Observăm că dialogurile trase nu sunt localizate vizual pe suprafața formei, dar ele sunt înglobate. Sunt create obiectele aferente, cu numere de ordine începând cu 1. Vom avea astfel un obiect openFileDialog1, care are proprietăți ca Title, Filter, etc, a căror utilizare se va vedea mai jos.

Pentru tratarea evenimentului Click asupra unui item de meniu, facem dublu click pe acel item.

Meniul Deschide fisier

Introducem acest cod in handlerul evenimentului click:

        private void deschideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            openFileDialog1.Title = "Deschide fisier";
            // seteaza tipurille de fisier
            openFileDialog1.Filter = "Fisiere text |*.txt| fisiere doc|*.doc|fisiere docx |*.docx";
            //in comboBox-ul File name nu vrem sa apara la deschiderea dialogului nici un nume
            openFileDialog1.FileName = "";
            //directorul care se deschide in mod implicit
            openFileDialog1.InitialDirectory = "MyDocuments";
            //atentionare daca numele nu exista
            openFileDialog1.CheckFileExists = true;
            //deschide dialogul OpennFileDialog
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //cod care deschide fisierul
            }
        }


Filtrul pentru deschiderea fisierului are  sintaxa urmatoare: explicatie | filtru |explicatie | filtru ...etc.

In mod asemanator, introducem handlerele petru click in celelalte optiuni ale meniului.
Aplicatia va arata in felul urmator:

namespace DialoguriPredefinite
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void deschideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            openFileDialog1.Title = "Deschide fisier";
            // seteaza tipurille de fisier
            openFileDialog1.Filter = "Fisiere text |*.txt| fisiere doc|*.doc|fisiere docx |*.docx";
            //in comboBox-ul File name nu vrem sa apara la deschiderea dialogului nici un nume
            openFileDialog1.FileName = "";
            //directorul care se deschide in mod implicit
            openFileDialog1.InitialDirectory = "Desktop";
            //atentionare daca numele nu exista
            openFileDialog1.CheckFileExists = true;
            //deschide dialogul OpennFileDialog
            if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //cod care deschide fisierul
            }
        }


        private void salveazăCaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //titlul dialogului
            saveFileDialog1.Title = "salveaza fisierul";
            //extensia implicita de salvare
            saveFileDialog1.DefaultExt = ".txt";
            //atentionare de suprascriere
            saveFileDialog1.OverwritePrompt = true;
            //deschide dialogul de salvare fisier
            if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //cod care salveaza fisierul
            }
        }


        private void iesireToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void fontToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // se deschide dialogul font
            if (fontDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { //cod care reafiseaza documentul cu fontul ales de utilizator
            }
        }
        private void culoriToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //deschide dialogul ColorDialog
            if(colorDialog1.ShowDialog()==System.Windows.Forms.DialogResult.OK)
            {
                //cod care actualizeaza culorile in document
            }
        }
    }
}


duminică, 13 martie 2016

C#18 Forme, Dialoguri modale și nemodale

Crearea formelor la run time

O formă este un tip de control care reprezintă o fereastră. Este folosită ca suport pentru alte controale.
Crearea prin program a formelor:
                         
                            Form f = new Form();
                            f.Show();

sau se poate defini o clasa derivata din clasa Form:

                            class FormaMea:Form
                            {
                                public FormaMea() //constructorul
                                {
                                }
                                 // alti membri ai clasei (campuri, proprietati,metode)
                            }

Dintr-o alta metod a aplicatiei se face instantierea:

                             FormaMea f=new FormaMea();
                             f.Show();

Aplicatie de tipul consola care crează și deschide o fereasta la run-time.

  • Creăm un proiect nou, de tipul Console Application, Empty Project. Punem un nume proiectului, de pilda DialogModal. Facem click dreapta in Solution Explorer pe numele proiectului si alegem Add, apoi New Item.
  • In dialogul Add New Item selectam iconul Code File, apoi in caseta Name introducem numele fisierului: de exemplu Modal.cs.
  • Fisierul Modal.cs se deschide in editorul de cod.
  • Adaugam proiectului  referinte catre spatiile de nume System, System.Windows, System.Windows.Form, in felul urmator:
  • Click dreapta pe References (in panoul  Solution Explorer) si alegem Add. Din dialogul care se deschide, selectam cele trei spatii de nume scrise mai sus cu bold.
Introducem codul de mai jos, compilam si rulam.

using System;
using System.Windows;
using System.Windows.Forms;
class Forma: Form
{

}
class Program
{
    public static void Main()
    {
        Forma f = new Forma(); // instantiere
        //textul din bara de titlu
        f.Text = "Dialog modal";
        //dialogul modal devine vizibil
        f.ShowDialog();
        //lanseaza aplicatia
        Application.Run();
    }
}


Dialogul modal și nemodal


Un dialog modal este o fereastră de dialog cu utilizatorul care blochează orice altă activitate în aplicație până când nu se închide ferestra cu close. De exemplu, dialogul Open File din MS Word.
O fereastră de dialog modal se afișeză cu metoda ShowDialog().

Dialogul nemodal este o fereastă de dialog care nu blochează restul aplicației. De exemplu, Toolbox-urile din Paint și Word. Un dialog nemodal se afișează cu metoda Show().

Aplicația ModalDialogExemplu

  • Construiește un dialog modal care se deschide la apăsarea unui buton al formei părinte
  • Datele introduse într-un control al dialogului sunt transferate unui control al formei părinte
  1. Creăm un proiect nou de tipul WindowsFormsApplication
  2. Plasăm pe formă cu mousul un ListBox și două butoane. Setăm proprietatea Text a celor două butoane pe valorile Adauga și respectiv Iesire.
  3. Adăugăm o nouă formă proiectului la design-time: în Solution Explorer  click dreapta pe numele proiectului, alegem Add, apoi Windows Form.
  4. În Solution Explorer dublu click pe numele Form2.
  5. Aducem din Toolbox pe Form2 un TextBox și un buton, inscriptionat cu Ok.
  6. În Solution explorer facem click pe numele Form2, alegem View Code si in clasa Form2 definim noii membri:
           //câmp care  reține textul introdus în TextBox1
           private string item;
           /*proprietate care  returneaza valoarea textului; reamintim ca o proprietate este un fel             de  metoda
           care permite tratatea campurilor private ca si cum ar fi publice, dar numai pentru doua
           genuri de operatii: set si get.
          */
           public string Item
           {
               get{return item;}
           }

Tratam evenimentul Click generat de apasarea butonului Ok: introducem codul de mai jos in metoda handler a evenimentului click al lui button1:

           item = textBox1.Trim();
           //inchidem forma Form2:
            Close();

         7. In Form1 introducem o referinta catre Form2:
                           
            private Form2 f; //aceasta declaratie se scrie in clasa Form1, din fisierul Form1.cs.

         8. Tratam evenimentul Click al butonului Adauga aflat pe Form1.
         9. Pentru iesirea din aplicatie tratam  evenimentul click al butonului Iesire:
                     Application.Exit();
       10. Compilam si rulam aplicatia.


Codul pentru Form1 este  urmatorul:

namespace DialogModalWFA
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private Form2 f;

        private void button1_Click(object sender, EventArgs e)
        {
            //cream forma form2
            f = new Form2();
            //afisare dialog modal
            f.ShowDialog();
            if(f.Item!="") //daca exista text introdus
            {
                //adauga itemul in listBox1
                listBox1.Items.Add(f.Item);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}


Codul pentru obiectele din Form2:

namespace DialogModalWFA
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }
        // camp care  retine textul introdus in textBox1
        private string item;
        //proprietate get item
        public string Item
        {
            get
            {
                return item;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //salvam textul introdus in control
            item = textBox1.Text.Trim();
            //inchidem forma Form2
            Close();
        }
    }
}

De reținut:

  • Dialogurile modale se afișează cu metoda ShowDialog, iar cele  nemodale cu Show.
  • La închiderea cu Close un dialog nemodal se distruge (se distruge instanta clasei).
  • Un dialog modal nu este distrus la închiderea cu Close.  Câmpurile instanței rămân, iar forma poate fi reafișată. A se vedea accesul la câmpul f.Item după închiderea cu Close a formei Form2.
  • Codul care urmează lui ShowDialog nu se execută până când forma nu se închide. După închiderea  dialogului modal, putem referi în continuare clasa Form2 și membrii ei.
  • Întrebare: la o a doua apăsare a butonului Form1.Button1 se  creează o nouă instanță a formei Form2? Dacă da, ce se întâmplă cu cea veche? Cum mai poate fi accesată?

luni, 7 martie 2016

C#17 Controlul TextBox

Inițiem un proiect de tip WFA. Tragem în forma Form1 trei controale TextBox, pe care le așezăm unul sub altul. În stânga fiecărui TextBox tragem câte un control  Label. Sub ele așezăm un buton. Redenumim controalele din panoul Properties după cum urmează:

TextBox1  redenumim user
TextBox2  redenumim parola
RextBox3 redenumim cnp
Button1     inscripționăm cu textul  autentif

schimbam textul afisat de etichetele label în:

label1... user name
label2... password
label3... CNP

Schimbăm numele Form1 în LogOn.
Dorim ca la incarcarea formei să nu se vada controalele CNP și autentif, iar controlul parola să fie inactiv. Codul pentru aceasta se introduce în metoda constructor a formei. Tot aici punem și codul care maschează cu * parola introdusă. Pentru a accesa editorul de cod aferent constructorului,  facem dublu click pe formă. Noi scriem doar ce este cu Bold.

        public Form1() //constructorul formei
        {
            InitializeComponent();
            //caracterul * mascheaza parola
            parola.PasswordChar = '*';
            //campul parola initial dezactivat
            parola.Enabled = false;
            //campul cnp si butonul autentif initial invizibile
            label3.Visible = false;
            cnp.Visible = false;
            autentif.Visible = false;
        }

Dorim să permitem  logon doar utilizatorului Gogu. În practică, se utilizează o bază de date cu utilizatori, dar exemplul următor descrie metoda de principiu. Se utilizează metoda membru PreviewKeyDown. Navigarea între câmpuri se face cu tasta Tab, nu enter. Se poate testa însă opțional/alternativ  și Enter.

        private void user_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            //daca tasta apasata este Tab
            if (e.KeyCode == Keys.Tab)
                if (user.Text == "Gogu")
                    //user corect, activare camp parola
                    parola.Enabled = true;
                else
                    MessageBox.Show("user incorect");

        }

Verificăm introducerea parolei. Vom verifica dacă s-a introdus textul "parolaMea". În practică nu se folosește această  metodă statică de verificare, în care valoarea parolei este fixată în sursa programului, deoarece este vulnerabilă la decodificare și în plus nu se permite schimbarea parolei.
dacă parola este corectă, se activează controlul cnp și autentif.
Metoda Focus selectează un control   pentru a primi intrare de date. Selectarea se poate face manual cu mous-ul, cu săgețile, cu Tab sau prin program. Mai jos se focusează prin program. Ordinea implicită de selecție a controalelor este ordinea adăugării lor pe formă, dar se poate schimba din meniul View, TabIndex.

        private void parola_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            //daca tasta apasata este Enter
            if (e.KeyCode == Keys.Enter)
                //daca s-a introdus textul "parolaMea"
                if (parola.Text == "parolaMea")
                {
                    //controlul CNP devine vizibil
                    label3.Visible = true;
                    cnp.Visible = true;
                    //controlul CNP primeste focusul
                    cnp.Focus();
                    //butonul autentif devine vizibil
                    autentif.Visible = true;
                }
            else
                {
                    MessageBox.Show("Parola incorecta");
                    //sterge textul introdus
                    parola.Clear();
                }

        }

Pentru verificarea CNP-ului dorim să impunem două restricții: să conțină numai cifre, și să fie de lungime fix 13 caractere. În practică se folosește un algoritm de verificare a cifrelor de control. Ultimele 4 caractere din CNP sunt cifre de control, restul conțin data nașterii, codul sexului, codul județului.

        private void cnp_KeyPress(object sender, KeyPressEventArgs e)
        {
            //daca nu e cifra, nu se proceseaza
            if (e.KeyChar < 0x30 || e.KeyChar > 0x39)
                e.Handled = true;

        }

Evenimentul Click al butonului autentif verifică dacă cnp-ul are 13 cifre.

        private void autentif_Click(object sender, EventArgs e)
        {
            //daca lungime CNP <>13
            if (cnp.Text.Length != 13)
            {
                MessageBox.Show("CNP eronat");
                //sterge textul introdus
                cnp.Clear();
            }
            else
                MessageBox.Show("Autentificare cu succes");
        }

    }

Programul complet este următorul:

namespace LogOn
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //caracterul * mascheaza parola
            parola.PasswordChar = '*';
            //campul parola initial dezactivat
            parola.Enabled = false;
            //campul cnp si butonul autentif initial invizibile
            label3.Visible = false;
            cnp.Visible = false;
            autentif.Visible = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void user_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            //daca tasta apasata este Tab
            if (e.KeyCode == Keys.Tab)
                if (user.Text == "Gogu")
                    //user corect, activare camp parola
                    parola.Enabled = true;
                else
                    MessageBox.Show("user incorect");
        }

        private void parola_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            //daca tasta apasata este Enter
            if (e.KeyCode == Keys.Enter)
                //daca s-a introdus textul "parolaMea"
                if (parola.Text == "parolaMea")
                {
                    //controlul CNP devine vizibil
                    label3.Visible = true;
                    cnp.Visible = true;
                    //controlul CNP primeste focusul
                    cnp.Focus();
                    //butonul autentif devine vizibil
                    autentif.Visible = true;
                }
            else
                {
                    MessageBox.Show("Parola incorecta");
                    //sterge textul introdus
                    parola.Clear();
                }
        }

        private void cnp_KeyPress(object sender, KeyPressEventArgs e)
        {
            //daca nu e cifra, nu se proceseaza
            if (e.KeyChar < 0x30 || e.KeyChar > 0x39)
                e.Handled = true;
        }

        private void autentif_Click(object sender, EventArgs e)
        {
            //daca lungime CNP <>13
            if (cnp.Text.Length != 13)
            {
                MessageBox.Show("CNP eronat");
                //sterge textul introdus
                cnp.Clear();
            }
            else
                MessageBox.Show("Autentificare cu succes");
        }
    }
}


luni, 29 februarie 2016

C#16 RadioButton, CheckBox și GroupBox

Deschidem un proiect nou, de tipul Windows Form Application.

Tragem pe formularul Form1 două controale de tipul GroupBox, așezate unul lângă altul orizontal. În primul dintre ele punem 5 controale RadioButton, unul sub altul. În cel de al doilea grup punem 2 checkBox-uri, tot unul sub altul.

În fereastra Form1 mai punem două controale button. Fereastra arată astfel:

    



Modificăm proprietatea Text a primului GroupBox si scriem Excursii.
Modificăm proprietatea Text al celui de al doilea GroupBox si scriem  Transport.
Modificam proprietatea text a butoanelor radio, după cum urmează: Italia, Franta, Grecia, Turcia, Egipt.
Modificam proprietatea Text a checkBox-urilor dupa cum urmeaza: avionul, auto.
Modificam proprietatea text a butonului 1: &Verificare
Modificam proprietatea text a butonului 2: &Iesire

Caracterul & are rolul de a transforma litera inaintea căreia se află în hot key, butonul devenind accesibil prin apăsarea combinatiei CTRL+key.

Grupul de butoane radio se comporta unitar, deoarece nu este permisa decât o singura selectie dintre membrii grupului.

Grupul de butoane checBox nu are aceasta restrictie.

Introducem codul pentru butonul Verificare si Iesire, dupa cum este redat in continuare.

Compilăm și rulăm aplicația.

private void button1_Click(object sender, EventArgs e)
        {
            string mesaj = "Excursie in ";
            // identifica butonul radio selectat
            if (radioButton1.Checked) mesaj += radioButton1.Text;
            if (radioButton2.Checked) mesaj += radioButton2.Text;
            if (radioButton3.Checked) mesaj += radioButton3.Text;
            if (radioButton4.Checked) mesaj += radioButton4.Text;
            if (radioButton5.Checked) mesaj += radioButton5.Text;
            // identifica checkboxul selectat
            // bool primul serveste la construirea mesajului
            bool primul = false;
            if (checkBox1.Checked)
            {
                mesaj += " cu " + checkBox1.Text;
                primul = true;
            }
            if (checkBox2.Checked)
            {
                if (primul)
                    mesaj += " si cu " + checkBox2.Text;
                else
                    mesaj += " cu " + checkBox2.Text;
            }
            //afiseaza mesajul
            MessageBox.Show(mesaj);
            //restabileste starea initiala pentru o noua aplicare
            checkBox1.Checked = false;
            checkBox2.Checked = false;
            radioButton1.Checked = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

duminică, 21 februarie 2016

C# 15 Controalele Button și LinkLabel

Deschidem un proiect  nou de tipul Windows Form Aplication. Vom începe prin atașarea câtorva controale.

 

SplitContainer


Un container este un obiect care grupează mai multe obiecte. Tragem pe suprafața formei Form1 un control de tipul SplitContainer. Acesta are rolul de a împărți suprafața de lucru în două părți, delimitate de un marcaj care poate fi repoziționat prin tragere cu mous-ul.

Button


Controlul Button este folosit de regulă pentru declanșarea  unei acțiuni la apariția evenimentului Click. În aplicația următoare vom exersa modificarea la run-time a unor proprietăți ale butonului, ca de pildă culoarea, textul afișat, andocarea (lipirea de o margine a containerului). De asemenea, vom trata, în afară de evenimentul Click, și evenimentele MouseEnter (intrarea mous-ului pe suprafața butonului) și MouseLeave (ieșirea mou-sului de pe suprafața  butonului).

Atașăm 3 butoane, unul în panoul din stânga, două în panoul din dreapta, unul sub altul. 
Tratăm evenimentul Click al butonului 1. Dorim ca în mod alternativ să andocăm și să dez-andocăm butonul, simultan să-i schimbăm textul afișat.

        private void button1_Click(object sender, EventArgs e)
        {
            //Daca butonul este andocat umple panoul
            if (button1.Dock==DockStyle.Fill)
            {
                //il readucem la forma si eticheta initiale
                button1.Dock = DockStyle.None;
            }
            else
            {
                //il andocam si schimbam eticheta
                button1.Dock = DockStyle.Fill;
                button1.Text = "Fill!!";
            }

        }

Selectăm Button2 și din panoul Properties setăm proprietatea BackColor la valoarea Red siproprietatea Text la valoarea Roșu. tot din Properties selectăm evenimentul MouseEnter și introducem codul care urează:

        private void button2_MouseEnter(object sender, EventArgs e)
        {
            //setam fundalul la culoarea galbena
            button2.BackColor = Color.Yellow;
            button2.Text = "Galben";

        }


Similar,  tratăm evenimentul MouseLeave:

        private void button2_MouseLeave(object sender, EventArgs e)
        {
            //resetm culoarea fundalului si textul
            button2.BackColor = Color.Red;
            button2.Text = "Rosu";

        }

Introducem o comandă de exit aplicație pe evenimentuul Click al butonului 3:

         private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

Lansăm în execuție.

LinkLabel


Atașăm în panoul din dreapta două controale de tipul LinkLabel. Schimbăm proprietatea Text a lui LinkLabel1 la valoarea Vizitati www.yahoo.com iar a lui LinkLabel2 in Lansati Notepad.

Selectăm  eticheta LinkLabel1 și din Properties expandăm nodul LinkArea și setăm proprietatea start la  valoarea 9, ceea ce înseamnă că link-ul începe după al 9-lea caracter al proprietății Text.


Tratăm evenimentul Click al lui LinkLabel1 în felul următor:

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //schimba  culoarea link-ului dupa click
            linkLabel1.LinkVisited = true;
            //schimba textul in controlul Label
            linkLabel1.Text = "Se viziteaza www.yahoo.com";
            //se deschide un URL cu browserul implicit
            System.Diagnostics.Process.Start("http://www.yahoo.com");

        }

Similar, evenimentul Click pentru Linklabel2:

        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            linkLabel2.LinkVisited = true;
            linkLabel2.Text = "S-a lansat Notepad";
            //lanseaza Notepad
            System.Diagnostics.Process.Start("notepad");

        }

Ambele etichete folosesc metoda Process.Start pentru a lansa o aplicație într-o fereastră nouă (broeserul implicit și Notepad).

Rulăm aplicația, care arată așa:

namespace ControlButtonAplication
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Daca butonul este andocat umple panoul
            if (button1.Dock==DockStyle.Fill)
            {
                //il readucem la forma si eticheta initiale
                button1.Dock = DockStyle.None;
            }
            else
            {
                //il andocam si schimbam eticheta
                button1.Dock = DockStyle.Fill;
                button1.Text = "Fill!!";
            }
        }

        private void button3_MouseEnter(object sender, EventArgs e)
        {
            //setam fundalul la culoarea galbena
            button2.BackColor = Color.Yellow;
            button2.Text = "Galben";
        }

        private void button2_MouseLeave(object sender, EventArgs e)
        {
            //resetm culoarea fundalului si textul
            button2.BackColor = Color.Red;
            button2.Text = "Rosu";
        }

        private void button2_MouseEnter(object sender, EventArgs e)
        {
            //setam fundalul la culoarea galbena
            button2.BackColor = Color.Yellow;
            button2.Text = "Galben";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            //schimba  culoarea link-ului dupa click
            linkLabel1.LinkVisited = true;
            //schimba textul in controlul Label
            linkLabel1.Text = "Se viziteaza www.yahoo.com";
            //se deschide un URL cu browserul implicit
            System.Diagnostics.Process.Start("http://www.yahoo.com");
        }

        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            linkLabel2.LinkVisited = true;
            linkLabel2.Text = "S-a lansat Notepad";
            //lanseaza Notepad
            System.Diagnostics.Process.Start("notepad");
        }
    }
}