Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
4-1213084981
REA
2008-06-10 12:03
2009.07.26
QIP alike Hint Window


2-1243316725
deras
2009-05-26 09:45
2009.07.26
Как создать письмо с вложением?


11-1203566557
Jon
2008-02-21 07:02
2009.07.26
Error with CxKOLTiffJpg


2-1243397495
Алексей Иванов
2009-05-27 08:11
2009.07.26
Свойство TTreeView.Parent


2-1243836317
AntiUser
2009-06-01 10:05
2009.07.26
Чем обусловлено использование событий On... и CallBack функций?





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