![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
модальный вызов формы из длл [D6, XP]
HRustBB © (2009-05-31 12:57:00)Пытаюсь сделать модальный вызов формы из длл вот текст 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.
но модального вызова не получается, вчем дело не могу понять, хотя вроде все делаю "как в книжке"
Dennis I. Komarov (2009-06-03 09:44:00) [1]
> Чтобы "все как в книжке" ?)
Ну а как по другому? :) Раз написано так, значит так и надо...
Сергей М. (2009-06-02 18:47:00) [2]
> с приложением экран передать и все будет
> Dennis I. Komarov © (02.06.09 11:52) [13]
Угу.
Особенно из хост-приложения , написанного на языке Умбу-Юмбу - уж кому как не УЮ знать все про существование дельфийских объектов Screen и Application)
А если УЮ-хосты не планируются, тогда нахрена, спрашивается, stdcall ?)
Чтобы "все как в книжке" ?)
Dennis I. Komarov (2009-06-02 11:52:00) [3]
> Сергей М. © (02.06.09 11:01) [12]
Ну так компилится :)))
с приложением экран передать и все будет. Тока вот вечный вопрос - а нафига...???
З.Ы. - я про него запамятовал немного, т.к. в последнем проекте вызывал модально форму до MainForm (login-pass)
Сергей М. (2009-06-02 11:01:00) [4]
> Dennis I. Komarov © (02.06.09 10:23) [11]
> код должен быть рабочий
С чего бы ему быть рабочим, если объекты Screen разные?
Dennis I. Komarov (2009-06-02 10:23:00) [5]Вообще код должен быть рабочий. Деструктор формы не нужен, я бы сделал так:
Application.Handle:= AHandle;
with TFormAny.Create(Application) do try
if ShowModal = mrOk then begin
// тут обрабатываем всю инфу из этой формы
end;
finally
Free;
end;
Сергей М. (2009-06-01 21:37:00) [6]
> HRustBB (31.05.09 23:17) [5]
> мне нужно сделать модальный вызов формы
Тогда придется отказаться от затеи использовать в качестве вызывающего приложения недельфийское приложение.
А если так, то и dll нафих не нужна - форма реализуется в bpl и обращение к ней при этом ничем не отличается от обращения к форме как если бы она была реализована в самом хост-приложении.
@!!ex (2009-06-01 20:03:00) [7]> [7] HRustBB (01.06.09 19:25)
Сними галку Build with Runtime packages.
rtl100.bpl и vcl100.bpl нужно будет распространять с exe
@!!ex (2009-06-01 20:03:00) [8]> а не меняется, ошибка
Говорить что классы разные?
HRustBB (2009-06-01 19:25:00) [9]Я уже начинаю дуать что они вапще не совместимы. Сделал MDI приложение, где дочерние формы вызываются из длл, на этой форме расположен Memo, в событии OnResize формы соответствующим образом должен меняться размер Memo, а не меняется, ошибка
procedure TfrmMDI_dll.FormResize(Sender: TObject);
begin
Memo1.Height:=frmMDI_dll.Height-150;;
end;
Германн (2009-06-01 01:05:00) [10]
> а что с ним что без, результат тот же
Чего и следовало ожидать. DLL и формы Дельфи весьма плохо совместимы.
HRustBB (2009-05-31 23:17:00) [11]
> И вообше как локальные переменныы описанные в одной процедуре
> могут быть использованны в другой?
это да, вы правы, но об этом позже. Сейчас мне нужно сделать модальный вызов формы
>
> Это помоему лишнее
а что с ним что без, результат тотже
AIK (2009-05-31 14:35:00) [12]
> 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;
@!!ex (2009-05-31 13:05:00) [13]Не увидел, что Application вы передает. Комментарий мой неверный.
@!!ex (2009-05-31 13:04:00) [14]Вроде у них Application разный, а значит формы в dll не имеют отношения к формам в exe.
Хотя не уверен.
HRustBB (2009-05-31 12:59:00) [15]т.е. форма то появляется но она не модальная