Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.036 c
2-1132735366
yrbanchik
2005-11-23 11:42
2005.12.11
светомузыка


2-1132551144
KitsumVI
2005-11-21 08:32
2005.12.11
Композитивный класс


3-1130055239
ViktorZ
2005-10-23 12:13
2005.12.11
Ошибки не выдает ,но и не делает того, что надо


14-1132647302
злобная танька
2005-11-22 11:15
2005.12.11
Посоветуйте книжку по VC++ или как там его


14-1132316771
sapsi
2005-11-18 15:26
2005.12.11
Fast-report





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