Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.049 c
2-1132780091
Pasha L
2005-11-24 00:08
2005.12.11
сдвинуть колонку


14-1132492679
Pazitron_Brain
2005-11-20 16:17
2005.12.11
Горные лыжи или сноуборд?


14-1132245660
User1
2005-11-17 19:41
2005.12.11
Ура!!!


4-1128428489
yanker
2005-10-04 16:21
2005.12.11
размер в памяти


1-1131624295
ASScef
2005-11-10 15:04
2005.12.11
Рисование на Canvas