Форум: "Основная";
Текущий архив: 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