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;//Если єто вам зачем-то нужно.
}
}
Не работает мой обработчик нажатия кнопки
Подскажите пжлста почему не работает мой обработчик нажатия мною созданных кнопок. Кнопки создаются на 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);
}
Во вторых - сам код очень неаккуратен.
В третьих - вам необходимо использовать не TButton* а TSpeedButton*
В четвертых - зачем вы дублируете список указателей?
Код должен выглядеть примерно так:
Код:
OnClick почему то не работает, OnMouseDown - работает...
Во вторых - сам код очень неаккуратен.
В третьих - вам необходимо использовать не TButton* а TSpeedButton*
В четвертых - зачем вы дублируете список указателей?
Большое спасибо, кнопки заработали. Но появилась другая проблема, если много кнопок и крутишь таблицу вниз, то при нажатии отстаются верние кнопки. Как сделать чтобы кнопки отображались все? А то давишь на кнопку №20, а пишет что это кнопка №10.
Цитата: 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;
}
}
{
try{
TSpeedButton *btn = dynamic_cast<TSpeedButton *>(StringGrid2->Objects[0][StringGrid2->Row]);
ShowMessage("Hello "+btn->Name);
}
catch(...){
throw;
}
}
в противном случае - извращайтесь. Скорей всего для вашей задачи надо будет обрабатывать событие отрисовки компонента - или точнее создать свой стринггрид с кнопками :)
ага, или сделать так, чтобы кнопки вверх скроллились вместе со стрингГридом =)) изврат конечно ) но как вариант :D
Ясно, спасибо, буду пробывать
сообщение на английском: Division by zero, я же написал
catch с сообщением на русском?
Код:
int i =4;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
i=i/0;
}
catch(...)
{
MessageBox(NULL,"Ошибка","Деление на нуль",MB_OK);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
try
{
i=i/0;
}
catch(...)
{
MessageBox(NULL,"Ошибка","Деление на нуль",MB_OK);
}
}
Запусти exe'шник не из-под билдера и будет тебе счастье
без Builder-a: результат тот же: division by zero.
Уже и Builder переустановил, и настройки Project->Options менял
и Tools->DebuggerOptions менял - ничего не помогает::confused:
а в билдере SEHовские эксепшны try/catch-ами разве перехватываются?
Цитата: Тень Пса
ага, или сделать так, чтобы кнопки вверх скроллились вместе со стрингГридом =)) изврат конечно ) но как вариант :D
Легче отрисовать кнопки тогда не будет побочных эффектов и не надо будет извращаться.
Цитата: GIZMO
Легче отрисовать кнопки тогда не будет побочных эффектов и не надо будет извращаться.
А можно поподробнее про отрисовку кнопок?
У меня все работает, если запускать не из-под билдера. В том виде, в котором ты написал. Билдер, правда, пятый
2 Phodopus
Перехватываются, да
Цитата: TheMustafa
А можно поподробнее про отрисовку кнопок?
TStringGrid::OnDrawCell + ::DrawFrameControl + TStringGrid::MouseToCell ...
Путем долгих проб и сравнений с рабочим проектом определил, что
такая работа tray catch связана сo строкой в проекте BPR:
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32.lib"/>
Заменил cw32.lib на cp32mt.lib и все стало на свои места:
мой catch стал выдавать сообщение на русском.