Доработка интерфейсов Галактики

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

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

Ответить
mokhnach
Сообщения: 4
Зарегистрирован: 22 сен 2005, 10:50
Контактная информация:

Доработка интерфейсов Галактики

Сообщение mokhnach »

Добрый день!

Мне была поставленная задача, в интерфейс Галактики по формированию договоров встроить функцию, которая будет генерировать номер договора по ряду его атрибутов.

Я написал функцию, которая генерирует номер договора и делает update таблицы dogovor. Функцию встроил в печать договора.

Проблемы, с которыми я столкнулся:
1. Сгенерированный номер записывается в БД, но при этом на экране, в интерфейсе по работе с договорами он не обновляется. Как указать интерфейсу Галактики, что надо обновить данные.

2. При вызове функции печати (Ctrl+P) для только что созданного договора, или существующего договора, но в котором изменили, например, дату заключения, моя функция делает update таблице договоров и присваивает договору номер. Далее пользователь переходит к следующему договору. В этот момент интерфейс по работе с договорами делает Update той же самой записи и переписывает сгенерированные номер договора, тем который был до его генерации.

Посоветуйте как быть.

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

Сообщение edward_K »

Для того чтобы окно перерисовалось фейсу нужно отправить некое событие, которое он выполнить и перерисует себя
команда то notify кажись(отправляет сразу всем открытым !!)
но
1.она точно не компилиться в fcom
2.нужно знать подходящее событие в конкретном фейсе - а я сомневаюсь, что оно есть готовое.
в 8 в принципе его можно и добавить через alter interface, но тогда можно вклиниться и в саму процедуру создания номера.
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

в fcom может скомпилиться если подключить extfun.res
mokhnach
Сообщения: 4
Зарегистрирован: 22 сен 2005, 10:50
Контактная информация:

Сообщение mokhnach »

Попытался найти описание функции notify, но нашел только следующие варианты ее использования:

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

Notify(cmEvaluateAndModify, 0);
Notify(cmTblRefresh,0);
Notify(cmTableChanged, longint(coPlanOtpusk));
Подскажите, какие параметры у этой функции.
Hmyrii
Постоянный гость
Сообщения: 62
Зарегистрирован: 07 июн 2006, 08:23

Сообщение Hmyrii »

выдержка из доки :

Для прорисовки записей служат три метода:
1. ReDrawPanel - перересовывает без обращения к БД
2. ReScanPanel - перересовывает из БД кроме текущей записи
3. ReReadRecords - перересовывает из БД, в т.ч. и текущию запись
Каждая последующая функция вызывает предыдущую, поэтому не следует вызывать их две подряд.

[/quote]
mokhnach
Сообщения: 4
Зарегистрирован: 22 сен 2005, 10:50
Контактная информация:

Сообщение mokhnach »

Для прорисовки записей служат три метода:
1. ReDrawPanel - перересовывает без обращения к БД
2. ReScanPanel - перересовывает из БД кроме текущей записи
3. ReReadRecords - перересовывает из БД, в т.ч. и текущию запись
Функции хороши, не спорю. Только применить я их могу, если встрою свою функцию в стандартный Галактический интерфейс по работе с договорами, и перекомпилирую его. А это самый крайний вариант развития событий.
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

function Notify(Command: word; InfoPtr: pointer): pointer;
для вип = Notify(word,longint):longint;
Command = из набора cm для hanleevent
InfoPtr = не знаю, может 0 или надо у Screw спрашивать.
С другой стороны это только способ послать приложению какое-то сообщение. Что будет делать приложение - прописано у него в обработчике событий для соотв сообщения. Интересно есть ли такое предопределенное сообщение что бы браузеры со скринами пересчитывало?
Если я правильно понял в прикладном коде должно быть что то типа
cmTblRefresh:
if IsNew() or IsModified()
UpdateTable;
else
RereadRecord(#RootTable);
Хотя врятли такое есть в договорах :???: Notify делали для зарплаты.
Если во все интерфейсы такие обработчики вставить то и Notify можно будет везде пользоваться :cool: .
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

InfoPtr - указатель на "что-то" или любая константа, совместимая по типу с longint. Так сказать, дополнительная информация.

Функция предназначена для рассылки широковещательных сообщений всем вставленным в деск интерфейсам. Используйте любую команду на ваше усмотрение. Команда рассматривается как событие главного окна интерфейса. При помощи этой функции можно, например, попытаться заставить все интерфейсы на десктопе перейти в режим вставки новой записи - просто разошлите команду cmInsert :-)

Сообщение (команда) будет передано каждому интерфейсу в порядке вставки их в десктоп (или в обратном - точно уже не помню). Если кто-то из интерфейсов в обработчике команды вызовет функцию Stop, рассылка сообщения будет немедленно прекращена, и Notify вернет идентификатор этого интерфейса (фактически - указатель на объект TInterface).

Хотя код функции и находится в зарплатных сырцах, использоваться она может где и кем угодно. Я, к примеру, с ее помощью рассылал сообщения о модификациях общеиспользуемых таблиц вроде XARPRED или ZAR_USER: таким образом все интерфейсы на десктопе могли "передернуть" содержимое буферов таблиц в своих ЛТ и перерисовать себя при необходимости. Так когда-то обновлялся текст в сквозных фильтрах по подразделениям и работникам.

Кстати, значение "дополнительного параметра" можно получить в обработчике команды при помощи функции GetNotificationInfoPtr: longint;
Виталий
Ответить