Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2009, 22:40   #1
DeepPurple
 
Регистрация: 18.05.2009
Сообщений: 9
По умолчанию как создать процедуру для кнопки которая еще не создана?

если конкретнее: одна кнопка создает кнопки которые добавляются в динамический массив.
необходимо чтобы по нажатию каждой кнопки она удаляла сама себя, и, допустим, чекбокс с таким же св-вом Tag.
предполагаю что через Button.OnClick но как никак разобраться не могу=\
DeepPurple вне форума Ответить с цитированием
Старый 18.05.2009, 23:42   #2
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

а вы создайте в секции private процедуру обрабатывающую onClick у каждой кнопки в массиве:
Код:
 ...
private
  procedure ButtonsClick(Sender: TObject);
 ...
procedure Form1.ButtonsClick(Sender: TObject);
begin
 //код
end;
И в коде, где вы создаете кнопки, каждой кнопке присваиваете это событие в onClick
Код:
...
Button.OnClick := ButtonsClick;
...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 19.05.2009, 02:58   #3
DeepPurple
 
Регистрация: 18.05.2009
Сообщений: 9
По умолчанию

Спасибо! действительно удается для каждой кнопки создать процедуру.
Но как узнать какая именно кнопка нажата? то есть как извлечь какое либо свойство нажатой кнопки, ведь мы не знаем его имени?
DeepPurple вне форума Ответить с цитированием
Старый 19.05.2009, 08:31   #4
Toxa
Форумчанин Подтвердите свой е-майл
 
Аватар для Toxa
 
Регистрация: 01.12.2006
Сообщений: 514
По умолчанию

используй sender
например
(sender as tbutton).caption
вот заголовок кнопки которую нажал
Пишу на Delphi за еду
Toxa вне форума Ответить с цитированием
Старый 19.05.2009, 11:17   #5
beemoto
Форумчанин
 
Аватар для beemoto
 
Регистрация: 11.04.2009
Сообщений: 277
По умолчанию

а нафига ваще создовать кнопку динамически!?
beemoto вне форума Ответить с цитированием
Старый 19.05.2009, 14:17   #6
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Для очень многих целей и программ надо создавать компоненты динамически, кнопки в том числе, ведь лучше создать динамически сто кнопок, за несколько строчек кода, чем размещать их на форме весь день.
Может надо построить несколько страниц в PageControl, и на каждой разместить кнопки из базы данных, текстового файла там...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 19.05.2009, 20:57   #7
DeepPurple
 
Регистрация: 18.05.2009
Сообщений: 9
По умолчанию

да, без денамического массива кнопок сложно бы пришлось
в моем случае создается вопрос и варианты ответа для него, так как заранее не известно сколько вариантов то массив динамический. а рядом с каждым вариантом размещается кнопка удалить.......


воспользовался выше указанным советом, попробовал 2 варианта
Код:
Procedure TfmMain.ButtonsClick( Sender : TObject );
Begin
(sender as tbutton).Parent.Destroy;

End;
и

Код:
Procedure TfmMain.ButtonsClick( Sender : TObject );
Begin
(sender as tbutton).Parent.Destroy;

End;
в обоих случаях возникает 'Abstract Error' но при этом если продолжить нужный обьект (соответственно либо сама кнопка ,либо то к чему она привязана) удаляется! и программа дальше работает... надо как то избавится от этой ошибки
я так догадываюсь что чтото я не дописываю, буду рад если поможете лучше всего чтоб работал 2й вариант
DeepPurple вне форума Ответить с цитированием
Старый 19.05.2009, 22:21   #8
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

а parent - это ведь родитель, попробуйте так:
Код:
procedure TfmMain.ButtonsClick( Sender : TObject );
var
 i: integer;
begin
 //вы еще просили удалить и чекбокс с таким же свойством tag
 for i := 0 to fmMain.ComponentCount - 1 do
  if (fmMain.Components[i] is TCheckBox) then
   if (fmMain.Components[i] as TCheckBox).Tag = (Sender as TButton).Tag then
    (fmMain.Components[i] as TCheckBox).Destroy;
 (Sender as TButton).Destroy;
end;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 20.05.2009, 00:19   #9
DeepPurple
 
Регистрация: 18.05.2009
Сообщений: 9
По умолчанию

к сожалению проблема с
(Sender as TButton).Destroy;
осталась. при добавлении этой строки сразу выскакивает Abstract Error
да и чек боксы не удаляются указанным способом=\
их удалось удалить так:
Код:
Procedure TfmMain.ButtonsClick( Sender : TObject );
var
 i: integer;
begin
 for i := 0 to High(da) do
   if da[i].Tag = (Sender as TButton).Tag then
   da[i].Destroy;

end;
пытался удалить кнопку по другому: так как в динамических массивах чекбоксов и баттонов их номера совпадают то попробовал так:
Код:
Procedure TfmMain.ButtonsClick( Sender : TObject );
var
 i: integer;
begin
 for i := 0 to High(da) do
   if da[i].Tag = (Sender as TButton).Tag then
   da[i].Destroy;
   but[i].Destroy;
end;
все равно появляется этот абстракт.

вообщем что делать с самой кнопкой так и не понял... так как по сути то она удаляется но постоянно выскакивает этот абстракт...

Последний раз редактировалось DeepPurple; 20.05.2009 в 00:35.
DeepPurple вне форума Ответить с цитированием
Старый 20.05.2009, 22:42   #10
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Вот так вроде работает:
Код:
procedure TfmMain.ButtonsClick(Sender: TObject);
var
 i: integer;
begin
 (Sender as TButton).Destroy;
 for i := 0 to fmMain.ComponentCount - 1 do
  if (fmMain.Components[i] is TCheckBox) then
   if (fmMain.Components[i] as TCheckBox).Tag = (Sender as TButton).Tag then
   begin
    (fmMain.Components[i] as TCheckBox).Destroy;
    Break;
   end;
end;
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызвать процедуру нажатия кнопки Rusl92 Общие вопросы Delphi 1 23.11.2008 13:13
Как создать обратную функцию, которая из уникального номера будет возвращать строку? SkAndrew Общие вопросы Delphi 8 06.04.2008 21:10
Составить процедуру, которая в задоном массиве С заменяет элементы Absent Помощь студентам 1 25.03.2008 23:11
Как создать процедуру и функцию? Absent Общие вопросы Delphi 1 18.11.2007 17:36