Tab Order по кругу

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Tab Order по кругу

Post by borr_1 » Sat Sep 27, 2008 8:20 am

Есть формочка на ней два TextCtrl'a и 3 Button. Мне нужно сделать чтобы по Tab фокус переходил по кругу т.е. после 3-й кнопки фокус снова переходил на 1-й TextCtrl.
MoveAfterInTabOrder почему-то не помогает, wxTAB_TRAVERSAL везде выключено. Может можно еще как-то изящно отработать таб ордер?

Code: Select all

	wxGridSizer* GridSizer4;
	wxGridSizer* GridSizer1;
	wxGridSizer* GridSizer3;
	wxStaticBoxSizer* StaticBoxSizer1;

	Create(parent, wxID_ANY, _("Арендаторы"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
	GridSizer1 = new wxGridSizer(2, 1, 0, 0);
	Panel1 = new wxPanel(this, ID_PANEL1, wxDefaultPosition, wxSize(340,108), 0, _T("ID_PANEL1"));
	Panel1->SetMinSize(wxSize(200,200));
	StaticBoxSizer1 = new wxStaticBoxSizer(wxVERTICAL, Panel1, wxEmptyString);
	GridSizer2 = new wxGridSizer(2, 1, 0, 0);
	StaticText1 = new wxStaticText(Panel1, ID_STATICTEXT1, _("Ф.И.О."), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
	GridSizer2->Add(StaticText1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
	TextCtrl1 = new wxTextCtrl(Panel1, ID_TEXTCTRL1, _("Text"), wxDefaultPosition, wxSize(248,21), 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
	GridSizer2->Add(TextCtrl1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
	StaticBoxSizer1->Add(GridSizer2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
	GridSizer3 = new wxGridSizer(2, 1, 0, 0);
	StaticText2 = new wxStaticText(Panel1, ID_STATICTEXT2, _("Адрес субъекта"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
	GridSizer3->Add(StaticText2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
	TextCtrl2 = new wxTextCtrl(Panel1, ID_TEXTCTRL2, _("Text"), wxDefaultPosition, wxSize(248,21), 0, wxDefaultValidator, _T("ID_TEXTCTRL2"));
	GridSizer3->Add(TextCtrl2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
	StaticBoxSizer1->Add(GridSizer3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
	GridSizer4 = new wxGridSizer(0, 3, 0, 0);
	Button1 = new wxButton(Panel1, ID_BUTTON1, _("Сохранить"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
	GridSizer4->Add(Button1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
	Button2 = new wxButton(Panel1, ID_BUTTON2, _("Новый"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
	GridSizer4->Add(Button2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
	Button3 = new wxButton(Panel1, ID_BUTTON3, _("Отмена"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3"));
	GridSizer4->Add(Button3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
	StaticBoxSizer1->Add(GridSizer4, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
	Panel1->SetSizer(StaticBoxSizer1);
	StaticBoxSizer1->SetSizeHints(Panel1);
	GridSizer1->Add(Panel1, 0, wxALL|wxALIGN_LEFT|wxALIGN_TOP, 0);
	GridSizer1->Add(-1,-1,0, wxALL|wxSHAPED|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
	SetSizer(GridSizer1);
	GridSizer1->Fit(this);
	GridSizer1->SetSizeHints(this);
	//*)
	TextCtrl2->MoveAfterInTabOrder(TextCtrl1);
	Button1->MoveAfterInTabOrder(TextCtrl2);
	Button2->MoveAfterInTabOrder(Button1);
	Button3->MoveAfterInTabOrder(Button2);
	//TextCtrl1->MoveAfterInTabOrder(Button3);//тогда фокус вообще не переходит с первого TextCtrl'a
	TextCtrl1->SetFocus();
}

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Re: Tab Order по кругу

Post by tan » Sat Sep 27, 2008 8:39 am

borr_1 wrote:Есть формочка на ней два TextCtrl'a и 3 Button. Мне нужно сделать чтобы по Tab фокус переходил по кругу т.е. после 3-й кнопки фокус снова переходил на 1-й TextCtrl.
Что то я не совсем понимаю, разве это поведение не является естественным?
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Sat Sep 27, 2008 8:50 am

Да у меня вообще проблема с этим

Code: Select all

TextCtrl2->MoveAfterInTabOrder(TextCtrl1);
Button1->MoveAfterInTabOrder(TextCtrl2);
Button2->MoveAfterInTabOrder(Button1);
Button3->MoveAfterInTabOrder(Button2);
Во первых если для Panel1 выключаешь wxTab_TRAVERAL TAB двигается только до первой кнопки, а если его включить то по табу фокус перемещается от TextCtrl1 до Button3 по порядку как и надо даже если строчки которые я привел выше закомментированы Почему так? Если что проэкт пересобирал полностью
Что то я не совсем понимаю, разве это поведение не является естественным?
Да, является. И как это реализовать у меня не вышло?

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Sat Sep 27, 2008 9:41 am

borr_1 wrote:Да у меня вообще проблема с этим

Code: Select all

TextCtrl2->MoveAfterInTabOrder(TextCtrl1);
Button1->MoveAfterInTabOrder(TextCtrl2);
Button2->MoveAfterInTabOrder(Button1);
Button3->MoveAfterInTabOrder(Button2);
Во первых если для Panel1 выключаешь wxTab_TRAVERAL TAB двигается только до первой кнопки, а если его включить то по табу фокус перемещается от TextCtrl1 до Button3 по порядку как и надо даже если строчки которые я привел выше закомментированы Почему так?
Ну так и должно быть :) А чего ты ожидал?
Эти строчки вообще нафиг не нужны. MoveAfterInTabOrder() просто позволяет изменить естественный порядок контролов (естественный - это в порядке их создания).
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Sat Sep 27, 2008 10:02 am

Ага а еще MoveAfterInTabOrder между кнопочками не работет

Code: Select all

Button2->MoveAfterInTabOrder(Button1);
Button3->MoveAfterInTabOrder(Button2);
Не работает.

Выходит Tab придется как то через event'ы обрабатывать? Вот только как это поизящнее сделать?

У меня после 3-й кнопки фокус на первый TextCtrl не хочет переходить хоть стреляй + если жмешь Shift+Tab на первом TextCtrl'е фокус пропадает вообще и нужно мышкой снова щелкнуть по форме чтобы снова Tab работал :(

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Sat Sep 27, 2008 10:15 am

Нифига не понимаю, в чем проблема. Просто включи wxTAB_TRAVERSAL в панели и все будет работать без всяких MoveAfterInTabOrder(). Если это принципиально необходимо без wxTAB_TRAVERSAL, тогда обрабатывай нажатие tab сам (типа в обработчике EVT_CHAR) и делай то, что хочешь. Короче, если у панели нет стиля wxTAB_TRAVERSAL, она табуляцию сама правильно обрабатывать не будет.
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Sat Sep 27, 2008 10:28 am

Я не дописал в предидущем посте - такое поведение у панели с включенным wxTAB_TRAVERSAL

tan
Moderator
Moderator
Posts: 1471
Joined: Tue Nov 14, 2006 7:58 am
Location: Saint-Petersburg, Russia

Post by tan » Sat Sep 27, 2008 10:33 am

borr_1 wrote:Я не дописал в предидущем посте - такое поведение у панели с включенным wxTAB_TRAVERSAL
Ну тогда я вообще нифига не понимаю, поскольку в более предыдущем посте конкретно написано:
borr_1 wrote: Во первых если для Panel1 выключаешь wxTab_TRAVERAL TAB двигается только до первой кнопки, а если его включить то по табу фокус перемещается от TextCtrl1 до Button3 по порядку как и надо ...
OS: Windows XP Pro
Compiler: MSVC++ 7.1
wxWidgets: 2.8.10

Post Reply