Потребовалось передать Application в DLL, чтобы форму из DLL открывать модально.
В Delphi вопрос просто решается - передается Application.Handle, а в Лазаре у Application нет такого свойства..
Кто-нибудь решал такую задачу?
Как передать Application в DLL?
Модератор: Модераторы
Form1.Handle не пробовал?
Щас попробую..
Добавлено спустя 36 минут 35 секунд:
Присвоил ParentWindow значение переданного Form1.Handle, получился несколько не тот эффект - форма из DLL оказалась вписана в форму родительскую.
Это по своему тоже занимательно, но сабж все еще интересует.
Добавлено спустя 17 часов 45 минут 28 секунд:
Нашел таки отличный пример как вызывать модально форму из DLL. Я бы не допер до такого извращения:)
http://forum.lazarus.freepascal.org/index.php/topic,8321.msg58906.html#msg58906
Добавлено спустя 36 минут 35 секунд:
Присвоил ParentWindow значение переданного Form1.Handle, получился несколько не тот эффект - форма из DLL оказалась вписана в форму родительскую.
Это по своему тоже занимательно, но сабж все еще интересует.
Добавлено спустя 17 часов 45 минут 28 секунд:
Нашел таки отличный пример как вызывать модально форму из DLL. Я бы не допер до такого извращения:)
http://forum.lazarus.freepascal.org/index.php/topic,8321.msg58906.html#msg58906
У меня загружается но не модально. Копирую код на дельфи и компелирую библиотеку, из dll delphi загружается модально. Не разобрался в этом. Вот код dll:
а вот программы который загружает:
Код: Выделить всё
library project1;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, Interfaces, Windows, LCLType, Unit1, Forms
{ you can add units after this };
Function ShowDllFormm:Integer; stdcall;
var
FRM:TForm1;
begin
FRM:=TForm1.Create(Application);
Result:=Frm.ShowModal;
FrM.Free;
end;
exports ShowDllFormm;
begin
Application.Initialize;
end.
а вот программы который загружает:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,LCLType, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, dynlibs;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
type
TShowDllFormm = Function():Integer ; stdcall;
var
ShowDllFormm: TShowDllFormm;
DllHandle: TLibHandle;
// I: integer;
begin
DllHandle := LoadLibrary('project1.dll');
try
ShowDllFormm := TShowDllFormm(GetProcedureAddress(DllHandle, 'ShowDllFormm'));
ShowDllFormm;
finally
UnloadLibrary(DllHandle);
end;
end;
end.
Zhanat По ссылке выше - сообщение на англоязычном форуме по Лазарю. К сообщению прикреплен файл dllform.zip , в нем работающий пример. Внимательно посмотри, там немного кода.
зы. Тебя не напрягает неаккуратность того кода который ты привел?
Добавлено спустя 1 час 49 минут 38 секунд:
Только что выяснил - хитрые подпрыги с типом формы в примере по ссылке вообще ни к чему.
для обеспечения модельности перед вызовом формы из DLL тупо пишем Self.Enabled := False;, а после Self.Enabled := True;
Типа такого:
зы. ссылки по теме, чтоб не потерять:
http://forum.lazarus.freepascal.org/ind ... 15142.html
http://forum.lazarus.freepascal.org/ind ... 54178.html
зы. Тебя не напрягает неаккуратность того кода который ты привел?
Добавлено спустя 1 час 49 минут 38 секунд:
Только что выяснил - хитрые подпрыги с типом формы в примере по ссылке вообще ни к чему.
для обеспечения модельности перед вызовом формы из DLL тупо пишем Self.Enabled := False;, а после Self.Enabled := True;
Типа такого:
Код: Выделить всё
procedure OpenFJournal(db: Pointer); external 'MyLib.dll';
procedure TfrmMain.Button1Click(Sender: TObject);
begin
Self.Enabled := False;
try
OpenFJournal(@ZConnection1);
finally
Self.Enabled := True;
end;
end;
зы. ссылки по теме, чтоб не потерять:
http://forum.lazarus.freepascal.org/ind ... 15142.html
http://forum.lazarus.freepascal.org/ind ... 54178.html
Раньше не знали чтоли, что вся модальность сделана через Enabled ?
