Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

Как динамически создать процедуру   Найти похожие ветки 

 
Max_1   (2002-09-18 10:14) [0]

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


 
Странный Прохожий ©   (2002-09-18 10:16) [1]

Поместить процедуру в класс и создать экземпляр класса.


 
Alexey Kim ©   (2002-09-18 10:17) [2]

procedure TForm1.myproc(Sender: TObject);
...
procedure TForm1.myproc(Sender: TObject);
begin
...
end;

Button1.OnClick := myproc;

tak?


 
Max_1   (2002-09-18 10:28) [3]

Попробовал то, что написал Alex Kim - к сожалению не работает.
Наверно я не совсем точно сформулировал вопрос.
Проблема немного в другом - необходимо по ходу выполнения программы в одной из процедур в цикле создать несколько разных процедур различаться они будут несущественно - предположим все они будут выдавать сообщение на экран по команде ShowMessage,
(str) - где str у всех разный он изменяется на каждой итерации цикла.
При создании процедур необходимо событиям каким-то элементам управления присвоить каждую созданную функцию: Одно событие - одна функция.


 
Separator ©   (2002-09-18 10:34) [4]

А ты создай одну процедуру, как написал Alex Kim, но по Sender смотри кокой компонент вызвал эту процедуру


 
Старый Паскалист   (2002-09-18 10:39) [5]

>как динамически создать процедуру
Это тебе надо смотреть, как реализован MakeObjectInstance.
(шутка)

Тебе, как мне кажется, надо просто скомбинировать одну процедуру
с глобальными данными.

var
GlobalCurrentMessage: string;

procedure TForm1.SomeEvent(Sender: TObject);
begin
ShowMessage(GlobalCurrentMessage);
end;

В цикле, меняя GlobalCurrentMessage, ты меняешь поведение обработчика.


 
Separator ©   (2002-09-18 10:40) [6]

А да, забыл.
процедуру нужно создавать так:
Это все у тебя должно быть

TForm1 = class(TForm)
.....
public
//а это нужно добавить
procedure myproc(Sender: TObject);
.....
implementation

procedure TForm1.myproc(Sender: TObject);
begin
...
end;



 
qube ©   (2002-09-18 10:41) [7]

Можно так:

TEventHandler = class
private
FMsg: string;
public
constructor Create(AMsg: string);
procedure HandleEvent(Sender: TObject);
end;

//....
handler := TEventHandler.Create("куку");
Button1.OnClick := handler.HandleEvent;

Количество и типы параметров у обработчика HandleEvent должны, естественно, соответствовать обрабатываемому событию.


 
Странный Прохожий ©   (2002-09-18 10:42) [8]

>>>...

В классе разместить частные данные и передавать их при динамическом создании экземпляра класса... Работа ф-и в рамках класса может зависеть от частных данных...


 
Max_1   (2002-09-18 10:43) [9]

Что у меня получилось:

var strQ: String;

procedure TForm1.Button1Click(Sender: TObject);
procedure myproc(Sender: TObject);
begin
ShowMessage(strQ);
end;
begin
strQ:="1";
@but1.OnClick:=@myproc;
strQ:="2";
@but2.OnClick:=@myproc;
strQ:="3";
@but3.OnClick:=@myproc;
end;

В Итоге вызывается одна и та же функция - это понятно, в результате получается что при нажатии на but1, but2 и but3 выдается 3.
А хотелось бы на
but1 - 1
but2 - 2
but3 - 3


 
REA   (2002-09-18 10:46) [10]

Да бросьте вы компиляторы то создавать. Наверняка можно проще Case там разный...


 
Max_1   (2002-09-18 10:56) [11]

Большое спасибо всем за помощь.
Вероятнее всего придется сделать по совету qube и Странного Прохожего через создание экземпляра нового класса.

А может кто знает как без класса :)

И еще раз БОЛЬШОЕ спасибо!



 
Старый Паскалист   (2002-09-18 10:59) [12]

2 Max_1
Так бы сразу и сказал.

Можно в лоб:

procedure TForm1.myproc(Sender: TObject);
var message: string;
begin
if Sender = but1 then message := "1"
if Sender = but2 then message := "2"
if Sender = but3 then message := "3"
ShowMessage(message);
end;

Можно нужную строку просто в имя кнопки вставить
procedure TForm1.myproc(Sender: TObject);
var message: string;
begin
message := (Sender as Button).Name;
message := Copy(message, 4, Length(message)-3);
ShowMessage(message);
end;

Можно сделать какой-нибудь ассоциативный массив,
связывающий некоторые данные с кнопкой.

Можно связать кнопку с данными через Tag и т.д. -
вариантов много.


 
qube ©   (2002-09-18 10:59) [13]

А чем тебя класс-то не устраивает? Это, на мой взгляд, самый элегантный подход.


 
Max_1   (2002-09-18 11:03) [14]

Да нет все устраивает.
Года 2 назад я немного писал на Java - там было что-то похожее на динамическое создание процедур. Просто по старой памяти искал что-то похожее.


 
Steven ©   (2002-09-18 11:21) [15]

делай как
Старый Паскалист (18.09.02 10:59)
только Name не пойдёт. Там ведь только идентификаторы можно писать, уникальные, английскими, и т.п.
лучше Tag.
а внутри case (Sender as TButton).Tag


 
Старый Паскалист   (2002-09-18 11:34) [16]

Лучше делай как предложил qube



Страницы: 1 вся ветка

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
14-98273
AL2002
2002-09-03 11:48
2002.09.30
Может, в рифмы поиграем?


14-98296
Eduard
2002-09-02 16:02
2002.09.30
Как зарегистрироваться на Борланде ?


6-98244
yar
2002-07-26 13:45
2002.09.30
Client/Server - новые веяния


7-98369
Kotka
2002-07-18 17:38
2002.09.30
Как вывести эту штуку...


1-98187
AndreyS
2002-09-18 11:08
2002.09.30
Стиль