Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.22;
Скачать: CL | DM;

Вниз

Проблема с формой внутри 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-70260
User
2003-05-12 12:22
2003.05.22
Create(?)


3-70129
BlackTiger
2003-04-30 16:06
2003.05.22
Как проинициализировать ADOConnection в сервисе?


3-70144
Igor Mish
2003-04-23 12:37
2003.05.22
Прокрутка DBGrid колесиком


14-70513
Навичек
2003-04-30 03:25
2003.05.22
Ошибка при динамическом создание обекта


14-70470
.::D.e.M.o.N.i.X::.
2003-05-03 18:49
2003.05.22
Есть ли пример или компонент для восстановления Zip ов?