C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамические визуальные компоненты, проблема генерации события.  (Прочитано 2180 раз)
template
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 6


Динамические визуальные компоненты, проблема генерации события.
« : 11 Ноябрь 2011, 14:36:02 »

В дизайн-тайме размещаю основную форму TFormStand и компонент типа TStringGrid на ней. В ран-тайме же дополнительно в ячейках упомянутого компонента типа TStringGrid размещаю массив динамически создаваемых кнопок. Указатели на созданные кнопки сохраняю в поле-массиве формы TFormStand.

Код
void __fastcall TFormStand::FormCreate(TObject *Sender)
{
CreateStrGridStuff(StrGrid,this);
}
 
int TFormStand::CreateStrGridStuff(TComponent* pParent,TComponent *pAOwner)
{
TRect rcCell;
TBitBtn      *pBtnY, *pBtnK;
 
 for(int i=0; i GRID_ROWS_NUM; i++)
 {
   for(int j=0; j GRID_CLMN_NUM; j++)
   {
    pBtnY=new TBitBtn(pAOwner);
    pBtnK=new TBitBtn(pAOwner);
 
    rcCell=StrGrid->CellRect(j+GRID_FIXED_COLUMNS,i+GRID_FIXED_ROWS);
    pBtnY->Left=rcCell.Left+CELL_CONTENT_MARGIN_LEFT;
    pBtnY->Width=CELL_BITBTN_WIDTH;
    pBtnK->Width=CELL_BITBTN_WIDTH;
    pBtnK->Left=pBtnY->Left+pBtnY->Width+CELL_BITBTN_SPACING;
    pBtnY->Top=rcCell.Top+CELL_CONTENT_MARGIN_TOP;
    pBtnK->Top=rcCell.Top+CELL_CONTENT_MARGIN_TOP;
    pBtnY->Height=CELL_BITBTN_HEIGHT;
    pBtnK->Height=CELL_BITBTN_HEIGHT;
    pBtnY->Caption=GRID_BITBTN_TEXT_DEF;
    pBtnK->Caption=GRID_BITBTN_TEXT_DEF;
 
    pBtnY->OnClick=BitBtnYClick;
    pBtnK->OnClick=BitBtnKClick;
 
 
 
    StrGrid->InsertControl(pBtnY);
    StrGrid->InsertControl(pBtnK);
 
    pBtnY->Parent=(TWinControl*)pParent;
    pBtnK->Parent=(TWinControl*)pParent;
 
    f_paBtnY[i][j]=pBtnY;
    f_paBtnK[i][j]=pBtnK;
   }
 
 }
 
 return 0;
}
 

Прототипы обработчиков:
Код
void __fastcall TFormStand::BitBtnYClick(TObject *Sender);
void __fastcall TFormStand::BitBtnKClick(TObject *Sender);

Вопрос: Почему не генерится событие OnClick при кликании на эти кнопки? Замечу что если в качестве родительского компонента TComponent* pParent передавать саму форму то есть делать вызов в виде CreateStrGridStuff(this,this) то OnClick работает.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #1 : 11 Ноябрь 2011, 15:28:45 »

Попробуй сначала задавать Parent (сразу после создания кнопок), а уж затем назначать обработчики события.
Записан
template
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 6


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #2 : 11 Ноябрь 2011, 16:37:34 »

я так изначально и сделал, а когда не сработало перенес в конец создания но не помогло.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #3 : 11 Ноябрь 2011, 17:55:50 »

Цитировать
Замечу что если в качестве родительского компонента TComponent* pParent передавать саму форму то есть делать вызов в виде CreateStrGridStuff(this,this) то OnClick работает.
Я тебе даже больше скажу: при использовании любого компонента, кроме DrawGrid-а/StringGrid-а OnClick будет работать. Гриды не предназначены для подобных вещей. Если в каждую ячейку грида положить маааааленькую панельку (для тестирования, только для тестирования), и уже её назначать Parent-ом этим кнопкам, то событие прекрасно происходит... Либо самому TStringGrid-у назначить Align=Client, положить его на TPanel нужного размера, и кнопкам выставлять

Код
Parent=pParent->Parent;
 

Кстати:
Цитировать
Код
     StrGrid->InsertControl(pBtnY);
    StrGrid->InsertControl(pBtnK);
 
    pBtnY->Parent=(TWinControl*)pParent;
    pBtnK->Parent=(TWinControl*)pParent;
