Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-70454
Mirva
2003-05-03 06:03
2003.05.22
Подскажите алгоритм


1-70216
Михайлов Антон
2003-05-10 16:40
2003.05.22
Делаю тест


3-70087
Yuraz
2003-04-29 08:42
2003.05.22
Как оргпнизовать добавление/удаление строки в приложении.


1-70366
oleg_sys
2003-05-09 20:19
2003.05.22
Почему ParamStr() теряет в имени пробелы?


3-70130
pathfinder
2003-04-29 17:52
2003.05.22
Как добавить страницу в QuickReport?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский