Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как динамически создать процедуру


Max_1 ©   (2002-09-18 10:14:00) 

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


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

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


Steven   (2002-09-18 11:21:00) [2]

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


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

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


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

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:00) [5]

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


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

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

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

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


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

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


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

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

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


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

>>>...

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


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

Можно так:

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

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

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


Separator   (2002-09-18 10:40:00) [11]

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

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

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


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

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

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

var
GlobalCurrentMessage: string;

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

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


Separator   (2002-09-18 10:34:00) [13]

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


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

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


Alexey Kim   (2002-09-18 10:17:00) [15]

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

Button1.OnClick := myproc;

tak?


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо