Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

как создать 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
1-38773
Cosinus
2004-02-03 18:21
2004.02.13
Поиск по маске


8-38971
Layner
2003-10-02 09:38
2004.02.13
TVideoGrabber, поделитесь плз, можно более ранней, Free версией


3-38749
Kadr
2004-01-21 12:00
2004.02.13
Проблема с подключением


3-38758
sils
2004-01-21 10:19
2004.02.13
Помогите с TQuery


6-38992
_san_
2003-12-10 18:29
2004.02.13
Проблема с TclientSocket