Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
3-98006
Леван
2002-09-07 10:07
2002.09.30
Kак сделать Continue после Locate?


14-98304
BigBadMutuh
2002-09-03 00:39
2002.09.30
МИРЭА


4-98414
anod
2002-08-13 12:28
2002.09.30
КАк установить высоту окна


1-98060
maxim2
2002-09-19 12:39
2002.09.30
Есть ли такой компонент, или как сделать...


1-98209
Losyara
2002-09-18 16:38
2002.09.30
OLE Automation для Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский