Главная страница
    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.009 c
2-1243933787
Igor2010
2009-06-02 13:09
2009.07.26
TabSheet в PageControl


15-1243262430
Unknown user
2009-05-25 18:40
2009.07.26
быстрый TTreeView


2-1243832097
sotrudnik1
2009-06-01 08:54
2009.07.26
отправить значение буквы в стороннее приложение


15-1243283409
Юрий
2009-05-26 00:30
2009.07.26
С днем рождения ! 26 мая 2009 вторник


15-1243259541
SkyN
2009-05-25 17:52
2009.07.26
Как поместить программу в "Установка и удаление программ"?





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