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

Вниз

модальный вызов формы из длл   Найти похожие ветки 

 
HRustBB   (2009-05-31 12:57) [0]

Пытаюсь сделать модальный вызов формы из длл вот текст dll

library Form;
uses
 Classes,
 Unit2 in "Unit2.pas" {Form2};

exports
 CreateMyForm,
 DestroyMyForm;
end.


Unit2.pas

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

procedure CreateMyForm(AppHandle: THandle); stdcall;
procedure DestroyMyForm; stdcall;

implementation

{$R *.dfm}

procedure CreateMyForm(AppHandle: THandle);
begin
 Application.Handle := AppHandle;
 Form2 := TForm2.Create(Application);
 Form2.ShowModal;
 Form2.Free;
end;

procedure DestroyMyForm;
begin
 Form2.Free;
end;

end.


текст вызывающей программы


unit Unit1;

interface

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

type
 TCreateMyForm = procedure (AppHandle: THandle); stdcall;
 TDestroyMyForm = procedure; stdcall;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

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

procedure TForm1.Button2Click(Sender: TObject);
var FLib:LongWord;
   CreateMyForm:TCreateMyForm;
   DestroyMyForm:TDestroyMyForm;
begin
FLib := LoadLibrary(PChar("Project1.dll"));
@CreateMyForm := GetProcAddress(FLib, PChar("CreateMyForm"));
@DestroyMyForm := GetProcAddress(FLib, PChar("DestroyMyForm"));

CreateMyForm(Application.Handle);
end;

end.


но модального вызова не получается, вчем дело не могу понять, хотя вроде все делаю "как в книжке"


 
HRustBB   (2009-05-31 12:59) [1]

т.е. форма то появляется но она не модальная


 
@!!ex ©   (2009-05-31 13:04) [2]

Вроде у них Application разный, а значит формы в dll не имеют отношения к формам в exe.
Хотя не уверен.


 
@!!ex ©   (2009-05-31 13:05) [3]

Не увидел, что Application вы передает. Комментарий мой неверный.


 
AIK ©   (2009-05-31 14:35) [4]


>   Application.Handle := AppHandle;
>   Form2 := TForm2.Create(Application);
>   Form2.ShowModal;
>   Form2.Free;


Это помоему лишнее
И вообше как локальные переменныы описанные в одной процедуре могут быть использованны в другой?


> procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
> begin
>  DestroyMyForm;
> ....
> procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
> var FLib:LongWord;
> CreateMyForm:TCreateMyForm;    DestroyMyForm:
> TDestroyMyForm;


 
HRustBB   (2009-05-31 23:17) [5]


> И вообше как локальные переменныы описанные в одной процедуре
> могут быть использованны в другой?


это да, вы правы, но об этом позже. Сейчас мне нужно сделать модальный вызов формы


>
> Это помоему лишнее


а что с ним что без, результат тотже


 
Германн ©   (2009-06-01 01:05) [6]


> а что с ним что без, результат тот же

Чего и следовало ожидать. DLL и формы Дельфи весьма плохо совместимы.


 
HRustBB   (2009-06-01 19:25) [7]

Я уже начинаю дуать что они вапще не совместимы. Сделал MDI приложение, где дочерние формы вызываются из длл, на этой форме расположен Memo, в событии OnResize формы соответствующим образом должен меняться размер Memo, а не меняется, ошибка


procedure TfrmMDI_dll.FormResize(Sender: TObject);
begin
Memo1.Height:=frmMDI_dll.Height-150;;
end;


 
@!!ex ©   (2009-06-01 20:03) [8]

> [7] HRustBB   (01.06.09 19:25)

Сними галку Build with Runtime packages.
rtl100.bpl и vcl100.bpl нужно будет распространять с exe


 
@!!ex ©   (2009-06-01 20:03) [9]

> а не меняется, ошибка

Говорить что классы разные?


 
Сергей М. ©   (2009-06-01 21:37) [10]


> HRustBB   (31.05.09 23:17) [5]


> мне нужно сделать модальный вызов формы


Тогда придется отказаться от затеи использовать в качестве вызывающего приложения недельфийское приложение.
А если так, то и dll нафих не нужна - форма реализуется в bpl и обращение к ней при этом ничем не отличается от обращения к форме как если бы она была реализована в самом хост-приложении.


 
Dennis I. Komarov ©   (2009-06-02 10:23) [11]

Вообще код должен быть рабочий. Деструктор формы не нужен, я бы сделал так:
 Application.Handle:= AHandle;
 with TFormAny.Create(Application) do try
   if ShowModal = mrOk then begin
// тут обрабатываем всю инфу из этой формы
   end;
 finally
   Free;
 end;


 
Сергей М. ©   (2009-06-02 11:01) [12]


> Dennis I. Komarov ©   (02.06.09 10:23) [11]
> код должен быть рабочий


С чего бы ему быть рабочим, если объекты Screen разные ?


 
Dennis I. Komarov ©   (2009-06-02 11:52) [13]


> Сергей М. ©   (02.06.09 11:01) [12]

Ну так компилится :)))
с приложением экран передать и все будет. Тока вот вечный вопрос - а нафига...???

З.Ы. - я про него запамятовал немного, т.к. в последнем проекте вызывал модально форму до MainForm (login-pass)


 
Сергей М. ©   (2009-06-02 18:47) [14]


> с приложением экран передать и все будет


> Dennis I. Komarov ©   (02.06.09 11:52) [13]


Угу.
Особенно из хост-приложения , написанного на языке Умбу-Юмбу - уж кому как не УЮ знать все про существование дельфийских объектов Screen и Application)

А если УЮ-хосты не планируются, тогда нахрена, спрашивается, stdcall ?)
Чтобы "все как в книжке" ?)


 
Dennis I. Komarov ©   (2009-06-03 09:44) [15]


> Чтобы "все как в книжке" ?)

Ну а как по другому? :) Раз написано так, значит так и надо...



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

Текущий архив: 2009.07.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
8-1195904575
DmT
2007-11-24 14:42
2009.07.26
Вписывание картинки


15-1243409989
Skyle
2009-05-27 11:39
2009.07.26
Разобрать PDF в gif постранично.


15-1243248441
palva
2009-05-25 14:47
2009.07.26
О приватности в сети. Я фигею.


2-1243865113
Midi
2009-06-01 18:05
2009.07.26
эмулятор миди порта


15-1243085277
@!!ex
2009-05-23 17:27
2009.07.26
Не работает Shared Section.