Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

message в dll [D5]


Страницы:   1 2

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 не хочет :(.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо