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

Вниз

Вызов обработчика события из DLL в программу   Найти похожие ветки 

 
DProg   (2003-10-22 09:53) [0]

В DLL есть форма, на ней нажимается кнопка, вызывается событие, которое обрабатывается в программе, которая вызывает DLL. Возможно ли такое, где можно почитать, может есть пример?
Спасибою


 
REA ©   (2003-10-22 09:56) [1]

Законам физики не протеворечит, хотя например параметр Sender может быть неактуален в другом модуле, т.к. разные таблицы классов.

Не пойму, впрочем, зачем такой подход - обычно наоборот форма в программе, а обработка в DLL.


 
DProg   (2003-10-22 10:07) [2]

Требуется передавать строку, не обьект.

> Не пойму, впрочем, зачем такой подход - обычно наоборот форма > в программе, а обработка в DLL.

Действительно потебовалось...

Нет ли примера?


 
REA ©   (2003-10-22 10:21) [3]

Строку тоже можно передать, но придется подключить ShareMem.
Стандартно в обработку нажатия передается Sender, но в принципе код можно вызывать уже из обработчика.
Передаем в DLL указатель на функцию.
Код типа такого (ошибок наверняка в нем много):


Type
TMyCallback = Procedure (MyString: String);

Procedure MyCallBack(MyString: String);
Begin
// Do something
End;

CallDLL(@MyCallBack);

В DLL:

MyCallback: TMyCallBack;

Procedure CallDLL(aMyCallback: TMyCallBack);
Begin
MyCallBack := aMyCallback; // Store for future use
// Show dialog here
End;

Procedure OnMyButtonClick(Sender: TObject);
Begin
If Assigned(MyCallback) Then MyCallback(MyString);
End;

Exports
CallDLL;


 
Amoeba   (2003-10-22 10:34) [4]

А может вместо DLL использовать BPL - тогда никаких проблем и вопросов не возникнет


 
DProg   (2003-10-22 10:47) [5]

> REA

type
TInterfaceProc = procedure(str: String);

TDesigner = class(TComponent)
private
iLib:HMODULE;
...
SetXMLEvent: function(procGetXML: TInterfaceProc): boolean;stdcall;
...
end;

function TDesigner.DllConnect: boolean;
begin
...
iLib := LoadLibrary("FormEdit.dll");
if iLib <> 0 then
begin
@SetXMLEvent := GetProcAddress(iLib,"_SetXMLEvent");
SetXMLEvent(@GetXML); // Ошибка! Variable required!
...
end;

procedure TDesigner.GetXML(pr: String);
begin
...
end;


 
REA ©   (2003-10-22 12:19) [6]

Вообще говоря процедура и процедура объекта это разные вещи.
Если объявить
TInterfaceProc = procedure(str: String); of object;
(синтаксис не помню, но смысл такой)
то можно будет передать указатель на именно эту процедуру объекта. Не знаю вот только процедура какого экземпляра объекта будет вызываться (чем будет Self).


 
NetKnight ©   (2003-10-22 13:19) [7]

А чем SendMessage/PostMessage не устраивает?



Страницы: 1 вся ветка

Текущий архив: 2003.11.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
14-8583
sniknik
2003-10-15 13:25
2003.11.03
Уфа это где, что? ;о))


8-8545
Сергей Ю.
2003-06-30 21:37
2003.11.03
Вывод текста в игре?


4-8717
Evgeniy
2003-08-29 14:37
2003.11.03
Передвижение формы по экрану


3-8276
Павел
2003-10-14 10:30
2003.11.03
QRMemo


1-8483
dolphin1
2003-10-24 01:12
2003.11.03
Process