Страница 1 из 1

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

Добавлено: 22 июн 2006, 08:14
mokhnach
Добрый день!

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

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

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

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

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

Может быть, можно номер договора записать в соответствующее поле интерфейса по работе с договорами?

Добавлено: 22 июн 2006, 11:26
edward_K
Для того чтобы окно перерисовалось фейсу нужно отправить некое событие, которое он выполнить и перерисует себя
команда то notify кажись(отправляет сразу всем открытым !!)
но
1.она точно не компилиться в fcom
2.нужно знать подходящее событие в конкретном фейсе - а я сомневаюсь, что оно есть готовое.
в 8 в принципе его можно и добавить через alter interface, но тогда можно вклиниться и в саму процедуру создания номера.

Добавлено: 23 июн 2006, 11:22
san
в fcom может скомпилиться если подключить extfun.res

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

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

Notify(cmEvaluateAndModify, 0);
Notify(cmTblRefresh,0);
Notify(cmTableChanged, longint(coPlanOtpusk));
Подскажите, какие параметры у этой функции.

Добавлено: 26 июн 2006, 06:06
Hmyrii
выдержка из доки :

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

[/quote]

Добавлено: 26 июн 2006, 11:12
mokhnach
Для прорисовки записей служат три метода:
1. ReDrawPanel - перересовывает без обращения к БД
2. ReScanPanel - перересовывает из БД кроме текущей записи
3. ReReadRecords - перересовывает из БД, в т.ч. и текущию запись
Функции хороши, не спорю. Только применить я их могу, если встрою свою функцию в стандартный Галактический интерфейс по работе с договорами, и перекомпилирую его. А это самый крайний вариант развития событий.

Добавлено: 26 июн 2006, 13:20
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: .

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

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

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

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

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