Page 1 of 1

Abordare Verificari

Posted: 20 Nov 2012, 13:41
by curiosul
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!

Re: Abordare Verificari

Posted: 20 Nov 2012, 15:19
by smcsa
Faci butonul Start disabled by default si il faci enabled doar cand este completat textbox-ul

Re: Abordare Verificari

Posted: 20 Nov 2012, 15:35
by bu7ch3r
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).

Re: Abordare Verificari

Posted: 20 Nov 2012, 21:08
by curiosul
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?

Re: Abordare Verificari

Posted: 20 Nov 2012, 21:34
by Ovidiu Cucu
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;
         }

Re: Abordare Verificari

Posted: 20 Nov 2012, 22:39
by neagu_laurentiu
Ovidiu Cucu wrote:Form^ form
Ptiu' drace ! Facusi targ cu necuratul .NET :biggrin:

Re: Abordare Verificari

Posted: 20 Nov 2012, 23:20
by Ovidiu Cucu
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.

Re: Abordare Verificari

Posted: 21 Nov 2012, 02:13
by curiosul
Multumesc muult, chiar am invatat cum trebuia. Dar mai am o nelamurire:
De ce este if(ValidateTextBoxes(this)) si nu this->TextBoxX ?

Re: Abordare Verificari

Posted: 21 Nov 2012, 08:58
by neagu_laurentiu
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)