Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.09;
Скачать: CL | DM;

Вниз

Как передать функцию класса как 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
3-25986
MagG0T
2002-04-13 16:52
2002.05.09
Автоматическое объявляние алиасов


4-26316
Zurgul
2002-03-05 17:22
2002.05.09
отладка сервиса???


1-26198
Denis Yenin
2002-04-25 16:36
2002.05.09
Как сделать, чтобы MDI приложение было а-ля Delphi, Builder?


1-26157
Oleg_er
2002-04-25 08:13
2002.05.09
Поверх других окон


1-26054
max_
2002-04-20 22:09
2002.05.09
Ошибка при установке Delphi 5.0