Страница 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 - все фейсы разом запечатают 8) ).
вызывать 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 (в немодальном режиме). Дергайте этот метод по мере надобности. Ели окно закроется, то объект (он же интерфейс) в памяти останется пока не освободится объектная ссылка.

Если вызывающих объектов много, то создавайте объект в режиме разделяемой копии. Будет тогда только один экземпляр окна открываться.