Пометка записей |
Для автоматизации пометки записей в табличном редакторе используется конструкция <маркер>:
<маркер> = recMarker [ : <вычисляемое-выражение> ] [ = <обьект-маркер> ] [ {<поле-маркера>} ] [ noColumn | noColor ] [ noSave ] ;
<вычисляемое-выражение> - позволяет прикладному программисту самому создать структуру для хранения не только первичных ключей выделенных записей, но и любой дополнительной информации.
В этом случае программист сам должен позаботиться о наложении и снятии bounds и создавать маркеры посредством функции InitMarker. Соответственно, в этом случае ему придется самому обрабатывать события cmMarkRecord и cmUnmarkRecord.
Само <вычисляемое-выражение> должно возвращать значение типа string и содержать имя bitmap из ресурса или пустую строку, если данную запись в броузере помечать не надо.
При использовании опции <вычисляемое-выражение> атрибуты noColumn, noColor и noSave не используются.
<обьект-маркер> - позволяет управлять пометкой записей в броузере с использованием обьектно-ориентированных возможностей языка . Для этого в Атлантис введен Объектный интерфейс IMarker.
<поле-маркера> - позволяет переопределить поле по которому ведется пометка.При этом происходит автоматическое приведение этого поля к типу comp. По умолчанию пометка ведется по полю NRec.
Возможность переопределить поле доступна начиная с Атлантис 5.1.25.
noColumn - колонка маркера создается невидимой.
noColor - помеченные записи не выделяются другим цветом.
noSave - информация о помеченных записях не сохраняется в конфигурации пользователя. Опция устарела, недоступна начиная с Атлантис 5.1.36.
Ключевые слова noColumn и noColor нельзя использовать одновременно.
При использования выражения recMarker без задания опции <вычисляемое-выражение> в системе становятся доступны два переключаемых реляционных отношения под следующими именами:
bounds tbRM<имя>1
bounds tbRM<имя>2
Где <имя> - имя таблицы, корневой для данного браузера.
Первый bounds автоматически накладывается при открытии окна. Если есть необходимость обработать только выделенные записи, то необходимо снять первый bounds (функцией SubBounds) и установить второй. И соответственно после обработки выделенных записей снять второй и установить первый (функцией AddBounds) bounds.
До Атлантис 5.2.02 в связи с особенностями образования имен баундов нельзя использовать в одном интерфейсе два броузера с автоматизированной пометкой по одной таблице.
Начиная с Атлантис 5.2.02 допускается использовать в одном интерфейсе несколько броузеров /деревьев с автоматизированной пометкой по одной таблице при явном указании обьекта маркера (маркеры вида RecMarker = pMarker).
Для использования опции <обьект-маркер> необходимо в секции глобальных переменных интерфейса обьявить переменную типа ссылки на объектный интерфейс IMarker. Переменная инициализируется ссылкой на индивидуальный экземпляр интерфейса. В Атлантис имеется интерфейс marker с реализацией базового функционала пометки.
После этого можно вызывать методы и устанавливать свойства интерфейса как для обычных объектов.
Пример
#include marker.vih // описание объекта и объявление интерфейса // marker c реализацией по умолчанию ..... var pMarker: IMarker(marker) new; //Интерфейс должен быть не разделяемым
Описание пометки в многотабличном дереве имеет особенности. Подробнее см. описание конструкции <маркер> в разделе "Редактор иерархических структур. ". Описание пометки в однотабличном дереве ничем не отличается от описания пометки в браузере.
При наличии в статус-лайне команд пометки или броузера с автоматизированной пометкой, в системный тулбар автоматически добавляются четыре кнопки пометки.
Если в статус-лайне присутствуют команды пометки, то сообщение о пометке приходит на прикладной уровень. Если в интерфейсе присутствует броузер с автоматизированной пометкой то после этого вызывается соответствующий метод пометки обьекта.
Если в статус-лайне нет команд пометки и присутствует броузер с автоматизированной пометкой, то при фокусе ввода на этом броузере методы пометки обьекта вызываются непосредственно от клавиш:
Ins - отметить /снять пометку;
Gray+ - отметить все;
Gray- - снять все пометки;
Gray* - инвертировать.
Если в статус-лайне присутствует команда cmDelete и фокус ввода находится на броузере с автоматизированной пометкой, то по этой команде происходит удаление помеченных записей. Если в статус-лайне команда cmDelete отсутствует, удаление по F8 не производится.
В любом случае при обработке команды пометки из системного тулбара сообщение о пометке приходит на прикладной уровень, а затем, если в интерфейсе присутствует сфокусированный броузер с автоматизированной пометкой, вызывается соответствующий метод пометки обьекта.
Начиная с Атлантис 5.1.21 при обработке пометки записи вместо последовательности операторов:
cmMarkRec : { ... // запомнить пометку и т.д. if (GetNext MyTable = tsOk) // перейти на след. запись CallToNeighbours(cmPosDown, tnMyTable); // сообщить соседям RescanPanel(tnMyTable); // обновить панель }
нужно использовать:
cmMarkRec : { ... RedrawCurrentAndGo (GetCurrentFormat, true); }
При этом получаем выигрыш по времени в несколько раз!
//========================================================= #include marker.vih //========================================================= interface MarkerDemo 'Использование маркеров.'; //--------------------------------------------------------- var pMarker : IMarker(marker) new; //--------------------------------------------------------- create view as select * from x$files ; //----------------------------------------------------------------------------- browse brwBrowse1; table x$files; recMarker = pMarker {x$files.xf$code}; fields x$files.xf$name 'File name' ('File name') : [20], protect; end; //--------------------------------------------------------- handleEvent cmInit: { pMarker.Caption := (' Отмечено [%d] записей.'); // для заголовка } end; // handleEvent interface end.
Описание табличного редактора.
Начиная с Атлантис 5.2.02 допускается использовать в одном интерфейсе несколько броузеров /деревьев с автоматизированной пометкой по одной таблице.
Начиная с Атлантис 5.1.36 запрещено использование опции noSave.
Начиная с Атлантис 5.1.25 добавлена возможность переопределить поле маркера, по которому ведется пометка (конструкция {<поле-маркера>}).
Начиная с Атлантис 5.1.21 доступна функция RedrawCurrentAndGo для прорисовки текущей записи и перемещения на следующую /предыдущую запись в броузере или дереве при обработке пометки записи.
Начиная с Атлантис 5.1.15 введена конструкция <обьект-маркер>.