Главная страница
    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
3-8283
rosl
2003-10-09 02:32
2003.11.03
sql


9-8249
MeF88
2003-04-03 11:19
2003.11.03
GLScene+OpenGL


3-8290
td
2003-10-11 00:14
2003.11.03
CREATE TABLE


1-8508
dolphin1
2003-10-23 17:12
2003.11.03
Минимиальный размер


6-8573
Ellik
2003-09-05 14:08
2003.11.03
Отправить E-mail, подцепив файл





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