Страница 1 из 2
Запуск одной копии интерфейса
Добавлено: 02 июл 2009, 11:30
galover
Может кто знает, как сделать так чтобы запускалась одна копия интерфейса? Т.е. если вызвать RunInterface('Foo') несколько раз, запускалось не n копий интерфейса Foo, а активизировалась только одна уже запущенная?
И вдогонку: как добиться, чтобы после закрытия интерфейса он не выгружался из памяти? cacheable поможет?
Добавлено: 02 июл 2009, 12:18
edward_K
Пример - фро - интерактивный отчет - больше 3 копий не згарузите. Вроде там через объектный фейс сделано. При первой загрузке он инициализируется и висит в памяти пока все фейсы его юзающие не закроются. Можно еще Notify использовать или семафор. ну или dsk.
Последние 2 варианты ненадежны - при вылете из галки придется чистить.
Добавлено: 02 июл 2009, 12:46
galover
edward_K
а что за Notify такой?
Добавлено: 02 июл 2009, 13:03
edward_K
Notify(cmValue20, 0);
http://www.tyumbit.ru/gal_forum/viewtop ... ght=notify
там написано что если кто-то из фейсов в событии сделает stop то вернет не нулевое значение - этим и можно воспользоваться. Ну или сохранить чаго либо в dsk а в событие переписать чего то другое. Ну еще нужно отловить что это не эта копия фейса. То есть в cminit определить сначала какую то переменную в false а после обработки notify в true и по ней в cmValue20 проверить надо ли stop сделать.
но вообще модальный запуск проще.
Добавлено: 02 июл 2009, 14:01
galover
edward_K
что за cmValue20? В каком месте запускать этот Notify и с какими параметрами? Как-то запутанно все! И все равно не поможет - функции
RunInterfaceNoModal не подсунуть нужную ссылку на разделяемый интерфейс, она внутрях все равно новую копию создает

Добавлено: 02 июл 2009, 14:21
edward_K
cmValue20 некое произволное событие(могет быть любое - эта просто в ini Объявлена, хоть cmPrintDoc - все фейсы разом запечатают

).
вызывать Notify в cmInit как написано в предыдущем посте -
поможет куда денется. Насчет не создаст - позапускайте отчет в первом моем посте. Да и по ссылке сходите - там автор notify пишет.
Добавлено: 02 июл 2009, 14:34
galover
лучше кода нет помощи, если следовать посту то получается следующее:
Код: Выделить всё
interface Aa;
const
cmNotify = 6001;
end;
handleEvent
cmInit:
{
if (Notify(cmNotify, ) <> 0)
Abort();
}
cmNotify:
{
Stop();
}
end;
end.
что еще сюда воткнуть?
Добавлено: 02 июл 2009, 15:13
galover
короче, бесполезно все это, не заработает так. Нельзя определить, что это тот же самый экземпляр рассылает cmNotify. Вот если бы можно было с Notify ссылочку передать, тогда да, провели бы на равенство с self. Ну даже ели и прервали cmInit, дальше то все равно надо активировать уже запущенную версию интерфейса
Добавлено: 02 июл 2009, 15:15
edward_K
interface Aa;
const
cmNotify = 6001;
end;
var kl_init :boolean ;
handleEvent
cmInit:
{ kl_init:=false
if (Notify(cmNotify ) <> 0)
Abort();
kl_init:=true;
}
cmNotify:
{ if kl_init
Stop();
}
end;
end.
пробовать в лом.
Добавлено: 02 июл 2009, 16:30
galover
edward_K
Был не прав, действительно так работает!!! Спасибо! А как активировать окно?
Добавлено: 02 июл 2009, 19:09
edward_K
ну первый этап вам тока screw или laalaa здесь подскажет - не знаю я такой функции. Можно конечно alt+0 как то сгенереть - но то же не знаю какой командой.
а второй selectformat + selectfield - может это и приведет к активации окна - не пробовал.
Добавлено: 02 июл 2009, 20:14
galover
А мне вот все равно интересно, как в Галактике сделано так, что если через главное меню запускать интерфейс, то он будет один на всю систему и активироваться будет уже запущенная версия? Что за команда там используется? Нарыл тока что это cmRunInterface, но вот каким боком ее заюзать????
Добавлено: 02 июл 2009, 20:39
LaaLaa
При запуске из меню один экземпляр интерфейса будет получаться сам по себе. Пример запуска через меню есть в примерах из документации
ftp://ftp.galaktika.ru/pub/support/gala ... df/RPP.zip
ищите там файл Example\Src\RC\prj_mng.mnu пояснения читайте здесь
ftp://ftp.galaktika.ru/pub/support/gala ... df/RPP.chm
Добавлено: 02 июл 2009, 21:06
galover
да мне не через меню надо, а так же, как через меню
Добавлено: 06 июл 2009, 12:03
LaaLaa
Инициализируйте интерфейс через объектную переменную. В одном из методов делайте вызов функции RunWindow (в немодальном режиме). Дергайте этот метод по мере надобности. Ели окно закроется, то объект (он же интерфейс) в памяти останется пока не освободится объектная ссылка.
Если вызывающих объектов много, то создавайте объект в режиме разделяемой копии. Будет тогда только один экземпляр окна открываться.