Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает мой обработчик нажатия кнопки

25K
08 сентября 2008 года
TheMustafa
33 / / 08.09.2008
Здравствуйте!

Подскажите пжлста почему не работает мой обработчик нажатия мною созданных кнопок. Кнопки создаются на StringGride.
С++Билдер6

void __fastcall TForm1::Button2Click(TObject *Sender)
{
int i;
TButton *myBtn[10];

StringGrid2->ColWidths[0] = 120;
StringGrid2->RowCount = 10;
for (i=0; i<StringGrid2->RowCount; i++)
StringGrid2->RowHeights = 40;
for (i=0;i<10;i++)
{
StringGrid2->Cells[1] = IntToStr(i);
//
myBtn = new TButton(this);
myBtn->Name = "MyBtn"+IntToStr(i+1);
myBtn->Caption = "...";
myBtn->Parent = StringGrid2;
myBtn->Height = 20;
myBtn->Width = 20;
myBtn->Left = StringGrid2->CellRect(0,i).Width()-25; //Left+10;
myBtn->Top = StringGrid2->CellRect(0,i).Top+10;
myBtn->OnClick = MyBtnClick;
}

}
void __fastcall TForm1::MyBtnClick(TObject *Sender)
{
TButton *btn = (TButton*)Sender;

ShowMessage("Hello "+btn->Name);
}
1
08 сентября 2008 года
kot_
7.3K / / 20.01.2000
Во первых используйте средства форматирования кода.
Во вторых - сам код очень неаккуратен.
В третьих - вам необходимо использовать не TButton* а TSpeedButton*
В четвертых - зачем вы дублируете список указателей?
Код должен выглядеть примерно так:
Код:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{

 StringGrid2->ColWidths[0] = 120;
//У вас нигде не изменяется расположение кнопки по ширине - зачем вычислять его каждый раз?
 int left = StringGrid2->CellRect(0,0).Width()-25;
 
 StringGrid2->RowCount = 10;
 int countrows = StringGrid2->RowCount;
 TSpeedButton *myBtn = NULL;


 for (int i=0; i < countrows; ++i)
  {
   StringGrid2->RowHeights = 40;
   StringGrid2->Cells[1] = IntToStr(i);
   myBtn = new TSpeedButton(this);
   myBtn->Name = "MyBtn"+IntToStr(i+1);
   myBtn->Caption = "...";
   myBtn->Parent = StringGrid2;
   myBtn->Height = 20;
   myBtn->Width = 20;
   myBtn->Left = left; //
   myBtn->Top = StringGrid2->CellRect(0,i).Top+10;
   myBtn->OnClick = TForm1::MyBtnClick;
   StringGrid2->Objects[0] = myBtn;//Если єто вам зачем-то нужно.
   }
 }
11
08 сентября 2008 года
oxotnik333
2.9K / / 03.08.2007
OnClick почему то не работает, OnMouseDown - работает...
25K
08 сентября 2008 года
TheMustafa
33 / / 08.09.2008
[QUOTE=kot_;257624]Во первых используйте средства форматирования кода.
Во вторых - сам код очень неаккуратен.
В третьих - вам необходимо использовать не TButton* а TSpeedButton*
В четвертых - зачем вы дублируете список указателей?

Большое спасибо, кнопки заработали. Но появилась другая проблема, если много кнопок и крутишь таблицу вниз, то при нажатии отстаются верние кнопки. Как сделать чтобы кнопки отображались все? А то давишь на кнопку №20, а пишет что это кнопка №10.
1
08 сентября 2008 года
kot_
7.3K / / 20.01.2000
Цитата: TheMustafa

Большое спасибо, кнопки заработали. Но появилась другая проблема, если много кнопок и крутишь таблицу вниз, то при нажатии отстаются верние кнопки. Как сделать чтобы кнопки отображались все? А то давишь на кнопку №20, а пишет что это кнопка №10.


Это естественно. Компонент знает как ему отрисовать строки - а про ваши кнопки он не знает ничего.
если вы в состоянии гарантировать что при клике на кнопку выделена нужная вам строка то можете использовать нечто такое:

 
Код:
void __fastcall TForm1::MyBtnClick(TObject *Sender)
{
try{
 TSpeedButton *btn = dynamic_cast<TSpeedButton *>(StringGrid2->Objects[0][StringGrid2->Row]);
 ShowMessage("Hello "+btn->Name);
 }
 catch(...){
 throw;
 }
}

в противном случае - извращайтесь. Скорей всего для вашей задачи надо будет обрабатывать событие отрисовки компонента - или точнее создать свой стринггрид с кнопками :)
92
08 сентября 2008 года
Тень Пса
2.2K / / 19.10.2006
ага, или сделать так, чтобы кнопки вверх скроллились вместе со стрингГридом =)) изврат конечно ) но как вариант :D
25K
09 сентября 2008 года
TheMustafa
33 / / 08.09.2008
Ясно, спасибо, буду пробывать
1.9K
09 сентября 2008 года
George22
91 / / 09.12.2007
Уважаемые знатоки, почему при нажатии на кнопку выдается
сообщение на английском: Division by zero, я же написал
catch с сообщением на русском?
Код:
int i =4;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 try
  {
 i=i/0;
  }
 catch(...)
  {
 MessageBox(NULL,"Ошибка","Деление на нуль",MB_OK);
  }
}
535
09 сентября 2008 года
Нездешний
537 / / 17.01.2008
Запусти exe'шник не из-под билдера и будет тебе счастье
1.9K
09 сентября 2008 года
George22
91 / / 09.12.2007
Пробовал: запускал и Debug-версию и Release-версию Exe
без Builder-a: результат тот же: division by zero.
Уже и Builder переустановил, и настройки Project->Options менял
и Tools->DebuggerOptions менял - ничего не помогает::confused:
14
09 сентября 2008 года
Phodopus
3.3K / / 19.06.2008
а в билдере SEHовские эксепшны try/catch-ами разве перехватываются?
246
09 сентября 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Тень Пса
ага, или сделать так, чтобы кнопки вверх скроллились вместе со стрингГридом =)) изврат конечно ) но как вариант :D


Легче отрисовать кнопки тогда не будет побочных эффектов и не надо будет извращаться.

25K
09 сентября 2008 года
TheMustafa
33 / / 08.09.2008
Цитата: GIZMO
Легче отрисовать кнопки тогда не будет побочных эффектов и не надо будет извращаться.



А можно поподробнее про отрисовку кнопок?

535
09 сентября 2008 года
Нездешний
537 / / 17.01.2008
2 George22
У меня все работает, если запускать не из-под билдера. В том виде, в котором ты написал. Билдер, правда, пятый

2 Phodopus
Перехватываются, да
246
09 сентября 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: TheMustafa
А можно поподробнее про отрисовку кнопок?


TStringGrid::OnDrawCell + ::DrawFrameControl + TStringGrid::MouseToCell ...

1.9K
11 сентября 2008 года
George22
91 / / 09.12.2007
Mustafa, sorry, что занял твою тему.

Путем долгих проб и сравнений с рабочим проектом определил, что
такая работа tray catch связана сo строкой в проекте BPR:

<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32.lib"/>

Заменил cw32.lib на cp32mt.lib и все стало на свои места:
мой catch стал выдавать сообщение на русском.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог