onclick кнопки созданной в run-time
в onclick надо присвоить процедуру с параметрами
в чем заморочка
Если параметров в процедуре нету то все работает нормально но если параметры есть то делфи требует чтобы это была не процедура а нечто с типом tnotifyevent
допустим я переделал процедуру в функцию с этим типом но после этого функция теперь выполняется не по щелчку созданной кнопки а в момент создания самой кнопки
Цитата:
Originally posted by shultz1988
кнопка у меня создается во время выполнения программы
в onclick надо присвоить процедуру с параметрами
в чем заморочка
Если параметров в процедуре нету то все работает нормально но если параметры есть то делфи требует чтобы это была не процедура а нечто с типом tnotifyevent
допустим я переделал процедуру в функцию с этим типом но после этого функция теперь выполняется не по щелчку созданной кнопки а в момент создания самой кнопки
кнопка у меня создается во время выполнения программы
в 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;
Удачи!
Цитата:
Originally posted by shultz1988
кнопка у меня создается во время выполнения программы
в onclick надо присвоить процедуру с параметрами
в чем заморочка
Если параметров в процедуре нету то все работает нормально но если параметры есть то делфи требует чтобы это была не процедура а нечто с типом tnotifyevent
кнопка у меня создается во время выполнения программы
в 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;
TMyForm = class(TFrom)
тыры-пыры
private
procedure OnMyRunTimeButtonClick(Sender: TObject);
end;
procedure TMyForm.OnMyRunTimeButtonClick(Sender: TObejct);
begin
DoSomething;
end;
Когда произойдёт нажатие на твою кнопку, Sender будет как раз указывать на неё. Если у тебя было много кнопок и всем ты назначил одно и тоже событие, то используя Sender сможешь выбрать нужную.
Цитата:
Originally posted by hardcase
А ты смотрел, как объявлен TNotifyEvent?
Вот так:
of object - это значит, что процедура должнабыть членом какого-нибудь класса.
То есть ты должен объявить в каком-нибудь классе (можно в той же TYourForm) новую процедуру реакции на клик и назначить своей кнопусе.
Когда произойдёт нажатие на твою кнопку, Sender будет как раз указывать на неё. Если у тебя было много кнопок и всем ты назначил одно и тоже событие, то используя Sender сможешь выбрать нужную.
А ты смотрел, как объявлен 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;
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-номер батона (а их у меня несколько и по нажатию кнопки в процедуру должен передаваться номер кнопки)
Цитата:
Originally posted by shultz1988
вы не поняли как прописать onclick для кнопки я знаю но как сделать так чтобы нормально работало
button1.onclick:=myproc(1);
хде 1-номер батона (а их у меня несколько и по нажатию кнопки в процедуру должен передаваться номер кнопки)
вы не поняли как прописать 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;
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;
ProcArray: array[1..BtnCount] of TNotifyEvent;
begin
for i:=1 to BtnCount do BtnArray.Onclick:=ProcArray
end;
ну или что-то в этом духе.
предварительно, надо конечно, инициализировать массив указателями на процедуры.
Я только не понял. Как это, "процедура с параметром"?
Свойство OnClick имеет тип TNotifyEvent - только значения такого типа можно в него писать
Цитата:
Originally posted by shultz1988
вы не поняли как прописать onclick для кнопки я знаю но как сделать так чтобы нормально работало
button1.onclick:=myproc(1);
хде 1-номер батона (а их у меня несколько и по нажатию кнопки в процедуру должен передаваться номер кнопки)
вы не поняли как прописать 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;
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;
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;
Цитата:
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;
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;
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;
БИНГО
йопта это гениально