Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2013, 16:37   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию передать ссылку на процедуру в качестве строки

Иногда возникает необходимость связать 2 отдельных компонента,
например в одном есть поле типа:TStrings, а другой и есть тот самый TStrings:

X:TMyClass;
L:TStrings;

хочу сделать так, чтобы два компонента связывали свои интерфейсы с помощью одной строки. Для этого нужно представить L в виде строки.

я придумал как это сделать:
P: pointer;
P:=L;
i:=Integer(P);
s:=IntToStr(i);

а потом в обратном порядке - строка расшифровывается объектом,
необходимый TStrings успешно назначается полю компонента и все работает.


но у меня возникли сложности с передачей таким же способом процедур...
допустим есть простая процедура (точнее метод класса):
procedure TMyClass.Test;
begin
...
end;

описан тип данных:
TSimpleProcedure:=procedure of object;

и поле соответствующего типа в объекте TMyClass2:
FOnClick:TSimpleProcedure;

сделать нужно вот что:
C1:TMyClass;
C2:TMyClass2;
C2.FOnClick:=C1.Test;

вот такое нехитрое присвоение, но как сделать это через строковую переменную?
(как я это описывал для L:TStrings)

как получить указатель (P: pointer) на процедуру?
xrob вне форума Ответить с цитированием
Старый 24.02.2013, 16:48   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Читать http://www.gunsmoker.ru/2008/12/static-delphi.html

Чисто от себя - глупо через строку, хоть бы уж через integer, ведь указатель - обычное число по сути.

А вообще - "Вы что-то делаете не так" © какой-то гуру
Распишите задачу, а не то, как Вы придумали её решать - и Вам подскажут более нормальное решение.
phomm вне форума Ответить с цитированием
Старый 24.02.2013, 16:58   #3
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

CTL в помощь.
Не. API не катит. Ну не люблю я его...
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.02.2013, 17:27   #4
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Все мы нормально делаем.
Ибо некоторому объекту нужно присвоить (к примеру):
20 процедур,
48 различных параметров,
35 других объектов.

и я не хочу каждый раз, когда это надо сделать, писать 20+48+35 строчек кода,
я хочу писать MyObject.SetInterface(Params);

Params в данном случае - строка вида "имя - значение":
pcoc1 54664465 // ссылка на процедуру
pcoc2 54664465 // ссылка на процедуру
obj1 37642357 // ссылка на объект
obj2 34521357 // ссылка на объект
obj3 34358957 // ссылка на объект
name Krevedko // непосредственно параметр
width 450 // непосредственно параметр
height 120 // непосредственно параметр

смысл переводить в строку - чтобы передать потом всю пачку параметров в одной строке, а не по одному.
а смысл переводить в integer?
я с таким же успехом и напрямую передам =)
xrob вне форума Ответить с цитированием
Старый 24.02.2013, 17:33   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

откройте для себя структуры, ибо для вашей строки у вас все равно куча кода.

а через строку, это ппц, не внутри однородных компонентов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.02.2013, 18:14   #6
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Пепел Феникса, структуры - понятие растяжимое.
не могли бы вы конкретизировать?

и, Пепел Феникса, С1.SetParams(C2.GetParams); - вполне приемлемая "куча" кода...

еще разок уточню что мне нужно:
pointer:=@Form1.Button1Click;

Последний раз редактировалось xrob; 24.02.2013 в 21:37.
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно передать указатель на метод в качестве функции возврата? Lyubimov Помощь студентам 1 25.11.2011 08:09
Передача многомерных динамических массивов в процедуру в качестве параметр-переменной Leiph Общие вопросы Delphi 2 04.10.2011 03:07
Как массив передать в качестве аргумента функции Mixim C# (си шарп) 7 10.03.2011 09:53
Передача поля объекта в процедуру в качестве параметра Голованов Д. Microsoft Office Excel 10 02.11.2009 16:22