Как закрыть интерфейс, не имеющий визуальных элементов?

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

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

Ответить
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение Robis »

Добрый день. Заранее извиняюсь за возможное плождение похожих тем, т.к. на форуме они присутствуют, но решения я так и не нашёл из них.

У меня есть интерфейс вида:

Interface ne_test;
create view
;
handleEvent
cmInit:
{
CloseInterface(cmDefault);
abort;
exit;
}
end;
end.

Если его вызвать 10 раз, то в дебаге я увижу 10 экземпляров этого фейса с 0 кол-вом ссылок на каждый. Если закоментить всё в cmInit и добавить даже пустой скрин, то при нажатии на крестик интерфейс корректно убивается из памяти. Я перебрал уже всё, что нашёл в документации и на форуме, всевозможные комбинации stop, abort, exit, closeinterface, putcommand.. всё тщетно. Может ли кто-нибудь раскрыть тайну, что же происходит при нажатии на крестик? Как мне это эмулировать из кода?

Заранее спасибо :|
LaaLaa

Re: Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение LaaLaa »

По идее должен сработать вариант

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

Interface ne_test;
create view;
handleEvent
cmInit:
{
  CloseInterface(cmDefault);
}
end;
end.
Но такой способ использования невизуальных интерфейсов - это не очень хороший тон (пережиток, устаревший метод). Если вам надо делать просто вычисления, без визуальных элементов. Используйте объектные возможности языка VIP. Примеры поищите на форуме или вот здесь http://laalaa.googlecode.com/files/Comp ... ts2006.rar.
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение Robis »

Same shit. Висит в памяти:)

За документацию спасибо, но переписывать уже сделанное не очень горю желанием. Память засорять тоже не нравится, нужен выход:)
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение Robis »

Методом научного тыка выяснил сл-щее:

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

Interface ne_test;
create view;

screen main 'sdf';
Fields
<<
>>
end;

handleEvent
cmInit:
{
  PutCommand(cmKill);
}
cmkill:
{
CloseInterface(cmDefault);
}
end;
end.
Отрабатывает как надо, но наблюдается "мигание" этого самого скрина... если закоментить скрин, то обьект в памяти не разрушается. Если вынести CloseInterface в cmInit, тоже объект не разрушается... какой-то бред, почему CloseInterface не работает без скрина?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение RAJAH »

А если так попробовать?

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

interface I1
...
handleevent
  cminit:
  {
     ...
     closeinterface(0);
     abort;
     exit;
  }
end;

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

Re: Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение galover »

Посмотри ПИР 101.45035. Память течет если интерфейс вызвали с помощью RunInterfaceNoModal и в cmInit сделали прерывание. Если вызвать с помощью RunInterface, то экземпляр должен высвобождаться нормально
Robis
Посетитель
Сообщения: 37
Зарегистрирован: 13 дек 2010, 16:55

Re: Как закрыть интерфейс, не имеющий визуальных элементов?

Сообщение Robis »

galover, Спасибо.
Ответить