Abordare Verificari

Intrebari despre limbajul C++/CLI (si versiunile mai vechi MC++), applicatii mixed-mode sau probleme specifice .NET legate de C++.
Post Reply
User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Abordare Verificari

Post by curiosul » 20 Nov 2012, 13:41

Salutare baieti!

Am niste nelamuriri in legatura cu o categorie de program ca sa zic asa. Deci, se da urmatorul program care arata cam asa:
Image

La fiecare checkBox avem:

Code: Select all

 if(this->checkBox3->Checked == true)
					 this->maskedTextBox3->Enabled = true;
				 else
					 this->maskedTextBox3->Enabled = false;
Problema este urmatoarea: Eu cand apas butonul Start vreau sa verifice: pentru fiecare checkBox bifat sa verifice daca maskedTextBox-ul corespunzator este completat sa urmeze un set de instructiuni iar daca nu sa-mi dea un MessageBox in care sa ma anunte...

Am incercat sa fac cu verificari in buton direct:

Code: Select all

 if(this->checkBox1->Checked == true)
			 {
				 if(this->maskedTextbox1->Text != "")
				 {
					if(this->checkBox2->Checked == true)
						 {
							 if(this->maskedTextBox2->Text != "")
							 {
								 //treci la urmatoarea
							 }
							 else
								 MessageBox::Show("Campul 2 este invalid.");
						 }
					}
					 else
						 MessageBox::Show("Campul 1 este invalid");
			 }
Dar este destul de greoi pentru 4 checkBox-uri dar sa fie vre-o 10.

M-ar interesa cum s-ar aborda in cel mai optim mod o asemenea problema. Sau cum as putea sa verific in interiorul fiecarui checkBox, ar fi mai "structurata" treaba si sa fie apelata cumva din buton.

Mersii!


Cea mai buna batalie este cea castigata fara lupta.

smcsa
Junior
Junior
Posts: 3
Joined: 11 Sep 2012, 08:12
Judet: Timiş

Re: Abordare Verificari

Post by smcsa » 20 Nov 2012, 15:19

Faci butonul Start disabled by default si il faci enabled doar cand este completat textbox-ul

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Abordare Verificari

Post by bu7ch3r » 20 Nov 2012, 15:35

smcsa wrote:Faci butonul Start disabled by default si il faci enabled doar cand este completat textbox-ul
Da, asa nu o sa ai 10 if, else-uri o sa ai 10 handleri la textbox-uri care o sa faca enable si disable pe onchange.
Dupa ce o sa dea cu barda, utilizatorul o sa vada ca butonul ala e disable si n-o sa stie de ce.

Pune editurile intr-un container si de la 0 pana la 9:
-verifica daca e enable
-daca e enable verifica daca are text
-daca n-are text message box ca editul de la %d e nebunatic
daca nu, nu :)

P.S. Poti ca atunci cand dai enable la edit sa ii pui prompt si sa-i zici la user ce are de pus acolo. (PROMPT nu text).
Cu stima,
Lupu Claudiu

User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Re: Abordare Verificari

Post by curiosul » 20 Nov 2012, 21:08

Si care e treaba cu container-ul? Este ceva de genul:

Code: Select all

for(i=1;i<n;i++)
{
     if(this->checkBox[b]n[/b])
     //blaabla
}
Sau aberez total?
Cea mai buna batalie este cea castigata fara lupta.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Abordare Verificari

Post by Ovidiu Cucu » 20 Nov 2012, 21:34

Eu zic, (bazat si pe ce s-a mai spus aici) sa faci o functie de validare care sa-ti baleeze toate controalele din form.
La primul text box gasit ca-i enabled si n-are text, dai un mesaj, pui focusul pe el, apoi intorci false. Daca nu s-a gasit niciunul in situatia asta, intorci true.
Cam asa:

Code: Select all

   static public bool ValidateTextBoxes(Form^ form)
   {
      for each(Control^ ctrl in form->Controls)
      {
         String^ type = ctrl->GetType()->ToString();
         if("System.Windows.Forms.TextBox" == type)
         {
            if(ctrl->Enabled && String::IsNullOrEmpty(ctrl->Text))
            {
               MessageBox::Show("This field should be not empty");
               ctrl->Focus();
               return false;
            }
         }
      }
      return true;
   }
Acuma poti s-o apelezi in handlerul de la buton, sau de oriunde in alta parte, cam asa:

Code: Select all

   private: System::Void buttonStart_Click(System::Object^ sender, System::EventArgs^ e) 
            {
               if(ValidateTextBoxes(this))
               {
                  // do the rest...  
               }
            }
TextBox-urile le faci enabled/disabled pe handlerele de la CheckBox-urile corespunzatoare.
Exemplu:

Code: Select all

private: System::Void checkBox1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) 
         {
            textBox1->Enabled = static_cast<CheckBox^>(sender)->Checked;
         }

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Abordare Verificari

Post by neagu_laurentiu » 20 Nov 2012, 22:39

Ovidiu Cucu wrote:Form^ form
Ptiu' drace ! Facusi targ cu necuratul .NET :biggrin:

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Abordare Verificari

Post by Ovidiu Cucu » 20 Nov 2012, 23:20

neagu_laurentiu wrote:
Ovidiu Cucu wrote:Form^ form
Ptiu' drace ! Facusi targ cu necuratul .NET :biggrin:
Pacate, maica, pacate! In loc sa fi rezolvat problema in cinci minute daca era cu MFC (inclusiv solutia propusa de smcsa), a trebuit sa mosmolesc ca baba juma de ora prin o mie de namespace-uri, clase, metode si proprietati. :biggrin:

@OP.
Am observat mai tarziu ca folosesti MaskedTextBox si nu TextBox. No problem, poti inlocui in exemplul dat "TextBox" cu "MaskedTextBox" sau mai bine faci asa:

Code: Select all

   static public bool ValidateTextBoxes(Form^ form)
   {
      for each(Control^ ctrl in form->Controls)
      {
         System::String^ base_type = ctrl->GetType()->BaseType->ToString();
         if("System.Windows.Forms.TextBoxBase" == base_type)
         {
            if(ctrl->Enabled && String::IsNullOrEmpty(ctrl->Text))
            {
               MessageBox::Show("This field should be not empty");
               ctrl->Focus();
               return false;
            }
         }
      }
      return true;
   }
Acum o sa fie valabil si pentru TextBox, MaskedTextBox, RichTextBox si ce-o mai fi derivat prin .NET din TextBoxBase.

User avatar
curiosul
Junior
Junior
Posts: 46
Joined: 18 Aug 2010, 20:20
Judet: Iaşi
Contact:

Re: Abordare Verificari

Post by curiosul » 21 Nov 2012, 02:13

Multumesc muult, chiar am invatat cum trebuia. Dar mai am o nelamurire:
De ce este if(ValidateTextBoxes(this)) si nu this->TextBoxX ?
Cea mai buna batalie este cea castigata fara lupta.

neagu_laurentiu
Membru++
Membru++
Posts: 919
Joined: 23 Jul 2007, 11:32

Re: Abordare Verificari

Post by neagu_laurentiu » 21 Nov 2012, 08:58

curiosul wrote:De ce este if(ValidateTextBoxes(this)) si nu this->TextBoxX ?
Pai in ValidateTextBoxes transmiti parintele (fereastra) si in cadrul ei verifici copii (controalele): for each(Control^ ctrl in form->Controls)

Post Reply