Текущий архив: 2005.12.11;
Скачать: CL | DM;
Внизmessage в dll Найти похожие ветки
← →
Alek © (2005-10-05 16:34) [0]есть проблемка.
создаю в приложении форму из dll
но эта форма не ловит сообщения CM_MOUSEENTER и CM_MOUSELEAVE.
да и вообще вроде никаких сообщений форма из длл не получает.
можно ли както отловить эти сообщения? в длл
← →
ANB © (2005-10-05 17:41) [1]
> да и вообще вроде никаких сообщений форма из длл не получает.
- не могет такого быть, если форма не висит (она по экрану ездит, если мышей тянуть ?)
← →
Alek_1 (2005-10-06 11:46) [2]форма не висит, она встроена в панель на главной форме!
← →
Leonid Troyanovsky © (2005-10-06 11:56) [3]
> Alek_1 (06.10.05 11:46) [2]
> форма не висит, она встроена в панель на главной форме!
Как все запущено.
--
Regards, LVT.
← →
Alek_1 (2005-10-06 12:07) [4]а что тут запущеного? :)
← →
Udaff © (2005-10-07 03:19) [5]RTFM
← →
Alek_1 (2005-10-07 13:51) [6]я уже все что можно пересмотрел, сообщения ловит, а вот именно CM_MOUSEENTER и CM_MOUSELEAVE не хочет :(.
← →
Игорь Шевченко © (2005-10-07 13:58) [7]Alek_1 (07.10.05 13:51) [6]
> сообщения ловит, а вот именно CM_MOUSEENTER и CM_MOUSELEAVE
> не хочет
Application потому что разный у DLL и у EXE
← →
Alek_1 (2005-10-07 14:12) [8]я передавал в ДЛЛ Application.Handle
и в длл прописывал Application.Handle:=ProjectHandle;
и всравно не помогает, может я не так прописываю? как правильно?
← →
Германн © (2005-10-07 14:21) [9]2 Alek_1 (07.10.05 14:12) [8]
А разве ИШ говорил что-то про Handle?
← →
Игорь Шевченко © (2005-10-07 14:23) [10]
> я передавал в ДЛЛ Application.Handle
Надо целиком передавать, по-видимому
← →
Alek_1 (2005-10-07 14:24) [11]а как еще привязать Application длл-ки к Application-ну главной программы?
← →
Digitman © (2005-10-07 15:29) [12]
> Alek_1 (07.10.05 14:24) [11]
> как еще привязать Application длл-ки к Application-ну главной
> программы?
каком кверху.
достаточно заглянуть в исх.тексты VCL и ущучить для себя факт того, что идентификатор Application есть идентификатор переменной типа TApplication в интерф.части юнита Forms.pas.
это означает свободный доступ к значению этой переменной со стороны любого юнита проекта, использующего этот модуль.
т.е. ничто не мешает в хост-приложении прочитать значение этой переменной и передать его параметром в одну из эксп.ф-ций в ДЛЛ, при исполнении которой переданное параметром значение можно будет записать в свою Application-переменную
другой вопрос, что в нек.случаях этой дурью маяться нет повода..
одним из таких "некоторых случаев" является случай, когда проекты И хост-приложения И библиотечного приложения собраны с опцией использования ран-тайм-пакетов, при этом объект Application будет единым И для хост-приложения И для ДЛЛ, что избавляет в подобных проблемных случаях от необходимости что-то куда-то "передавать" и "привязывать"
← →
Alek_1 (2005-10-07 15:32) [13]да я уже пробовал и TApplication передавать и integer(Application), integer(Screen)
всеравно форма неринимает эти сообщения :(.
А без них даже и незнаю что делать!
Может есть друго способ отслежить моменты когда мышка зашла на какой-то компонент, и когда его покинула?
← →
Digitman © (2005-10-07 16:01) [14]
> пробовал .. передавать
показывай, как пробовал ..
иначе - болтология ..
← →
Alek_1 (2005-10-07 16:15) [15]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;
вот тут я в библиотеке обрабатываю принятые параметры о аппликашене и скрине
← →
Alek_1 (2005-10-07 16:26) [16]пробовал и вот так:
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:51) [17]хм, вот если я ставлю галочку, компилить с рантайм пакетами, то все работает :(
как жешь сделать чтобы без рантайм пакетов было?
← →
Игорь Шевченко © (2005-10-07 17:05) [18]
> хм, вот если я ставлю галочку, компилить с рантайм пакетами,
> то все работает
А там один ControlAtom (controls.pas).
Собстна, поэтому и не находит, Application недостаточно передавать, извиняюсь за неверную информацию (хотя единство Applciation тоже важно).
Я бы посоветовал вместо MouseEnter|MouseLeave использовать функции SetCapture/ReleaseCapture
← →
Digitman © (2005-10-07 17:12) [19]
> stdcall
а это зачем ?
предполагается использовать BCB-проекты в кач-ве хост-приложений ? или где ?
← →
Alek_1 (2005-10-07 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? в хелпе я ненашел
← →
Alek_1 (2005-10-07 17:23) [21]
> а это зачем ?
на всякий случай пусть будет
← →
Digitman © (2005-10-07 17:26) [22]
> Alek_1 (07.10.05 17:23) [21]
а хоть понимаешь, что этот "всякий случай" означает и как он работает ?
← →
Alek_1 (2005-10-07 17:36) [23]недостаточно хорошо
но насколько я знаю stdcall используется в сях, и если нужно использовать длл в программе написаной на том же BCB, то нужно его ставить.
но в данном случае stdcall не должен влиять на отлавливание месаджей, или я неправ?
← →
Digitman © (2005-10-07 18:00) [24]stdcall - это:
1. Передача факт.параметров через стек.
2. Передача параметров - справа налево, в порядке их перечисления
3. За баланс стека ответсвенна сама вызываемая п/программа
> в данном случае stdcall не должен влиять на отлавливание
> месаджей
да, не должен.
← →
Игорь Шевченко © (2005-10-07 21:28) [25]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
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.037 c