Форум: "Начинающим";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
Внизмодальный вызов формы из длл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c