это "масло масляное", либо назначаешь Parent вручную, либо это делает InsertControl...

И еще: какой смысл передавать в метод TComponent* (и там заниматься приведением типов), если Parent может быть только TWinControl*. Не проще сразу передавать TWinControl* и внутри просто работать с ним?
Записан
template
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 6


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #4 : 12 Ноябрь 2011, 13:22:15 »

Цитата: volvo877 от 11 Ноябрь 2011, 17:55:50
Я тебе даже больше скажу: при использовании любого компонента, кроме DrawGrid-а/StringGrid-а OnClick будет работать. Гриды не предназначены для подобных вещей. Если в каждую ячейку грида положить маааааленькую панельку (для тестирования, только для тестирования), и уже её назначать Parent-ом этим кнопкам, то событие прекрасно происходит... Либо самому TStringGrid-у назначить Align=Client, положить его на TPanel нужного размера, и кнопкам выставлять

Код
Parent=pParent->Parent;
 
То есть родителем кнопок по прежнему будет Грид, но ведь Грид если правильно понял игнорирует уведомления о клике от дочерних компонентов как же такая конфигурация заработает? 

Цитировать
Кстати:
Цитировать
Код
StrGrid->InsertControl(pBtnY);
StrGrid->InsertControl(pBtnK);
 
pBtnY->Parent=(TWinControl*)pParent;
pBtnK->Parent=(TWinControl*)pParent;
 
это "масло масляное", либо назначаешь Parent вручную, либо это делает InsertControl...
ну к масляному маслу можно не придираться - это остаточные следы борьбы за то чтоб заставить событие работать   


Цитировать
И еще: какой смысл передавать в метод TComponent* (и там заниматься приведением типов), если Parent может быть только TWinControl*. Не проще сразу передавать TWinControl* и внутри просто работать с ним?
согласен, можно доработать после решения основной проблемы
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #5 : 12 Ноябрь 2011, 13:53:17 »

Цитировать
То есть родителем кнопок по прежнему будет Грид
А если внимательно прочесть? Грид лежит на TPanel, вызываем pParent->Parent - следовательно, родителем будет не Грид, а его родитель - TPanel. Только поэтому такая конфигурация заработает...
Записан
template
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 6


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #6 : 12 Ноябрь 2011, 14:48:58 »

ах да ну конечно понял ухищрение. Спасибо полноценная тех поддержка!
Записан
template
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 6


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #7 : 12 Ноябрь 2011, 14:56:26 »

да это как бы один способ только нужно точно совместить координаты Панели и Грида. А возможно доработать сам Грид  в рантайме чтоб снять его ограниченность?
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #8 : 12 Ноябрь 2011, 17:19:49 »

Цитата: template от 12 Ноябрь 2011, 14:56:26
А возможно доработать сам Грид  в рантайме чтоб снять его ограниченность?
О чём не пишут в книгах по Delphi
Цитировать
Примечание

К переопределению обработчика WM_COMMAND нужно относиться осторожно, чтобы не нарушить механизм трансляции сообщений. Примером неправильного переопределения может служить класс TCustomGrid. В форумах нередко встречаются вопросы, почему элементы управления, родителем которых является TDrawGrid или TStringGrid, некорректно ведут себя: кнопки при нажатии не генерируют событие OnClick, выпадающие списки остаются пустыми и т.д. Это связано с тем, что обработчик WM_COMMAND в TCustomGrid учитывает возможность существования только одного дочернего компонента — внутреннего редактора, возникающего при включенной опции goEditing. Остальным дочерним компонентам WM_COMMAND не транслируются, и они лишены возможности корректно реагировать на происходящие с ними события. Выходом из ситуации может стать либо создание наследника от TDrawGrid или TStringGrid, который правильно транслирует WM_COMMAND, либо назначение родительским окном компонента, вставляемого в сетку, формы, панели или иного оконного компонента, который правильно транслирует это сообщение.

Более конкретно о том, в чем проблема - см. здесь: TStringGrid и TEdit::OnChange
Записан
template
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 6


Re: Динамические визуальные компоненты, проблема генерации события.
« Ответ #9 : 12 Ноябрь 2011, 21:28:56 »

Спасибо Вольво исчерпывающий ответ!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.108 секунд. Запросов: 22.