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

Ваш аккаунт

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

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

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

onclick кнопки созданной в run-time

6.4K
08 ноября 2005 года
shultz1988
33 / / 26.05.2005
кнопка у меня создается во время выполнения программы
в onclick надо присвоить процедуру с параметрами
в чем заморочка
Если параметров в процедуре нету то все работает нормально но если параметры есть то делфи требует чтобы это была не процедура а нечто с типом tnotifyevent
допустим я переделал процедуру в функцию с этим типом но после этого функция теперь выполняется не по щелчку созданной кнопки а в момент создания самой кнопки
929
08 ноября 2005 года
sp999
198 / / 31.01.2003
Цитата:
Originally posted by shultz1988
кнопка у меня создается во время выполнения программы
в onclick надо присвоить процедуру с параметрами
в чем заморочка
Если параметров в процедуре нету то все работает нормально но если параметры есть то делфи требует чтобы это была не процедура а нечто с типом tnotifyevent
допустим я переделал процедуру в функцию с этим типом но после этого функция теперь выполняется не по щелчку созданной кнопки а в момент создания самой кнопки



procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('OnClick');
end;

procedure TForm1.FormCreate(Sender: TObject);
var
B: TButton;
begin
B := TButton.Create(Self);
B.Parent := Self;
B.Left := 10;
B.Top := 10;
B.Width := 100;
B.Height := 25;
B.Caption := 'My Button';
B.OnClick := Button1Click;
end;

Удачи!

5
08 ноября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by shultz1988
кнопка у меня создается во время выполнения программы
в onclick надо присвоить процедуру с параметрами
в чем заморочка
Если параметров в процедуре нету то все работает нормально но если параметры есть то делфи требует чтобы это была не процедура а нечто с типом tnotifyevent


А ты смотрел, как объявлен TNotifyEvent?
Вот так:

 
Код:
TNotifyEvent = procedure (Sender: TObject) of object;

of object - это значит, что процедура должнабыть членом какого-нибудь класса.
То есть ты должен объявить в каком-нибудь классе (можно в той же TYourForm) новую процедуру реакции на клик и назначить своей кнопусе.
Код:
type
  TMyForm = class(TFrom)
тыры-пыры
    private
        procedure OnMyRunTimeButtonClick(Sender: TObject);
   end;

procedure TMyForm.OnMyRunTimeButtonClick(Sender: TObejct);
  begin
     DoSomething;
  end;

Когда произойдёт нажатие на твою кнопку, Sender будет как раз указывать на неё. Если у тебя было много кнопок и всем ты назначил одно и тоже событие, то используя Sender сможешь выбрать нужную.
6.4K
08 ноября 2005 года
shultz1988
33 / / 26.05.2005
Цитата:
Originally posted by hardcase
А ты смотрел, как объявлен TNotifyEvent?
Вот так:
 
Код:
TNotifyEvent = procedure (Sender: TObject) of object;

of object - это значит, что процедура должнабыть членом какого-нибудь класса.
То есть ты должен объявить в каком-нибудь классе (можно в той же TYourForm) новую процедуру реакции на клик и назначить своей кнопусе.
Код:
type
  TMyForm = class(TFrom)
тыры-пыры
    private
        procedure OnMyRunTimeButtonClick(Sender: TObject);
   end;

procedure TMyForm.OnMyRunTimeButtonClick(Sender: TObejct);
  begin
     DoSomething;
  end;

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


вы не поняли как прописать onclick для кнопки я знаю но как сделать так чтобы нормально работало
button1.onclick:=myproc(1);
хде 1-номер батона (а их у меня несколько и по нажатию кнопки в процедуру должен передаваться номер кнопки)

5
08 ноября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by shultz1988
вы не поняли как прописать onclick для кнопки я знаю но как сделать так чтобы нормально работало
button1.onclick:=myproc(1);
хде 1-номер батона (а их у меня несколько и по нажатию кнопки в процедуру должен передаваться номер кнопки)


Код:
procedure AssignOnClick(Btn: TButton; Index: integer);
begin
   case Index of
     1: begin
         Btn.OnClick:=OnClick1;
     end;
     2: begin
         Btn.OnClick:=OnClick2;
     end;
   end;
end;

можно заюзать массив процедур:
 
Код:
var
  ProcArray: array[1..BtnCount] of TNotifyEvent;

begin
   for i:=1 to BtnCount do BtnArray.Onclick:=ProcArray
end;

ну или что-то в этом духе.
предварительно, надо конечно, инициализировать массив указателями на процедуры.

Я только не понял. Как это, "процедура с параметром"?

Свойство OnClick имеет тип TNotifyEvent - только значения такого типа можно в него писать
303
09 ноября 2005 года
makbeth
1.0K / / 25.11.2004
Цитата:
Originally posted by shultz1988
вы не поняли как прописать onclick для кнопки я знаю но как сделать так чтобы нормально работало
button1.onclick:=myproc(1);
хде 1-номер батона (а их у меня несколько и по нажатию кнопки в процедуру должен передаваться номер кнопки)


Наверное имеется ввиду вот это:

Код:
// Где-то...
Button1.OnClick:=MyOnClick;
Button2.OnClick:=MyOnClick;
Button3.OnClick:=MyOnClick;
... // и т.д.

procedure TForm1.MyOnClick(Sender: TObject);
begin
    if Sender = Button1 then // Нажата Button1
    else if Sender = Button2 then // Нажата Button2
    else if Sender = Button3 then // Нажата Button3
    else ... // Нажато что-то еще
end;

или, ИМХО, лучше:
Код:
// Где-то...
Button1.OnClick:=MyOnClick;
Button1.Tag:=1;
Button2.OnClick:=MyOnClick;
Button2.Tag:=2;
Button3.OnClick:=MyOnClick;
Button3.Tag:=3;
... // и т.д.

procedure TForm1.MyOnClick(Sender: TObject);
begin
    case (Sender as TButton).Tag of
         1: // Нажата Button1
         2: // Нажата Button2
         3: // Нажата Button3
         else ... // Нажато что-то еще
    end;
end;
6.4K
09 ноября 2005 года
shultz1988
33 / / 26.05.2005
Цитата:
Originally posted by makbeth
Наверное имеется ввиду вот это:
Код:
// Где-то...
Button1.OnClick:=MyOnClick;
Button2.OnClick:=MyOnClick;
Button3.OnClick:=MyOnClick;
... // и т.д.

procedure TForm1.MyOnClick(Sender: TObject);
begin
    if Sender = Button1 then // Нажата Button1
    else if Sender = Button2 then // Нажата Button2
    else if Sender = Button3 then // Нажата Button3
    else ... // Нажато что-то еще
end;

или, ИМХО, лучше:
Код:
// Где-то...
Button1.OnClick:=MyOnClick;
Button1.Tag:=1;
Button2.OnClick:=MyOnClick;
Button2.Tag:=2;
Button3.OnClick:=MyOnClick;
Button3.Tag:=3;
... // и т.д.

procedure TForm1.MyOnClick(Sender: TObject);
begin
    case (Sender as TButton).Tag of
         1: // Нажата Button1
         2: // Нажата Button2
         3: // Нажата Button3
         else ... // Нажато что-то еще
    end;
end;


БИНГО
йопта это гениально

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог