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");
        }
    }
}

duminică, 14 februarie 2016

C#14 Crearea unei aplicații cu interfață grafică

Aplicațiile cu interfață grafică se pot realiza și prin scriere directă a codului, dar volumul de muncă este imens. Vom folosi în schimb facilitățile automate ale mediului de lucru Microsoft Visual Studio (sau ale altui mediu de lucru), care va genera automat părțile de cod necesare.

Prima aplicație grafică

Deschidem Visual Studio și din meniul New Project alegem Windows Forms Application. O Formă este de fapt o fereastră. În această fereastră vom crea și vom programa funcționalitatea unor obiecte. Vom alege ca nume pentru proiectul nostru, Salut. În acest moment, sistemul Visual Studio desenează pe monitor schița unei ferestre cu numele Form1. Dacă nu avem în partea stângă a ecranului un tab (subdiviziune a ferestrei mamă) numită Toolbox, îl afișăm, cu atributul Dock. 

Din Toolbox tragem prin glisare (drag and drop) un button pe suprafața ferestrei Form1. Facem click cu butonul din dreapta al mousului pe acest buton și alegem din lista derulantă Properties. În fereastra Properties schimbăm valoarea proprietății Text în Apasa.

Programarea evenimentului click.

În fereastra Properties facem click pe iconul Fulger (Events). Alegem din lista de evenimente evenimentul Click și apăsăm enter. Se deschide editorul de cod. Suntem invitați să scriem metoda button1_Click. Acesta este handler-ul de eveniment. Metoda arată astfel:

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

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello world!");
        }
    }
}



Din tot codul de mai sus, noi scriem doar MessageBox.Show(Hello world!); restul este generat automat de către Visual Studio. Linia de cod pe care am scris-o apelează o metodă de sistem, care provoacă afișarea unui mesaj cu textul pus în paranteză.

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


Controale,  proprietăți și evenimente

Controalele sunt instanțe ale unor clase .NET definite în spațiul de nume System.Windows.Forms. Aceste clase derivă din clasa Control. Printre cele mai folosite controale se nuără ListBox, ComboBox, Button, CheckBox, RadioButton.


Proprietățile se definesc  la momentul proiectării, accesând fereastra Properties asociată controlului, dar pot fi modificate și la run-time. Ele determină elemente precum aspectul sau poziția și funcționalitatea unui control.

Evenimentele sunt cele care conduc funcționalitatea aplicației. Un eveniment poate fi click sau dublu-click sau mouse-over. Evenimentele sunt atașate unui control care devine obiect publisher și sunt interceptate de obiecte abonați sau subscriber. În cazul de mai sus, button1 este publisher iar Form1 este subscriber. Codul necesar subscrierii și definiția handlerului se creează automat când utilizăm panoul Properties.

Reluăm proiectul și mai adăugăm două controale: un CheckBox și un TextBox.
Pentru CheckBox, modificăm din panoul Properties proprietatea Text în Validare. și proprietatea Name în Verif.

Pentru caseta text, atribuim  proprietății Nume valoarea edit.

Înlocuim corpul metodei button1_Click cu următorul:

            Control c = (Control)sender;
            MessageBox.Show("Ati facut click pe controlul: " + c.Name + "cu eticheta " + c.Text);


Metoda arată astfel:

         private void button1_Click(object sender, EventArgs e)
        {
            Control c = (Control)sender;
            MessageBox.Show("Ati facut click pe controlul: " + c.Name + "cu eticheta " + c.Text);
        }
    


Forțăm prin intermediul panoului Properties ca și controalele CheckBox și TextBox să trateze evenimentul click cu aceeași metodă. Acest lucru se realizează în mod analog, prin selectarea fulgerului, selectarea evenimentului Click și apoi prin selectarea din lista atașată în dreapta a metodei Button1_Click.

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

Schimbăm comportamentul obiectelor și facem ca în caseta text sa se afișeze un anumit text când este selectat checkBox, și alt text când nu este selectat checkBox. Handlerul de eveniment click va arăta astfel:

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

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Verifica");
            if (this.checkBox1.Checked)
                this.textBox1.Text = "Ai verificat";
            else
                this.textBox1.Text = "Nu ai verificat";

        }
    }


  this este referință către obiectul conținător al metodei, deci către Form1, așadar expresia this.checkBox1 semnifică obiectul checkBox1 al obiectului Form1. Checked este o proprietate a acestui checkBox (se poate identifica în panoul Proprties) care are valoarea true daca este bifat checkBox-ul.