OldSchoolHack

Register / Login English

[Tutorial] MessageBoxen auswerten

icon Thread: [Tutorial] MessageBoxen auswerten

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
In diesem Tutorial verwenden wir unsere Klasse ErsteForm aus dem Tutorial "Eine Form mit Leben füllen" weiter.
Ziel dieses Tutorials ist es, auszuwerten, auf welchen Button ein Benutzer bei der OSHGui::MessageBox geklickt hat.
Dazu wollen wir die Beschriftung eines OSHGui::Label ändern.
Hier nochmal der alte Code:
CPP Code:
  1.  
  2. class ErsteForm : public Form
  3. {
  4. private:
  5. Button *ersterButton;
  6.  
  7. void InitializeComponent()
  8. {
  9. this->SetText("ErsteForm");
  10.  
  11. ersterButton = new Button();
  12. ersterButton->SetText("klick mich");
  13. ersterButton->GetClickEvent() += ClickEventHandler(std::bind(&ErsteForm::ersterButton_Click, this, std::placeholders::_1));
  14. this->AddControl(ersterButton);
  15. }
  16.  
  17. public:
  18. ErsteForm()
  19. {
  20. InitializeComponent();
  21. }
  22.  
  23. private:
  24. void ersterButton_Click(Control *sender)
  25. {
  26. MessageBox::Show("Ich wurde angeklickt!");
  27. }
  28. };
  29.  

Um ein Label zum Anzeigen zu bekommen, gehen wir beim Erstellen genauso vor wie bei dem Button:
CPP Code:
  1.  
  2. class ErsteForm : public Form
  3. {
  4. private:
  5. Button *ersterButton;
  6. Label *anzeigeLabel; //Zeiger auf ein Label
  7.  
  8. void InitializeComponent()
  9. {
  10. this->SetText("ErsteForm");
  11.  
  12. ersterButton = new Button();
  13. ersterButton->SetText("klick mich");
  14. ersterButton->GetClickEvent() += ClickEventHandler(std::bind(&ErsteForm::ersterButton_Click, this, std::placeholders::_1));
  15. this->AddControl(ersterButton);
  16.  
  17. anzeigeLabel = new Label(); //neues Label erzeugen
  18. anzeigeLabel->SetLocation(ersterButton->GetLeft(), ersterButton->GetBottom() + 5); //Label 5 Pixel unterhalb des Buttons positionieren
  19. anzeigeLabel->SetText("bitte auf den Button klicken"); //dem Label den Text zuweisen
  20. this->AddControl(anzeigeLabel); //Label zur Form hinzufügen
  21. }
  22.  
  23. public:
  24. ErsteForm()
  25. {
  26. InitializeComponent();
  27. }
  28.  
  29. private:
  30. void ersterButton_Click(Control *sender)
  31. {
  32. MessageBox::Show("Ich wurde angeklickt!");
  33. }
  34. };
  35.  

Im Moment wird bei unserer MessageBox nur ein "OK" Button angezeigt. Diesen wollen wir nun zu zwei "Yes" "No" Buttons ändern.
CPP Code:
  1.  
  2. void ersterButton_Click(Control *sender)
  3. {
  4. MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo);
  5. }
  6.  
Nun wird die Frage und zwei Buttons angezeigt. Um nun auszuwerten, auf welchen Button der Benutzer geklickt hat, müssen wir die MessageBox mit einer Funktion
verknüpfen, die aufgerufen wird, sobald die MessageBox geschlossen wurde. Dazu können wir wieder std::bind oder einen Lamda-Ausdruck verwenden.
In diesem Beispiel verwenden wir einen Lambda-Ausdruck, da wir die Funktion nur an dieser einen Stelle benötigen und es unsinnig wäre, dazu eine Funktion
in unsere Klasse aufzunehmen.

CPP Code:
  1.  
  2. void ersterButton_Click(Control *sender)
  3. {
  4. MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo, [](DialogResult result)
  5. {
  6. //dieser Code wird ausgeführt, wenn die MessageBox geschlossen wurde.
  7. });
  8. }
  9.  

In dieser (anonymen) Funktion können wir nun die Variable OSHGui:ialogResult result auswerten und erfahren dadurch, auf welchen Button der Benutzer geklickt hat.
CPP Code:
  1.  
  2. void ersterButton_Click(Control *sender)
  3. {
  4. MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo, [](DialogResult result)
  5. {
  6. if (result == ResultYes) //prüfen ob auf "Yes" geklickt wurde
  7. {
  8.  
  9. }
  10. else if (result == ResultNo) //prüfen ob auf "No" geklickt wurde
  11. {
  12.  
  13. }
  14. else //auf gar nichts wurde geklickt...MessageBox wurde einfach geschlossen
  15. {
  16.  
  17. }
  18. });
  19. }
  20.  

Die Beschriftung unseres Labels passen wir nun einfach innerhalb der if-Verzweigungen an. Da unser Label dem Lambda-Ausdruck unbekannt ist, müssen wir
dem Lambda-Ausdruck per @c [this] mitteilen, dass wir uns innerhalb unserer Form befinden.
CPP Code:
  1.  
  2. void ersterButton_Click(Control *sender)
  3. {
  4. MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo, [this](DialogResult result)
  5. {
  6. if (result == ResultYes)
  7. {
  8. anzeigeLabel->SetText("dann kanns ja weitergehen :)");
  9. }
  10. else if (result == ResultNo)
  11. {
  12. anzeigeLabel->SetText("dann nochmal langsam von vorne durchgehen");
  13. }
  14. else
  15. {
  16. ersterButton_Click(0);
  17. }
  18. });
  19. }
  20.  

Wurde auf "Yes" geklickt, so ändert sich der Text des Labels zu "dann kanns ja weitergehen ", anderfalls zu "dann nochmal langsam von vorne durchgehen".
Falls die MessageBox aber einfach geschlossen wurde, ohne auf einen Button zu klicken, wird "bitte auf einen Button in der MessageBox klicken" ausgegeben.

__________________

Hallo