Главная страница
    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.009 c
14-8599
Lexxx
2003-10-15 11:40
2003.11.03
Помогите разобраться с непонятным железячным глюком


14-8668
ZeroDivide
2003-10-13 16:19
2003.11.03
Если не переключать раскладку, то иногда можно получить....


7-8692
Сергей222
2003-08-18 19:31
2003.11.03
высокоточный таймер


8-8549
Sw_Alex
2003-07-03 04:02
2003.11.03
Линейный вход


1-8506
Brat-2
2003-10-23 07:45
2003.11.03
ShellExecute & POST





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