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

Вниз

как создать MDIChild окно, находящейся в DLL?   Найти похожие ветки 

 
Saracin   (2004-02-01 15:50) [0]

В dll"ке сделал функцию типа
void CreateWindow(HWND hApp){
Application->Handle = hApp;
Form2 = new TForm2->Create(Application);
Form2->Show();
}

Если Form2 это обычное окно, то все работает. Если же оно MDIChild то выдает исклиючение с сообщзением: "Cannot скуфену form.No MDI forms are currently active". Подрузомеваю проблему с тем что у dll и у exe разные Application. Я попробывал передать в функцию TApplication* App и в теле написал Application = App; окно создается, но в главной форме теперь MDIChildCount всегда равно 0, а внутри dll у Application->MainForm->MDIChildCount работает нармально. Вообщем как быть не представляю :(.

С Уважением Saracin.


 
Saracin   (2004-02-01 16:32) [1]

Да еще фича :) если в dll"ку поместить не форму а фрейм и в функеции написать типа:
CreateFrame(TForm* fmParent){
Frame1 = new TFrame1(fmParent);
Frame1->Parent = fmParent;
}

тогда на последнем присваивании кричит что не может преобразовать TFont к TFont :))
P.S. На Frame Не чего нет, он покрашен в красный цвет.
P.S. Ошибка типа runtime error.


 
Saracin   (2004-02-01 17:05) [2]

Вот что говорит Borland по даной теме :)
http://bdn.borland.com/article/0,1410,20877,00.html

С Уважением Saracin


 
Юрий Зотов   (2004-02-01 17:53) [3]

Компилируйте EXE и DLL с run-time пакетами (либо делайте BPL вместо DLL) - не будет никаких проблем.


 
Saracin   (2004-02-01 18:02) [4]

хех с ума сойти :))) ведь была такая мысль и даже проверял ее :) но раньше почему то не прошло. Сейчас прошло. Раньше видимо уверености не зватало :)) был бы весьма признатеен если бы объяснили в чем суть дела.

С Уважением Saracin


 
Юрий Зотов   (2004-02-01 18:41) [5]

> Saracin © (01.02.04 18:02) [4]

При обычной компиляции EXE и DLL строятся, как два совершенно раздельных проекта, которые ничего друг о друге не знают. Соответственно, в каждом из них будут существовать свои собственные экземпляры глобальных объектов (Screen, Application, Mouse, Clipboard, Session и др.), в каждом из них любой один и тот же класс (например, TFont) тоже будет своим собственным классом - и т.д. В итоге нарушается нормальная работа VCL и что из этого получится - неизвестно даже Borland"у. Ясно только, что ничего хорошего не выйдет.

А вот при компиляции с run-time пакетами и EXE, и DLL будут использовать ОБЩИЕ пакеты, в которых, собственно, вся VCL и сидит. В итоге все работает номально.


 
Yuri-7   (2004-02-02 22:41) [6]

Привожу полностью проекты для вызова MDIChild окон из DLL.
Вызывающий проект:
//-------------------------------------------
program MainProject;

uses
Forms,
MainUnit1 in "MainUnit1.pas" {MainForm};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
//*******************************************
unit MainUnit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ToolWin, ComCtrls, Menus;

type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
Start: TMenuItem;
procedure StartClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

T_ProvaChild = procedure (ParentApplication: TApplication; ParentForm: TForm); stdcall;

var
MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.StartClick(Sender: TObject);
var
DllHandle: THandle;
ProcAddr: FarProc;
ProvaChild: T_ProvaChild;
begin
DllHandle := LoadLibrary("ProjectDll");
ProcAddr := GetProcAddress(DllHandle, "ProvaChild");
if ProcAddr <> nil then
begin
ProvaChild := ProcAddr;
ProvaChild(Application,Self);
end;
end;
end.

//******Проект DLL***
library ProjectDll;

uses
Windows,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
UnitDll in "UnitDll.pas" {Form1};

procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
var
Form1: TForm1;
DllProc: Pointer; { Called whenever DLL entry point is called }
begin
Application:=ParentApplication;
Form1:=TForm1.Create(ParentForm);
Form1.MyParentForm:=ParentForm;
Form1.MyParentApplication:=ParentApplication;
Form1.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then Application:=DllApplication;
end;

exports
ProvaChild;

begin
DllApplication:=Application;
DLLProc := @DLLUnloadProc;
end.
//----------------------------------------
unit UnitDll;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyParentForm: TForm;
MyParentApplication: TApplication;
end;

var
DllApplication: TApplication;

implementation

{$R *.DFM}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// Application:=DllApplication;
end;
end.



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

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

Наверх





Память: 0.47 MB
Время: 0.012 c
14-39069
Joker
2004-01-21 22:52
2004.02.13
Проблема, блин!!!


3-38724
Igoryok
2004-01-21 22:38
2004.02.13
Interface Seeka в АДО - Jet


1-38848
maxim_caban
2004-02-02 13:47
2004.02.13
функциональность Ворда в своей программе.


14-39052
blackman
2004-01-25 10:55
2004.02.13
Михалков приходит, как хозяин…


1-38910
Dik
2004-02-04 14:45
2004.02.13
Текстовый редактор





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