Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.01;
Скачать: CL | DM;

Вниз

Как поднять форму через интерфейс   Найти похожие ветки 

 
Matveih1 ©   (2008-05-07 17:52) [0]

Есть основная программа. Есть Unit где описан Interface

 type
   IMayIntf = interface
   ["{223F0F2B-6C50-4DA9-8583-C210B6DD6A6A}"]
   procedure _ShowModal;
 end;


Есть BPL реализующий интерфейс.

type
 TForm1 = class(TForm, IMayIntf)
 private
   { Private declarations }
   procedure _ShowModal;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1._ShowModal;
begin
 ShowModal;
end;


Как поднять форму Form1 через интерфейс из основной программы?


 
Reindeer Moss Eater ©   (2008-05-07 17:55) [1]

Получить интерфейс, вызвать _ShowModal


 
Matveih1 ©   (2008-05-07 17:58) [2]

Хорошо. Как получить интерфейс? Приведи пример если не сложно!


 
Reindeer Moss Eater ©   (2008-05-07 17:59) [3]

QueryInterface


 
Matveih1 ©   (2008-05-07 18:02) [4]


var
 f: IMayIntf;
begin
 QueryInterface(IMayIntf, f);
 f._ShowModal;
end;


так не работает.


 
Reindeer Moss Eater ©   (2008-05-07 18:10) [5]

QueryInterface - метод класса. Запрашивать его надо у объекта реализующего этот интерфейс. А ты у кого его запрашиваешь?
У формы основного приложения?


 
Matveih1 ©   (2008-05-07 18:20) [6]

Можешь написать хороший пример! Уже месяц пытаюсь но ничего не получается.
Как в основной программе надо написать?

Form1.QueryInterface(IMayIntf, f);

Но в основной программе не объявленн класс Form1.
Приведи рабочий пример.


 
Reindeer Moss Eater ©   (2008-05-07 18:24) [7]

Можно бегом?


 
Matveih1 ©   (2008-05-07 18:28) [8]


> Можно бегом?

не понял?


 
Reindeer Moss Eater ©   (2008-05-07 18:33) [9]

не понял?

это вопрос или утверждение?

Ищи в своей бпл экспортные функции возвращающие интерфейс.
Потому что возвращать оттуда экземпляр TForm1 для того, чтобы запросить у нее интерфейс для того что бы показать её модально через _ShowModal - это только в воспаленном мозгу могло родиться такое решение.


 
Matveih1 ©   (2008-05-07 18:36) [10]

не понимаю. какую функцию надо реализовать в bpl?


 
Reindeer Moss Eater ©   (2008-05-07 18:38) [11]

возвращающую искомый интерфейс


 
Matveih1 ©   (2008-05-07 18:43) [12]

не понимаю.
Есть пример такой функции?


 
palva ©   (2008-05-07 20:28) [13]

Получить интерфейс можно присваиванием.
f := Form1;


 
Сергей М,   (2008-05-07 20:33) [14]


> Есть пример такой функции?


function GetSomeInterface: ISomeInterface;


 
Игорь Шевченко ©   (2008-05-07 20:40) [15]


> не понимаю.
> Есть пример такой функции?


Чего только в этой жизни нету:

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468


 
Kolan ©   (2008-05-07 22:45) [16]

Удалено модератором
Примечание: Выражения выбираем, не в пивной


 
Matveih1 ©   (2008-05-08 09:24) [17]


> Получить интерфейс можно присваиванием.
> f := Form1;

так Form1 не объявлена!


> Чего только в этой жизни нету:

Читал. Не спасло. Там половина примеров не работают


 
palva ©   (2008-05-08 10:01) [18]


> так Form1 не объявлена!

А я понял так, что объявлена в некотором юните, входящем в BPL

> var
>  Form1: TForm1;

Может попробовать в главном юните прописать что-то в роде:
uses <имя-юнита>:


 
Reindeer Moss Eater ©   (2008-05-08 10:47) [19]

Если класс TForm1 доступен в хост-приложении через uses, то нафига вообще интерфейс для вызова ShowModal?


 
palva ©   (2008-05-08 13:21) [20]

Ну если не доступен, тогда GetClass, как в статье [15]
Но тогда вопрос: кто пишет bpl ? Может автор сказать, что делается при инициализации BPL ?


 
Matveih1 ©   (2008-05-08 13:29) [21]


> Если класс TForm1 доступен в хост-приложении через uses,
>  то нафига вообще интерфейс для вызова ShowModal?

Вот и я про это!


> кто пишет bpl ? Может автор сказать, что делается при инициализации
> BPL ?


initialization

begin
 RegisterClass(TForm1);
end;


 
palva ©   (2008-05-08 13:58) [22]

Ну тогда GetClass должно работать. Читайте статью [15]


 
Игорь Шевченко ©   (2008-05-08 14:09) [23]

unit AppMain;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus;

type
 TForm1 = class(TForm)
   MainMenu1: TMainMenu;
   Show1: TMenuItem;
   Show2: TMenuItem;
   N1: TMenuItem;
   Exit1: TMenuItem;
   procedure Exit1Click(Sender: TObject);
   procedure Show2Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation
uses
 PkgIntf;

{$R *.dfm}

procedure TForm1.Exit1Click(Sender: TObject);
begin
 Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 InitClasses;
end;

procedure TForm1.Show2Click(Sender: TObject);
var
 Intf: IShowForm;
 AClass: TComponentClass;
 AObj: TComponent;
begin
 AClass := TComponentClass(FindClass("TForm2"));
 if Assigned(AClass) then
 begin
   AObj := AClass.Create(Self);
   try
     if AObj.GetInterface(IShowForm, Intf) then
       Intf.ShowModalForm;
   finally
     AObj.Free;
   end;
 end;
end;

end.


Это bpl (2 юнита):

unit PkgForm;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, PkgIntf;

type
 TForm2 = class(TForm, IShowForm)
   Edit1: TEdit;
   Edit2: TEdit;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 public
   procedure ShowModalForm;
 end;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
 ModalResult := mrCancel;
end;

procedure TForm2.ShowModalForm;
begin
 ShowModal;
end;

end.


unit PkgIntf;

interface
type
 IShowForm = interface
 ["{294F9099-D063-4DF3-A56A-687226F6EF51}"]
   procedure ShowModalForm;
 end;

procedure InitClasses;

implementation
uses
 Classes, PkgForm;

procedure InitClasses;
begin
 RegisterClass(TForm2);
end;

end.


 
Matveih1 ©   (2008-05-08 15:01) [24]

Да так работает! Спасибо


 
Matveih1 ©   (2008-05-10 15:09) [25]

Так работает. Но если убрать регистрацию класса из PkgIntf и вставить ее в  bpl

initialization
begin
RegisterClass(TForm2);
end;

тогда не работает, а именно не может найти класс TForm2. Хотя при загрузке паке регистрация происходит


 
Matveih1 ©   (2008-05-12 09:14) [26]

При загрузке пакета происходит регистрация класса, почему AClass := TComponentClass(FindClass("TForm2")); не находит класс?



Страницы: 1 вся ветка

Текущий архив: 2008.06.01;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.026 c
15-1208029933
TIF
2008-04-12 23:52
2008.06.01
Я фигею %-) Сейчас нечаянно вирус написал на Delphi )))


8-1181025343
karton
2007-06-05 10:35
2008.06.01
Как правильно рисовать с GetDC(0)


2-1210155494
Первокласник Вася
2008-05-07 14:18
2008.06.01
таймер


15-1208744609
Slider007
2008-04-21 06:23
2008.06.01
С днем рождения ! 21 апреля 2008 понедельник


4-1190069015
Альберт_
2007-09-18 02:43
2008.06.01
как узнать rect перерисовки чужого окна?