Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
ВнизКак передать функцию класса как callback функцию или Найти похожие ветки
← →
IDL (2002-04-26 16:42) [0]Здравствуйте.
Мне в программе надо, чтобы DLL могла добавлять ListItem"ы в листбокс этого окна. Предполагалось сделать это так
procedure TForm1.Clear;
begin
ListBox1.Clear;
end;
type
TFunc : procedure;
function inDLL(func: TFunc):Boolean; // эта функция из DLL
и потом в inDLL передать @Clear данной формы, но оказалось, что это невозможно :( Может подскажете, как все-же реализовать подобное??
← →
Виктор Щербаков (2002-04-26 16:46) [1]TFunc : procedure of object;
← →
IDL (2002-04-26 16:55) [2]type
TR = procedure of object;
var
f : TR;
begin
f:=@Clear;
или inDll(@clear)
---------------
Error - variable required
← →
MBo (2002-04-26 16:59) [3]метод объекта состоит из двух указателей - Data и Сode
см. TMethod
← →
Виктор Щербаков (2002-04-26 17:05) [4]f := Clear;
← →
IDL (2002-04-26 17:09) [5]MBo
А можно чуть поподробнее? Я об этом первый раз услышал 8-( а в хелпе всего 3 строчки.
Мой Clear : TMethod ??
Тогда что такое Code и Data ? И как это применить к моей проблеме?
← →
IDL (2002-04-26 17:11) [6]Виктор Щербаков
Неа, не будет работать - Parametr list differ
← →
Виктор Щербаков (2002-04-26 17:12) [7]
> Тогда что такое Code и Data ? И как это применить к моей
> проблеме?
Code - указатель на код метода.
Data - указатель на объект, для которого метод вызывается.
← →
Виктор Щербаков (2002-04-26 17:14) [8]
> Неа, не будет работать - Parametr list differ
Нужно изменить объявление импортируемой из dll функции.
Там ведь в параметрах должна быть не просто процедура, а метод.
← →
MBo (2002-04-26 17:14) [9]то, что Виктор предложил, проходит?
Data- адрес экземпляра объекта (TForm1)
а Code - адрес функции, обший для всех объектов данного типа, т.е. для класса как такового.
← →
MBo (2002-04-26 17:16) [10]а может, сделать отдельную процедуру, не метод form1 и не мучиться?
из нее вызывать
form1.clear;
← →
Виктор Щербаков (2002-04-26 17:27) [11]var TProc = procedure(Form: TObject);
function inDLL(Proc: TProc; Form: TObject): Boolean;
procedure Clear(Form: TObject);
begin
if Assigned(Form) then
(Form as TForm1).ListBox1.Clear;
end;
А в dll:
function inDLL(Proc: TProc; Form: TObject): Boolean;
begin
...
Proc(Form);
...
end;
И не надо передавать методы.
← →
IDL (2002-04-26 17:32) [12]Про TMethod ничего не понял :), но все равно спасибо.
Сделаю так, как посоветовал Виктор Щербаков
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c