Запуск одной копии интерфейса

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Запуск одной копии интерфейса

Сообщение galover »

Может кто знает, как сделать так чтобы запускалась одна копия интерфейса? Т.е. если вызвать RunInterface('Foo') несколько раз, запускалось не n копий интерфейса Foo, а активизировалась только одна уже запущенная?
И вдогонку: как добиться, чтобы после закрытия интерфейса он не выгружался из памяти? cacheable поможет?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Пример - фро - интерактивный отчет - больше 3 копий не згарузите. Вроде там через объектный фейс сделано. При первой загрузке он инициализируется и висит в памяти пока все фейсы его юзающие не закроются. Можно еще Notify использовать или семафор. ну или dsk.
Последние 2 варианты ненадежны - при вылете из галки придется чистить.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

edward_K
а что за Notify такой?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

Notify(cmValue20, 0);
http://www.tyumbit.ru/gal_forum/viewtop ... ght=notify
там написано что если кто-то из фейсов в событии сделает stop то вернет не нулевое значение - этим и можно воспользоваться. Ну или сохранить чаго либо в dsk а в событие переписать чего то другое. Ну еще нужно отловить что это не эта копия фейса. То есть в cminit определить сначала какую то переменную в false а после обработки notify в true и по ней в cmValue20 проверить надо ли stop сделать.
но вообще модальный запуск проще.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

edward_K
что за cmValue20? В каком месте запускать этот Notify и с какими параметрами? Как-то запутанно все! И все равно не поможет - функции
RunInterfaceNoModal не подсунуть нужную ссылку на разделяемый интерфейс, она внутрях все равно новую копию создает :(
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

cmValue20 некое произволное событие(могет быть любое - эта просто в ini Объявлена, хоть cmPrintDoc - все фейсы разом запечатают 8) ).
вызывать Notify в cmInit как написано в предыдущем посте -
поможет куда денется. Насчет не создаст - позапускайте отчет в первом моем посте. Да и по ссылке сходите - там автор notify пишет.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

лучше кода нет помощи, если следовать посту то получается следующее:

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

interface Aa;
  const 
    cmNotify = 6001;
  end;

  handleEvent
    cmInit:
    { 
       if (Notify(cmNotify, ) <> 0)
          Abort(); 
    }
    cmNotify:
    {
       Stop();
    }
  end;
end.
что еще сюда воткнуть?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

короче, бесполезно все это, не заработает так. Нельзя определить, что это тот же самый экземпляр рассылает cmNotify. Вот если бы можно было с Notify ссылочку передать, тогда да, провели бы на равенство с self. Ну даже ели и прервали cmInit, дальше то все равно надо активировать уже запущенную версию интерфейса
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение 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.
пробовать в лом.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

edward_K
Был не прав, действительно так работает!!! Спасибо! А как активировать окно?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

ну первый этап вам тока screw или laalaa здесь подскажет - не знаю я такой функции. Можно конечно alt+0 как то сгенереть - но то же не знаю какой командой.
а второй selectformat + selectfield - может это и приведет к активации окна - не пробовал.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

А мне вот все равно интересно, как в Галактике сделано так, что если через главное меню запускать интерфейс, то он будет один на всю систему и активироваться будет уже запущенная версия? Что за команда там используется? Нарыл тока что это cmRunInterface, но вот каким боком ее заюзать????
LaaLaa

Сообщение 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
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

да мне не через меню надо, а так же, как через меню
LaaLaa

Сообщение LaaLaa »

Инициализируйте интерфейс через объектную переменную. В одном из методов делайте вызов функции RunWindow (в немодальном режиме). Дергайте этот метод по мере надобности. Ели окно закроется, то объект (он же интерфейс) в памяти останется пока не освободится объектная ссылка.

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