Как передать Application в DLL?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как передать Application в DLL?

Сообщение Talker1 » 20.11.2013 14:30:25

Потребовалось передать Application в DLL, чтобы форму из DLL открывать модально.
В Delphi вопрос просто решается - передается Application.Handle, а в Лазаре у Application нет такого свойства..
Кто-нибудь решал такую задачу?
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Как передать Application в DLL?

Сообщение Zhanat » 20.11.2013 14:50:58

Form1.Handle не пробовал?
Zhanat
новенький
 
Сообщения: 21
Зарегистрирован: 06.09.2013 08:46:40

Re: Как передать Application в DLL?

Сообщение Talker1 » 20.11.2013 15:35:28

Щас попробую..

Добавлено спустя 36 минут 35 секунд:
Присвоил ParentWindow значение переданного Form1.Handle, получился несколько не тот эффект - форма из DLL оказалась вписана в форму родительскую.
Это по своему тоже занимательно, но сабж все еще интересует.

Добавлено спустя 17 часов 45 минут 28 секунд:
Нашел таки отличный пример как вызывать модально форму из DLL. Я бы не допер до такого извращения:)
http://forum.lazarus.freepascal.org/index.php/topic,8321.msg58906.html#msg58906
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Как передать Application в DLL?

Сообщение Zhanat » 21.11.2013 10:05:56

У меня загружается но не модально. Копирую код на дельфи и компелирую библиотеку, из 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
новенький
 
Сообщения: 21
Зарегистрирован: 06.09.2013 08:46:40

Re: Как передать Application в DLL?

Сообщение Talker1 » 21.11.2013 16:46:03

Zhanat По ссылке выше - сообщение на англоязычном форуме по Лазарю. К сообщению прикреплен файл dllform.zip , в нем работающий пример. Внимательно посмотри, там немного кода.

зы. Тебя не напрягает неаккуратность того кода который ты привел?

Добавлено спустя 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
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Как передать Application в DLL?

Сообщение SeZuka » 21.11.2013 19:44:58

Раньше не знали чтоли, что вся модальность сделана через Enabled ?
SeZuka
постоялец
 
Сообщения: 209
Зарегистрирован: 05.09.2012 14:58:05


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 218

Рейтинг@Mail.ru