Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.062 c
15-1208365801
{RASkov}
2008-04-16 21:10
2008.06.01
Jawa в телефонах


2-1210586371
NieL
2008-05-12 13:59
2008.06.01
функция GetAge


3-1198497594
Максим
2007-12-24 14:59
2008.06.01
Многотабличные запросы (модификация данных)


15-1208721535
Dmitry S
2008-04-20 23:58
2008.06.01
дешевые СМС.


2-1210591316
Leo
2008-05-12 15:21
2008.06.01
Захват записи или распределение доступа к оной.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский