Главная страница
    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.005 c
1-26170
Georg
2002-04-25 11:49
2002.05.09
Декоративная щель


14-26235
cok
2002-03-30 19:38
2002.05.09
Помогите, пожалуйста (срочно!).


3-26003
Jakov
2002-04-05 13:59
2002.05.09
.dbx - ?


4-26286
Frogkiller
2002-02-28 23:06
2002.05.09
Как считать значение переменной в другом потоке?


1-26062
Александр_30
2002-04-25 09:20
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский