Главная страница
    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-1244704948
lewka
2009-06-11 11:22
2009.08.09
Математика в Delphi


15-1244082212
alert2006
2009-06-04 06:23
2009.08.09
Помогите решить задачу


15-1244493792
Медвежонок Пятачок
2009-06-09 00:43
2009.08.09
новая мулька


2-1244739123
User200902
2009-06-11 20:52
2009.08.09
Запуск проги и ожидание ее отработки


15-1244012984
oldman
2009-06-03 11:09
2009.08.09
Internet Explorer 8.0 Windows XP (yandex edition)





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