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

Вниз

Импорт MDIChild форм из DLL   Найти похожие ветки 

 
kas ©   (2008-05-18 13:40) [0]

Доброго времени суток!

Такая проблема: необходимо хранить MDIChild формы в DLL и по ходу работы программы их подключать. Перерыл кучу примеров решения этой задачи в нете, но у всех одна и та же проблема: когда портируемая из DLL-библиотеки MDIChild-форма встраивается в родительскую MDI-форму, то пропадает возможность переключения фокуса с помощью Tab"а между элементами встроенной MDIChild-формы. Т.е. когда фокус стоит на одном из элементов дочерней формы и нажимаешь Таб, то фокус перескакивает на элементы другой - родительской формы.

Был бы очень признателен, если бы кто-нибудь подсказал как с этим бороться?

вот основной код DLL:


uses
 SysUtils, Classes, Forms, Dialogs, Unit1 in "Unit1.pas" {frmMyChildForm};

var
 DLLApp: TApplication;
 DLLScr: TScreen;

procedure InitPlugin(App, Scr: integer); StdCall;
begin
 DLLScr := Screen;
 Screen := TScreen(Scr);
 DLLApp := Application;
 Application := TApplication(App);
end;

procedure DonePlugin; StdCall;
begin
 Screen := DLLScr;
 Application := DLLApp;
end;

function CreateMDI: integer; StdCall;
begin
 Result := integer(TfrmMyChildForm.Create(Application.MainForm));
end;

exports
 InitPlugin, DonePlugin, CreateMDI;

begin
end.


вот вызывающий код в самом приложении


var
 Form1: TForm1;
 HLib: THandle;
 MDIForm: TForm;
 InitProc: procedure(app, scr: integer); stdcall;
 CreateMDIFunc: function: integer; stdcall;
 DonePluginProc: procedure; stdcall;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 HLib := LoadLibrary("..\dll\project1.dll");
 if HLib>HINSTANCE_ERROR then
 begin
   InitProc := GetProcAddress(HLib, "InitPlugin");
   if Assigned(InitProc) then
   begin
     InitProc(integer(Application), integer(Screen));

     CreateMDIFunc := GetProcAddress(HLib, "CreateMDI");
     If (Assigned(CreateMDIFunc)) then
       MDIForm := TForm(CreateMDIFunc);
   end;
 end
 else
   showmessage("Cannot load");
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if Assigned(MDIForm) then MDIForm.Free;
 DonePluginProc := GetProcAddress(HLib, "DonePlugin");
 if (Assigned(DonePluginProc)) then DonePluginProc;
 FreeLibrary(HLib);
end;


 
Сергей М. ©   (2008-05-18 19:59) [1]


> procedure InitPlugin(App, Scr: integer); StdCall;
> begin
>  DLLScr := Screen;
>  Screen := TScreen(Scr);
>  DLLApp := Application;
>  Application := TApplication(App);
> end;
>


Это что еще за пляски с бубном вокуруг приведения типов ?
И за каким лешим stdcall ?

Не следует передирать чужой код бездумно.


 
kas ©   (2008-05-18 21:32) [2]

Уважаемый Сергей М., Вы таким способом просто хотели поругать меня за код или все же помочь мне с проблемой? Если первое, то спасибо за критегу, если второе, то:


> Это что еще за пляски с бубном вокуруг приведения типов ?


перед тем, как начал искать примеры в нете, я переназначал глобальные объекты так:


procedure InitPlugin(App: TApplication; Scr: TScreen); stdcall;
begin
 DLLScr := Screen;
 Screen := Scr;
 DLLApp := Application;
 Application := App;
end;


- эффект тот же.


> И за каким лешим stdcall ?


а почему бы и нет? разве в данном случае это имеет значение? после вашего вопроса на всякий случай опробовал все способы - эффект то же.


 
Сергей М. ©   (2008-05-18 22:43) [3]

Ни первое и ни второе.

Хочу чтобы ты думал, логически размышлял, тогда и решение найдешь сам.

Ты не ответил ни на один вопрос ..


 
Сергей М. ©   (2008-05-18 22:47) [4]


> я переназначал глобальные объекты так


А зачем их нужно было переназначать вообще ? И таким извращенным способом ?

Чем не угодило решение с пакетами времени выполнения ?


> а почему бы и нет?


А зачем ?

Это и наводит на мысль, что код был содран бездумно


 
Amoeba ©   (2008-05-19 10:45) [5]


> > И за каким лешим stdcall ?
>
>
> а почему бы и нет? разве в данном случае это имеет значение?
>

Код замусориваешь.


 
kas ©   (2008-05-19 20:59) [6]

хм, интересное кино.


> > > И за каким лешим stdcall ?
> >
> >
> > а почему бы и нет? разве в данном случае это имеет значение?
>
> >
>
> Код замусориваешь.


Это что значит замусориваешь? Если не назначать способ передачи параметров, то автоматически используется тип register, а его используют в библиотеках только если они подключаются к приложениям Дельфи. А я всегда использую stdcall потому что он соответствует стандартной технологии передачи параметров Win32. При чем здесь замусориваешь???!!!


> А зачем их нужно было переназначать вообще ? И таким извращенным
> способом ?


Всеми другими способами, которые я опробовал, возникает исключение из-за того, что форма из DLL не видит главную MDI форму в приложении (даже когда напрямую ее конструктору указываешь, что создавать от нее). Я перечитал несколько книг по Дельфи, где описывается работа с DLL и формами в них, но нигде не решалась проблема, которую я здесь описываю. Я не претендую на звание опытного программиста, поэтому и обращаюсь сюда.

Если Вы знаете, как это сделать правильно и чтоб это работало, то очень прошу вас сказать - как! А не "плясать с бубном" вокруг того кода, который я выложил в качестве примера. А если Вы не сталкивались с такой проблемой и не знаете как ее решить то зачем вообще разговоры разговаривать.


 
Leonid Troyanovsky ©   (2008-05-19 21:13) [7]


> kas ©   (19.05.08 20:59) [6]

> как ее решить то зачем вообще разговоры разговаривать.

Зачем вообще DLL & MDI в частности.
Неопытным первое, во-ще, заказано.

--
Regards, LVT.


 
Сергей М. ©   (2008-05-19 21:13) [8]


> в библиотеках только если они подключаются к приложениям
> Дельфи


Строго наоборот - приложения, разработанные в Делфи, подключаются к библиотекам.

А теперь шевели репой - приложения, разработанные НЕ в Делфи, знать не знаю ни по какие TApplication, TScreen и иже с ними VCL-объекты, но при этом "родным" соглашениям о вызовах для них вполне может являться то самое твое содранное откуда-то бездумно stdcall-соглашение.

Вопрос на засыпку - ЧТО эти приложения должны будут передавать в твою библиотеку в кач-ве параметров App и Scr ?

Думай головой, а не причинным местом) ...


 
Сергей М. ©   (2008-05-19 21:18) [9]


> кода, который я выложил в качестве примера


Код ты содрал абсолютно бездумно.

Этот шматок кода с подобными же сопроводительными авторскими претензиями всплывает в форуме чуть ли не каждую неделю, уверяю тебя)


 
kas ©   (2008-05-19 21:36) [10]

Да я же и говорю что именно этот код я скопировал из одного из примеров, которых в нете куча! Т.к. то, что писал я сам не решало проблему до конца и всегда вылезали какие-то глюки, и я подумал, что это я такой тупой и этот код будет ближе к истине...

Ладно, фих с ним. Раз более конкретного из вас не выпытать, пойду дальше курить маны)))


 
Leonid Troyanovsky ©   (2008-05-19 21:47) [11]


> kas ©   (19.05.08 21:36) [10]

>  пойду дальше курить маны)))

Да ты, видать, обкурился уж.
Истина проста: формы в DLL - MD.

--
Regards, LVT.


 
Германн ©   (2008-05-20 03:27) [12]


> Истина проста: формы в DLL - MD.

И всё равно мода диктует их туда пихать!


 
kas ©   (2008-05-24 21:44) [13]


> Чем не угодило решение с пакетами времени выполнения ?


спасибо, опробовал для этих целей пакеты - счастлив :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
2-1244658173
aha
2009-06-10 22:22
2009.08.09
Интересует есть ли готовые компоненты , позволяющие получать


11-1205061882
DJ_UZer
2008-03-09 14:24
2009.08.09
В стиле ХР


15-1244202663
KSergey
2009-06-05 15:51
2009.08.09
Параметры (прокси) для аккаутна system


15-1244320205
Юрий
2009-06-07 00:30
2009.08.09
С днем рождения ! 7 июня 2009 воскресенье


3-1225445959
dmitry_12_08_73
2008-10-31 12:39
2009.08.09
Сохранение курсоров в TDBGrid





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