![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как поднять форму через интерфейс
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]Можно бегом?