Страница 1 из 1

Как отследить, загружен ли интерфейс

Добавлено: 03 май 2005, 13:21
Juve
Необходимо отслеживать загрузку интерфейсов для предотвращения их повторной загрузки. Ещё желательно при попытках пользователя вызвать уже загруженный интерфейс не только возвращать фокус уже открытому окну, но и передавать ему некоторые параметры, чтобы интерфейс мог скорректировать данные. Я так понимаю это уже через вызов public процедур надо делать. Пока что не удается вообще получить нормельную ссылку на интерфейс, а хотелось бы что-то вроде:

Код: Выделить всё

 If Assigned(a) then a.Show и т.п... 
Пишу так (файл Main.vih):

Код: Выделить всё

objinterface ObjFace; 
end; 
vipinterface f_Card implements ObjFace; 
Далее фейс 1:

Код: Выделить всё

#Include Main.vih
Interface f_Card
фейс 2:

Код: Выделить всё

#Include Main.vih
Interface f_Distrib
Var
  a: f_ResponseCard;
...
CmSomeEvent: If GetVipRef (a, 'f_Card') Message ('Ok') else Message ('False');
Перепробывал все функции из серии LoadVipInterface, GetVipInterface, GetVipRef, LoadVipRef,Assigned и т.п... половина из низ возвращает True, и при этом никаого интерфейса не открывается, другая половина ругается на то что поле не является ссылокой требуемого класса.

У кого нибудь есть пример того как это все работет? что же я делаю не так?

Если написать a: ObjFace, то функция GetVipRef прокатывает без ошибок, но она ничего не грузит!

Re: Как отследить, загружен ли интерфейс

Добавлено: 03 май 2005, 13:39
Max_Fin
Juve писал(а): У кого нибудь есть пример того как это все работет? что же я делаю не так?

Код: Выделить всё

ObjInterface ObjFace;
методы
end;

VipInterface f_Card Implements ObjFace;

var A : ObjFace;
GetVipRef(A, 'f_Card');
По поводу не открывается, может просто нет такого метода
внутри объектного интерфейса RunInterface

Для примера

Добавлено: 03 май 2005, 13:54
Max_Fin
a.vih

Код: Выделить всё

ObjInterface MF_MyObj;
  procedure NewNastr;
  function Print: Boolean;
end;

VipInterface MF_My Implements MF_MyObj;
a.vip

Код: Выделить всё

PUBLIC procedure NewNastr;
{
  RunInterface(AAA);
}
PUBLIC function Print: Boolean;
{
...
}
aaaaaa.vip

Код: Выделить всё


var A : MF_MyObj;

....

cmInit:
{
GetVipRef(A, 'MF_My');
}
cmPick:
{
  A.NewNastr;
}
....

Добавлено: 03 май 2005, 16:37
Juve
Спасибо большое, разобрался! :)

Все работает, однако возник другой вопрос:

Можно ли в меню при вызове интерфейса написать не CmRunInterface а процедуру вызвать или еще чего. Т.е:

не так

Код: Выделить всё

 
-'Распределение',cmRunInterface('f_Distrib');  
а что-то типа такого :

Код: Выделить всё

-'Распределение',Procedure aaa; ну или вызвать интерфейс  с параметрами
И вообще, где ловить это "cmRunInterface"
HandleEvent в файле с меню не прокатывает :(

Добавлено: 03 май 2005, 17:21
Max_Fin
кстате, существует внутри объектных интерфейсов два события
cmOnVipLoad, cmOnVipUnload
это я так, что-то не совсем понимаю сути стоящей проблемы

по поводу обработки меню, какого меню?
если всплывающего меню самого объектного интерфейса, либо интрефейса из которого вызывается объектный тогда

- 'Распределение',cmMYObjStart,'Распределение, кажись',0,'',,sci1Esc;

cmMYObjStart - событие

Добавлено: 03 май 2005, 18:35
Juve
эээ...ну не совсем....эти два события ловлю нормально, спасибо,не в них дело... я имею ввиду менюшку самого модуля, которое на Delphi MainMenu называется, что на Sec`е тут кажется...вот там мне и надо вызвать фейс так, чтобы потом если кто из другого фейса будет вызвать первый, то он не открыл его второй раз, а просто сделал активным первое окно фейса. Проблема решится если из этого меню можно будет вызвать не через CmRunInterface, а через А.ааа, как в твоем постинге

Добавлено: 04 май 2005, 09:10
Max_Fin
Juve писал(а):а через А.ааа, как в твоем постинге
Но ведь A неизвестно что.

Из главного меню только через Run, больше ни как.

Добавлено: 04 май 2005, 14:33
Juve
Ну вот я и хотел в обработчике CmRunInterface вызвать GetVipRef и определить А...потом вызвать А.ааа :?