Я использую:
class ISearchFuncs :
public Osp::Ui::IActionEventListener
, public Osp::Ui::ITextEventListener
, public Osp::Ui::IScrollPanelEventListener {
public:
virtual result CloseOverlayKeyb() = 0;
virtual result InitiateSearch() = 0;
};
но когда я пытаюсь подключиться к этим интерфейсам, передав указатель на ISearchFuncs
, обратный вызов / события не запускаются. Принимая во внимание, что подключение с использованием этих интерфейсов в классе, который фактически их реализует, не имеет таких проблем. Я мог бы жить с этим, но было бы лучше инкапсуляции, если бы я мог добраться до сути этой проблемы.
class Form1 :
public Osp::Ui::Controls::Form
, public ISearchFuncs
// , public Osp::Ui::IActionEventListener// see below
// , Osp::Ui::ITextEventListener//deleted due to ambiguity
{
Вот как это можно заставить работать:
EditField *pSearchEditField = new EditField;
TryCatch(E_SUCCESS == (r = pSearchEditField->Construct(Rectangle(labelRect.x + labelRect.width / 6, labelRect.y, 7 * labelRect.width / 12, 80)
, EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_OVERLAY, false, 100, GROUP_STYLE_MIDDLE)),, GetErrorMessage(r));
pSearchEditField->AddTextEventListener(*this);
pSearchEditField->AddScrollPanelEventListener(*this);
pSearchEditField->AddActionEventListener(*this);
TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_LEFT,
L"Done", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_DONE)),, "");
TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_RIGHT,
L"Cancel", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_CANCEL)),, "");
__pScrollPanel->AddControl(*pSearchEditField);
, тогда как при передаче другому классу для выполнения эквивалентного события не удается подключить события во время выполнения:
__pSearchPanel->Construct(labelRect, this, __pScrollPanel);
звонки:
result SearchPanel::Construct(const Rectangle &rect, ISearchFuncs *pListener, ScrollPanel *pScrollPare) {
result r = E_SUCCESS;
int x1 = rect.width / 6;
int x2 = rect.width * 3 / 4;
int y1 = rect.height / 3;
EditField *pSearchEditField = new EditField;
TryCatch(E_SUCCESS == (r = pSearchEditField->Construct(Rectangle(rect.x + x1, rect.y, x2 - x1, y1)
, EDIT_FIELD_STYLE_NORMAL, INPUT_STYLE_OVERLAY, false, 100, GROUP_STYLE_MIDDLE)),, GetErrorMessage(r));
pSearchEditField->AddTextEventListener(*pListener);
pSearchEditField->AddScrollPanelEventListener(*pListener);
pSearchEditField->AddActionEventListener(*pListener);
TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_LEFT,
L"Done", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_DONE)),, "");
TryCatch(E_SUCCESS == (r = pSearchEditField->SetOverlayKeypadCommandButton(COMMAND_BUTTON_POSITION_RIGHT,
L"Cancel", SearchPanel::ID_BUTTON_SEARCH_EDITFIELD_CANCEL)),, "");
TryCatch(E_SUCCESS == (r = pScrollPare->AddControl(*pSearchEditField)),, "");
Извините за дублирование кода, но это сводит меня с ума.
Идиома, которой я пытаюсь следовать, является частью помощи bada SDK .