![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
message в dll [D5]
Alek © (2005-10-05 16:34:00)есть проблемка.
создаю в приложении форму из dll
но эта форма не ловит сообщения CM_MOUSEENTER и CM_MOUSELEAVE.
да и вообще вроде никаких сообщений форма из длл не получает.
можно ли както отловить эти сообщения? в длл
Игорь Шевченко (2005-10-07 21:28:00) [1]Alek_1 (07.10.05 17:21) [20]
> насколько я понимаю нужно передавать вот так?:
>
> function GetWN1(Ntck:String; App: TApplication; cAtom: TAtom):
> IWinControl; stdcall; export;
> begin
>
> ControlAtom:=cAtom;
> DLLApp := Application;
> Application := App;
>
> If Ntck='test' then Result:=TFormWN1.Create(Application);
>
>
> end;
>
> а где можно почитать поподробнее о ControlAtom? в хелпе
> я ненашел
Нет, ControlAtom недоступен для изменения, поэтому так передавать бесполезно.
Почитать можно в исходных текстах VCL, начиная с метода TApplication.DoMouseIdle в forms.pas и заканчивая функциями FindDragTarget и FindControl в controls.pas
Digitman (2005-10-07 18:00:00) [2]stdcall - это:
1. Передача факт.параметров через стек.
2. Передача параметров - справа налево, в порядке их перечисления
3. За баланс стека ответсвенна сама вызываемая п/программа
> в данном случае stdcall не должен влиять на отлавливание
> месаджей
да, не должен.
Alek_1 (2005-10-07 17:36:00) [3]недостаточно хорошо
но насколько я знаю stdcall используется в сях, и если нужно использовать длл в программе написаной на том же BCB, то нужно его ставить.
но в данном случае stdcall не должен влиять на отлавливание месаджей, или я неправ?
Digitman (2005-10-07 17:26:00) [4]
> Alek_1 (07.10.05 17:23) [21]
а хоть понимаешь, что этот "всякий случай" означает и как он работает ?
Alek_1 (2005-10-07 17:23:00) [5]
> а это зачем ?
на всякий случай пусть будет
Alek_1 (2005-10-07 17:21:00) [6]насколько я понимаю нужно передавать вот так?:
function GetWN1(Ntck:String; App: TApplication; cAtom: TAtom):IWinControl; stdcall; export;
begin
ControlAtom:=cAtom;
DLLApp := Application;
Application := App;
If Ntck='test' then Result:=TFormWN1.Create(Application);
end;
а где можно почитать поподробнее о ControlAtom? в хелпе я ненашел
Digitman (2005-10-07 17:12:00) [7]
> stdcall
а это зачем ?
предполагается использовать BCB-проекты в кач-ве хост-приложений ? или где ?
Игорь Шевченко (2005-10-07 17:05:00) [8]
> хм, вот если я ставлю галочку, компилить с рантайм пакетами,
> то все работает
А там один ControlAtom (controls.pas).
Собстна, поэтому и не находит, Application недостаточно передавать, извиняюсь за неверную информацию (хотя единство Applciation тоже важно).
Я бы посоветовал вместо MouseEnter|MouseLeave использовать функции SetCapture/ReleaseCapture
Alek_1 (2005-10-07 16:51:00) [9]хм, вот если я ставлю галочку, компилить с рантайм пакетами, то все работает :(
как жешь сделать чтобы без рантайм пакетов было?
Alek_1 (2005-10-07 16:26:00) [10]пробовал и вот так:
function GetWN1(Ntck:String; App: TApplication):IWinControl; stdcall; export;
begin
DLLApp := Application;
Application := App;
If Ntck='test' then Result:=TFormWN1.Create(Application);
end;
Alek_1 (2005-10-07 16:15:00) [11]function GetWN1(Ntck:String; App, Scr: integer):IWinControl; stdcall; export;
begin
DLLScr := Screen;
Screen := TScreen(Scr);
DLLApp := Application;
Application := TApplication(App);
// Application:=App;
If Ntck='test' then Result:=TFormWN1.Create(Application);
If Ntck='menu' then Result:=TFormAM1.Create(nil);
{If Ntck='Íåòîðãè' then Result:=TForm5.Create(nil);
If Ntck='Ñîáñòâåííàÿ' then Result:=TForm6.Create(nil);}
end;
вот тут я в библиотеке обрабатываю принятые параметры о аппликашене и скрине
Digitman (2005-10-07 16:01:00) [12]
> пробовал .. передавать
показывай, как пробовал ..
иначе - болтология ..
Alek_1 (2005-10-07 15:32:00) [13]да я уже пробовал и TApplication передавать и integer(Application), integer(Screen)
всеравно форма неринимает эти сообщения :(.
А без них даже и незнаю что делать!
Может есть друго способ отслежить моменты когда мышка зашла на какой-то компонент, и когда его покинула?
Digitman (2005-10-07 15:29:00) [14]
> Alek_1 (07.10.05 14:24) [11]
> как еще привязать Application длл-ки к Application-ну главной
> программы?
каком кверху.
достаточно заглянуть в исх.тексты VCL и ущучить для себя факт того, что идентификатор Application есть идентификатор переменной типа TApplication в интерф.части юнита Forms.pas.
это означает свободный доступ к значению этой переменной со стороны любого юнита проекта, использующего этот модуль.
т.е. ничто не мешает в хост-приложении прочитать значение этой переменной и передать его параметром в одну из эксп.ф-ций в ДЛЛ, при исполнении которой переданное параметром значение можно будет записать в свою Application-переменную
другой вопрос, что в нек.случаях этой дурью маяться нет повода..
одним из таких "некоторых случаев" является случай, когда проекты И хост-приложения И библиотечного приложения собраны с опцией использования ран-тайм-пакетов, при этом объект Application будет единым И для хост-приложения И для ДЛЛ, что избавляет в подобных проблемных случаях от необходимости что-то куда-то "передавать" и "привязывать"
Alek_1 (2005-10-07 14:24:00) [15]а как еще привязать Application длл-ки к Application-ну главной программы?
Игорь Шевченко (2005-10-07 14:23:00) [16]
> я передавал в ДЛЛ Application.Handle
Надо целиком передавать, по-видимому
Германн (2005-10-07 14:21:00) [17]2 Alek_1 (07.10.05 14:12) [8]
А разве ИШ говорил что-то про Handle?
Alek_1 (2005-10-07 14:12:00) [18]я передавал в ДЛЛ Application.Handle
и в длл прописывал Application.Handle:=ProjectHandle;
и всравно не помогает, может я не так прописываю? как правильно?
Игорь Шевченко (2005-10-07 13:58:00) [19]Alek_1 (07.10.05 13:51) [6]
> сообщения ловит, а вот именно CM_MOUSEENTER и CM_MOUSELEAVE
> не хочет
Application потому что разный у DLL и у EXE
Alek_1 (2005-10-07 13:51:00) [20]я уже все что можно пересмотрел, сообщения ловит, а вот именно CM_MOUSEENTER и CM_MOUSELEAVE не хочет :(.