Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Вниз

Вызов обработчика события из 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.014 c
1-8536
Raduga
2003-10-23 08:36
2003.11.03
Сохранение и загрузка свойств компонента, содержащего другие объе


14-8627
Skier
2003-10-15 10:16
2003.11.03
Cловарь английский акронимов.


1-8350
GreySerg
2003-10-22 16:40
2003.11.03
Как определить запущено ли уже какое-то приложение или нет ?


14-8673
Zergling
2003-10-12 10:03
2003.11.03
Заправка катриджа для HP 840С - черный


6-8578
pec2
2003-09-07 21:09
2003.11.03
почта





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