Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.004 c
14-26241
Sewix
2002-03-30 10:07
2002.05.09
Народ не вкурсе Paradox чье творение (компания)


1-26139
Дремучий
2002-04-24 18:24
2002.05.09
Скоро будет маскарад, любым маскам буду рад.


4-26289
AlexMey
2002-03-06 12:26
2002.05.09
ActiveX и браузер


14-26230
SPeller
2002-03-31 17:30
2002.05.09
Шаровары


1-26190
perov
2002-04-25 09:39
2002.05.09
Сравнение двух строк





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский