Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.024 c
7-8676
don-do
2003-08-22 11:27
2003.11.03
reader магнитных карт


3-8327
bav
2003-10-12 12:41
2003.11.03
Как правильно сделать Связь таблиц в Apollo ?


1-8362
Master
2003-10-23 04:53
2003.11.03
Как определить букву СD-ROMa? GetDriveType?


1-8396
Sandman25
2003-10-20 17:48
2003.11.03
Exe в 2 Mb - много или мало?


14-8616
Maxim Vetera
2003-10-15 19:29
2003.11.03
«Растекаясь мыслью по древу»




   Наверх