Доступ к переменным вне scoop (wxSmith Project c ++) - PullRequest
0 голосов
/ 15 мая 2019

Я изучаю C ++ с помощью wxSmith внутри CodeBlocks.

Я создал приложение с двумя фреймами, и мне нужно получить доступ к переменным в окне верхнего уровня.

void test12052019Frame::OnButton1Click(wxCommandEvent& event)
{
wxString test1 = "";
wxString test2 = "";

test1 = TextCtrl1->GetValue();
test2 = TextCtrl2->GetValue();

// compare/parse userid/password
// Access ERP system and get credential schema
// build the treeview

if(test1 == "titou" && test2 == "123123"){
// todo auth. against Mysql
    wxMessageBox("You're in !!\n");
    TreeCtrl1->Show();
    TreeCtrl1->ExpandAll();
}else
    wxMessageBox("You're out !!\nWrong userid/password");
}
void test12052019Frame::OnTreeCtrl1ItemActivated(wxTreeEvent& event)
{
//TreeCtrl1 is my tree
//when I click on any option of my tree
//it activate a wxMessageBox with the label
//of the option selected...
//just let go your imagination :)

NewFrameActivities *mynewwindow = new NewFrameActivities(this);

wxString thelabel;
wxTreeItemId test3;

test3 = TreeCtrl1->GetSelection();
thelabel = TreeCtrl1->GetItemText(test3);

wxMessageBox(thelabel);

mynewwindow->SetLabel(thelabel);
//mynewwindow->StaticBox1->SetLabel(tosomething...);

//I have a textctrl in this event (textctrl1) and
//textctrl(textctrl1) in another event 

mynewwindow->TextCtrl1->ChangeValue("thetest\nsetvalue\n");
mynewwindow->Show(TRUE);
}

Iнеобходимо знать имя пользователя из первого события (окно верхнего уровня, textctrl1) Визуальная демонстрация

enter image description here

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

@ smarch

  1. Запрашивать у пользователя учетные данные будет лучше в диалоге, а не во фрейме.
  2. В экземпляре диалога создайте 2 функции, которые будут возвращать текстовый элемент управления 1 и текстовый элемент управления 2. Сделайте эти функции общедоступными, сохраняя при этом сам элемент управления частным (или защищенным - зависит от используемого вами инструмента RAD).
  3. В основном кадре выполните следующие действия:

    void MainFrame :: AskForCredentials () { MyCredentialsDialog dlg; int result = dlg.ShowModal (); если (результат == wxID_OK) { wxString userID = dlg.GetUserIDCtrl () -> GetValue (); wxString pass = dlg.GetPasswordCtrl () -> GetValue (); } }

  4. Test 5.Enjoy.

0 голосов
/ 15 мая 2019

Назовите элементы управления в объявлении класса фрейма:

class MyFrame : public wxFrame
{
    .... ctors, etc

    wxTextCtrl *texctrl_user;
    wxTextCtrl *texctrl_pass;

    wxButton *button1;

    //Function for button handling
    void OnButton1Click(wxCommandEvent& event);
    ....
};

Создайте элементы управления в MyFrame ctor или аналогичном

texctrl_user = new wxTextCtrl(....);
texctrl_pass = new wxTextCtrl(....);

button1 = new wxButton(.......);

И свяжите обработчик нажатия кнопки:

button1 ->Bind(wxEVT_BUTTON, &MyFrame::OnButton1Click, this, button1->GetId());

Теперь, поскольку функции и textctrls являются членами одного и того же класса, любой из них доступен внутри класса:

void MyFrame::OnButton1Click(wxCommandEvent& event)
{
    wxString str_user = texctrl_user->GetValue();
    wxString str_pass = texctrl_pass->GetValue();
    ...
}
...