Форум: "Начинающим";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];
ВнизКак поднять форму через интерфейс Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.05 c