Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Matveih1 ©   (2008-05-07 17:52:00) 

Есть основная программа. Есть 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 через интерфейс из основной программы?


Matveih1   (2008-05-12 09:14:00) [1]

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


Matveih1   (2008-05-10 15:09:00) [2]

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

initialization
begin
RegisterClass(TForm2);
end;

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


Matveih1   (2008-05-08 15:01:00) [3]

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


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

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.


palva   (2008-05-08 13:58:00) [5]

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


Matveih1   (2008-05-08 13:29:00) [6]


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

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


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


initialization

begin
 RegisterClass(TForm1);
end;


palva   (2008-05-08 13:21:00) [7]

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


Reindeer Moss Eater   (2008-05-08 10:47:00) [8]

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


palva   (2008-05-08 10:01:00) [9]


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

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

> var
>  Form1: TForm1;

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


Matveih1   (2008-05-08 09:24:00) [10]


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

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


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

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


Kolan   (2008-05-07 22:45:00) [11]

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


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


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


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

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


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


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


function GetSomeInterface: ISomeInterface;


palva   (2008-05-07 20:28:00) [14]

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


Matveih1   (2008-05-07 18:43:00) [15]

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


Reindeer Moss Eater   (2008-05-07 18:38:00) [16]

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


Matveih1   (2008-05-07 18:36:00) [17]

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


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

не понял?

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

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


Matveih1   (2008-05-07 18:28:00) [19]


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

не понял?


Reindeer Moss Eater   (2008-05-07 18:24:00) [20]

Можно бегом?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо