Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
ВнизПроблема с формой внутри package Найти похожие ветки
← →
Dimderol (2003-05-08 18:35) [0]Я только делаю 1-е шаги в использовании PACKAGES и вот натолкнулся на странную картину:
Когда я создаю(вызываю) форму из пакета,
она создается и сразу же показывается на экране.
А мне нужно так, чтобы я ее создал и, если нужно,
то только тогда показал на экран.
Вот мой код
------------------------
var
AClass: TPersistentClass;
ModuleInit:IModuleInit;
begin
AClass := GetClass("MySuperClassName");
if AClass <> nil then
begin
with TComponentClass(AClass).Create(Application) as TCustomForm do
Вот ТУТ она уже ПОКАЗАЛАСЬ, а этого не нужно...
begin
try
if GetInterface(IModuleInit, ModuleInit) then
begin
Типа тут хочу выяснить нужно ли ее показывать ?
//xxx:=ModuleInit.NeedShow;
Result:=ModuleInit.ModalShow;
end else Result:=-1; // I-Face not supported
except
on E:Exception do
begin
MessageBox(0, pchar(E.Message), "PM_Init", MB_APPLMODAL+MB_ICONERROR+MB_OK);
Result:=-2;
end;
end; // GetIface exception
end
end else Result:=-99;// not TCustomForm !
end;
← →
Dimedrol (2003-05-09 08:55) [1]Что, ни у кого никаких идей ? ;-(
← →
Ученик (2003-05-09 09:46) [2]Может попробовать использовать
class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
до создания формы, проблема именно в PACKAGES, без них нормально ?
← →
Юрий Зотов (2003-05-09 09:51) [3]Проверьте у Вашей формы свойства Visible (False) и FormStyle (любое, кроме fsMDIChild).
← →
Dimderol (2003-05-09 12:01) [4]2 Юрий Зотов & All
Форма внутри PACKAGE:
- BorderStyle:=bsDialog
- FormStyle:=fsNormal
- WindowState:=wsNormal
- Visible:=false
Показывающая процедура:
function Ttestiface1.ModalShow:integer;
begin
// А тут пробовал и с "visible:=true;" и без...
// testiface1 - класс самой формы, что в пакете
Result:=testiface1.ShowModal; // show this form ! (Interface realization)
end;
Вылетает - Access violation in module "testiface.bpl" (мой модуль)
Вылетает при вызове из главной (хост) формы вот тут:
begin
try
if GetInterface(IModuleInit, ModuleInit) then
begin
ВОТ ТУТ ВЫЛЕТАЕТ - на след. строке
Result:=ModuleInit.ModalShow;
end else Result:=-1; // I-Face not supported
except
on E:Exception do
begin
MessageBox(0, pchar(E.Message), "PM_Init", MB_APPLMODAL+MB_ICONERROR+MB_OK);
Result:=-2;
end;
← →
Юрий Зотов (2003-05-09 12:57) [5]AV - похоже, возникает в ModalShow. Если "testiface1 - класс самой формы, что в пакете", то
Result:=testiface1.ShowModal
естественно, вызовет AV (ShowModal - это же не классовый метод, его надо вызывать через ссылку на ЭКЗЕМПЛЯР, а не на КЛАСС).
Только зачем такие навороты с интерфейсами и прочим? Почему нельзя создать и показать форму обычными средствами? Использование run-time пакетов их не отменяет.
← →
Dimderol (2003-05-09 13:45) [6]2 Юрий Зотов
Дело в том, что я использую (хочу использовать) пакеты
в качестве эдаких плагинов...
Для обощения и упрощения "общения" (каламбур! :-) )
с плагинами, я узнал, что "большие дяди" используют
пакеты и интерфейсы.
Вот у меня есть такой интерфейс (пока маленький):
unit CommonInterfaces;
interface
type
IModuleInit = interface
["{F64A7A46-5040-4551-A276-1E98E8F67F13}"]
function NeedShow:shortint;
function ModalShow:integer;
end;
implementation
end.
У него есть function NeedShow:shortint;
она показывает, эту форму нужно показывать или нет ?
То есть некоторые формы используются только как
хранилища объектов. Формы, а не дата-модули, это
чтобы объекты былы 1 типа, с компонентами на борту,
а если нужно выдать какое-нить окошко - ОК
вот и покажемся, не надо - будем скрытыми.
Вот реализация "интерфейсной" ф-ции, у разныз пакетов
эта ф-ция ессно будет по-разному работать:
function Ttestiface1.NeedShow:shortint;
begin
Result:=1; // yes! show this form ! (Interface realization)
end;
Так вот я даже не вызывая эту ф-цию, а к стати
она работает вполне корректно, пытаюсь показать окно,
но только тогда когда нужно ;-)
В коде я обращаюсь к этому всему делу как
AClass: TPersistentClass;
ModuleInit:IModuleInit;
Потом создаю форму, если нашел в памяти класс -
AClass := GetClass("T"+classname+"1");
if AClass <> nil then
begin
with TComponentClass(AClass).Create(Application) as TCustomForm do
Ну и так далее.
Подскажите плиз, как мне тут правильно показать форму ?
Что нужно создать и как обратиться ?
← →
Dimedrol (2003-05-09 13:46) [7]2 Юрий Зотов
Дело в том, что я использую (хочу использовать) пакеты
в качестве эдаких плагинов...
Для обощения и упрощения "общения" (каламбур! :-) )
с плагинами, я узнал, что "большие дяди" используют
пакеты и интерфейсы.
Вот у меня есть такой интерфейс (пока маленький):
unit CommonInterfaces;
interface
type
IModuleInit = interface
["{F64A7A46-5040-4551-A276-1E98E8F67F13}"]
function NeedShow:shortint;
function ModalShow:integer;
end;
implementation
end.
У него есть function NeedShow:shortint;
она показывает, эту форму нужно показывать или нет ?
То есть некоторые формы используются только как
хранилища объектов. Формы, а не дата-модули, это
чтобы объекты былы 1 типа, с компонентами на борту,
а если нужно выдать какое-нить окошко - ОК
вот и покажемся, не надо - будем скрытыми.
Вот реализация "интерфейсной" ф-ции, у разныз пакетов
эта ф-ция ессно будет по-разному работать:
function Ttestiface1.NeedShow:shortint;
begin
Result:=1; // yes! show this form ! (Interface realization)
end;
Так вот я даже не вызывая эту ф-цию, а к стати
она работает вполне корректно, пытаюсь показать окно,
но только тогда когда нужно ;-)
В коде я обращаюсь к этому всему делу как
AClass: TPersistentClass;
ModuleInit:IModuleInit;
Потом создаю форму, если нашел в памяти класс -
AClass := GetClass("T"+classname+"1");
if AClass <> nil then
begin
with TComponentClass(AClass).Create(Application) as TCustomForm do
Ну и так далее.
Подскажите плиз, как мне тут правильно показать форму ?
Что нужно создать и как обратиться ?
← →
Dimedrol (2003-05-09 16:36) [8]О! мысл Я пришла -
Форма внутри PACKAGE - по-старому:
- BorderStyle:=bsDialog
- FormStyle:=fsNormal
- WindowState:=wsNormal
- Visible:=false
function Ttestiface1.ModalShow:integer;
begin
// ----- это типа не правильно ------
//Result:=testiface1.ShowModal; // show this form ! (Interface realization)
// А вот это - работает ! Access violation-a нет...
// то есть без testiface1
Result:=ShowModal; // show this form ! (Interface realization)
end;
Ну и, конечно, в Project Options - Packages
Build with runtime packages [x] = Vcl
Ну как, "правильной дорогой иду, товарищи" ?! ;-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c