Использование IMarker
-
- заказчик
- Сообщения: 95
- Зарегистрирован: Чт, 25/09/2008 07:45
- Имя Фамилия: Марат Ахметзянов
- Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"
Использование IMarker
Посмотрел пример (vipprogr.chm) использования маркера IMarker. Но так и не понял, как получить выбранные пользователем значения, а также проверить - была ли выделена запись с некоторым NRec. Неужели нужно экспортировать все пометки в другой маркер и уже по нему делать SearchMarker? Вообще, пример в хэлпе несколько запутанный. Нельзя ли добавить отдельный пример по использованию возможностей IMarker. А то в стандартном примере приведены три типа маркера (IMarker, унаследованный от IMarker и стандартный) и неясны некоторые моменты - например как выгружать (высвобождать) маркер (в примере в cmDone происходит выгрузка из IMarker в стандартный маркер и лишь затем вызывается DoneMarker). Т.е. неясно, нужно ли при использовании IMarker создавать дополнительно стандартный маркер или же нет?
-
- заказчик
- Сообщения: 95
- Зарегистрирован: Чт, 25/09/2008 07:45
- Имя Фамилия: Марат Ахметзянов
- Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"
up
Неужели никто не знает как заюзать IMarker?
В общем сейчас затык в том, как получить выбранные записи. Пробовал вот такой код:
не работает Похоже индекс iByNRec не является индексом navigate
неужели нужно работать вот так:
НЕ верю! В чем тогда преимущество и удобство использования IMarker???
Неужели никто не знает как заюзать IMarker?
В общем сейчас затык в том, как получить выбранные записи. Пробовал вот такой код:
Код: Выделить всё
var _mrk : IMarker(Marker) new;
...
procedure ProcessMarker;
{
_loop _mrk
{
ProcessNRec(_mrk.pNRec);
}
неужели нужно работать вот так:
Код: Выделить всё
var _mrk : IMarker(Marker) new;
...
procedure ProcessMarker;
{
var tmpMarker : longInt;
tmpMarker := InitMarker('tmpMarker', 8, 100, 10);
_mrk.ExportTo(tmpMarker);
...тут обрабатываем tmpMarker
GetMarker(tmpMarker, .., ..);
...
}
-
- заказчик
- Сообщения: 95
- Зарегистрирован: Чт, 25/09/2008 07:45
- Имя Фамилия: Марат Ахметзянов
- Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"
Снова
А свойство owner : longInt для чего? Я так подумал, что это и есть идентификатор обернутого маркера. Попробовал использовать в функциях SearchMarker и GetMarker -> получаю runtime error.
Для каких целей это свойство? И как же все таки заюзать IMarker правильно?
P.S. Кстати свойство Owner объявлено как protected, а обращаться можно из внешнего кода!
Если имелось в виду -> что protected это read only свойство, тогда конструкция явно неудачно выбрана, тоже самое можно сделать описав свойство как: property Owner : longInt read, а protected-ом нужно ограничивать область видимости рамками интерфейса и унаследованных фейсов
А свойство owner : longInt для чего? Я так подумал, что это и есть идентификатор обернутого маркера. Попробовал использовать в функциях SearchMarker и GetMarker -> получаю runtime error.
Код: Выделить всё
var _mrk : IMarker(Marker) new;
...
var i : longInt;
var item : comp;
for (i := 0; i < _mrk.Count; ++i)
{
if (GetMarker(_mrk.Owner, i, item)) // Здесь runtime error
Message(item);
}
P.S. Кстати свойство Owner объявлено как protected, а обращаться можно из внешнего кода!
Если имелось в виду -> что protected это read only свойство, тогда конструкция явно неудачно выбрана, тоже самое можно сделать описав свойство как: property Owner : longInt read, а protected-ом нужно ограничивать область видимости рамками интерфейса и унаследованных фейсов
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
пример кода в документации
суть - в нормальном режиме работы к узлу, по которому построен браузер, подцепляется объект-маркер
это обеспечивает возможность пометки и отображения
для обработки необходимо выполнить обратную подцепку - к маркеру подцепить узел логической таблицы
соответственно, при компиляции генерируются два баунда - прямой и обратный
правила генерации их имён описаны в документации
для обработки надо наложить обратный браузер и пройтись по маркеру
суть - в нормальном режиме работы к узлу, по которому построен браузер, подцепляется объект-маркер
это обеспечивает возможность пометки и отображения
для обработки необходимо выполнить обратную подцепку - к маркеру подцепить узел логической таблицы
соответственно, при компиляции генерируются два баунда - прямой и обратный
правила генерации их имён описаны в документации
для обработки надо наложить обратный браузер и пройтись по маркеру
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
При использования выражения recMarker без задания опции <вычисляемое-выражение> в системе VIP становятся доступны два переключаемых реляционных отношения под следующими именами:
bounds tbRM<имя>1
bounds tbRM<имя>2
Где <имя> - имя таблицы, корневой для данного браузера.
Первый bounds автоматически накладывается при открытии окна. Если есть необходимость обработать только выделенные записи, то необходимо снять первый bounds (функцией SubBounds) и установить второй. И соответственно после обработки выделенных записей снять второй и установить первый (функцией AddBounds) bounds.
bounds tbRM<имя>1
bounds tbRM<имя>2
Где <имя> - имя таблицы, корневой для данного браузера.
Первый bounds автоматически накладывается при открытии окна. Если есть необходимость обработать только выделенные записи, то необходимо снять первый bounds (функцией SubBounds) и установить второй. И соответственно после обработки выделенных записей снять второй и установить первый (функцией AddBounds) bounds.
-
- заказчик
- Сообщения: 95
- Зарегистрирован: Чт, 25/09/2008 07:45
- Имя Фамилия: Марат Ахметзянов
- Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"
Фёдор Терсин
Спасибо! Почитал, нашел этот раздел в chm.
Сразу скажу, не айс! В чем собственно бенефиты использования IMarker? Если столько телодвижений, для таких тривиальных операций.
Вообще идея изначально хорошая, а вот реализация не очень. Раз уж создали такой объект, то и механизм получения пометок и все остальное связанное с пометками нужно было добавить! А то получается, что часть функционала на уровне IMarker, часть на внешнем уровне. Ведь можно же добавить новый фейс в IMarker, который бы просто оборачивал все имеющиеся внешние процедуры.
Поэтому предлагаю доработать функционал, сделать что-то вроде:
Спасибо! Почитал, нашел этот раздел в chm.
Сразу скажу, не айс! В чем собственно бенефиты использования IMarker? Если столько телодвижений, для таких тривиальных операций.
Вообще идея изначально хорошая, а вот реализация не очень. Раз уж создали такой объект, то и механизм получения пометок и все остальное связанное с пометками нужно было добавить! А то получается, что часть функционала на уровне IMarker, часть на внешнем уровне. Ведь можно же добавить новый фейс в IMarker, который бы просто оборачивал все имеющиеся внешние процедуры.
Поэтому предлагаю доработать функционал, сделать что-то вроде:
Код: Выделить всё
(1) Добавить новый фейс, описывающий недостающий функционал
// Реализация описанных функций будет просто сводится к перенаправлению вызова имеющимся аналогичным функциям/процедурам
// marker.vih
objInterface IMarkerEx2;
function GetMarker(indexNo : longInt; var item : anyType) : boolean; // Получение конкретного элемента
function SearchMarker (item : anyType; indexNo : longInt) : boolean; // Поиск элемента
End;
VipInterface Marker implements IMarker,IMarkerEx, IMarkerEx2, IModify;
public :
constructor Init;
destructor Done;
end;
// Реализация
interface Marker
function GetMarker(indexNo : longInt; var item : anyType) : boolean;
{
// Делегирование вызова стандартной (имеющейся) ф-ии (1-й параметр идентификатор маркера)
GetMarker(Owner, indexNo, item);
}
function SearchMarker (item : anyType; indexNo : longInt) : boolean;
{
// Делегирование вызова стандартной (имеющейся) ф-ии (1-й параметр идентификатор маркера)
SearchMarker (Owner, item, indexNo);
}
end.
// (2) Добавить navigate индекс для удобства прохода по выбранным записям
var _mrk : IMarker(Marker) new;
...
procedure ProcessMarker;
{
_loop _mrk // В цикле можно пройтись по выбранным записям
{
... := _mrk.pNRec; // Получаем NRec выбранной записи
}
}
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
для элементарных операций телодвижений минимум
1 описал в браузере
2 в нужное место воткнул обработку (в т.ч. переналожение баундов)
просто в доке навороченный общий пример на перекрытие функциональности и т.п.
единственное, в чём имело бы смысл упрощать - это скрытое переналожение баундов при организации цикла по маркеру
в цикле по маркеру и сейчас можно пройтись - достаточно снять с него подцепку
1 описал в браузере
2 в нужное место воткнул обработку (в т.ч. переналожение баундов)
просто в доке навороченный общий пример на перекрытие функциональности и т.п.
единственное, в чём имело бы смысл упрощать - это скрытое переналожение баундов при организации цикла по маркеру
в цикле по маркеру и сейчас можно пройтись - достаточно снять с него подцепку
-
- заказчик
- Сообщения: 95
- Зарегистрирован: Чт, 25/09/2008 07:45
- Имя Фамилия: Марат Ахметзянов
- Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"
Фёдор Терсин
Переналожение баундов - это уже детали реализации, уходить нужно от таких вещей. Абстрагироваться, добавлять врапперы, скрывающие всю черновую работу.
Вы так и не ответили, в чем прелесть использования IMarker, да и на мои предложения по доработке похоже вообще не отреагировали. Грустно
Переналожение баундов - это уже детали реализации, уходить нужно от таких вещей. Абстрагироваться, добавлять врапперы, скрывающие всю черновую работу.
Вы так и не ответили, в чем прелесть использования IMarker, да и на мои предложения по доработке похоже вообще не отреагировали. Грустно
- larin
- топ-софт
- Сообщения: 228
- Зарегистрирован: Пн, 10/09/2007 12:13
- Имя Фамилия: Михаил Ларин
- Откуда: ТопCофт
- Контактная информация:
К вопросу зачем нужны унаследованные IMarker.
Думаю автор стати "Автопометка с возможностью обхода помеченных записей в порядке их пометки" не обидится если его статью перепечатаю в форуме.
Думаю автор стати "Автопометка с возможностью обхода помеченных записей в порядке их пометки" не обидится если его статью перепечатаю в форуме.
Последний раз редактировалось larin Вт, 14/10/2008 09:33, всего редактировалось 1 раз.
- larin
- топ-софт
- Сообщения: 228
- Зарегистрирован: Пн, 10/09/2007 12:13
- Имя Фамилия: Михаил Ларин
- Откуда: ТопCофт
- Контактная информация:
Собственно сама сатья.
Автопометка с возможностью обхода помеченных записей в порядке их пометки
Назначение
Стандартная Атлантическая автопометка (объектный интерфейс IMarker и его реализация Marker) не позволяют выполнить обход помеченных записей в том порядке, в котором они были помечены пользователем. Описываемый интерфейс решает эту задачу.
Реализация
Для решения этой задачи использовалось наследование Vip-интерфейса Marker и реализация нового объектного интерфейса IPosMarker:
Полностью исходники можно посмотреть в каталоге CompSrc\F\F_Common\Vip\PosMarker.
Использование
Пример использования можно увидеть в компоненте F_PlPor. Ниже представлены фрагменты кода, описывающие принципы использования интерфейса PosMarker.
Замечание
Потребовалась дополнительная переменная piMarker, т.к. синтаксис Атлантиса требует, чтобы в операторе RecMarker использовалась переменная именно типа IMarker.
Автопометка с возможностью обхода помеченных записей в порядке их пометки
Назначение
Стандартная Атлантическая автопометка (объектный интерфейс IMarker и его реализация Marker) не позволяют выполнить обход помеченных записей в том порядке, в котором они были помечены пользователем. Описываемый интерфейс решает эту задачу.
Реализация
Для решения этой задачи использовалось наследование Vip-интерфейса Marker и реализация нового объектного интерфейса IPosMarker:
Код: Выделить всё
//--------------------------------------------------------
ObjInterface IPosMarker;
// Номер записи в маркере в порядке пометки
Property plPos : longint Read Write;
// Ссылка на помеченную запись
Property pcRec : comp Read Write;
// Индекс для обхода помеченных записей в порядке их пометки
Index ByPos = plPos;
// Событие, которое будем генерить при пометке и снятии пометки для одной записи
Event Procedure EventMarkUnmark(abMark: boolean);
// Это событие придет перед снятием всех пометок по "-"
Event Procedure EventUnselectAll;
end;
//--------------------------------------------------------
VipInterface PosMarker (Marker) implements IPosMarker;
Public:
Function IModify.doInsert: word;
Function IModify.doDelete: word;
Procedure IMarker.UnselectAll;
end;
Использование
Пример использования можно увидеть в компоненте F_PlPor. Ниже представлены фрагменты кода, описывающие принципы использования интерфейса PosMarker.
Код: Выделить всё
#include PosMarker.vih
var
pMarker : IPosMarker(PosMarker) new;
piMarker: IMarker;
//-----------------------------------------
Create view as select * from PlPor, pMarker;
//-----------------------------------------
Procedure LoopMarked; // Обход в порядке пометки
{
ResetBounds(#pMarker);
_Loop pMarker
{
...
}
SetBounds(#pMarker);
}
//-----------------------------------------
Browse brPlPor;
Table PlPor;
RecMarker = piMarker {PlPor.NRec};
Fields
...
End;
//-----------------------------------------
HandleEvent // Interface
cmInit:
piMarker := IMarker(pMarker);
End;
Потребовалась дополнительная переменная piMarker, т.к. синтаксис Атлантиса требует, чтобы в операторе RecMarker использовалась переменная именно типа IMarker.
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
я и говорю, переналожение баундов - самое очевидное, что имело бы смысл дорабатывать
насчёт прелести неявно сказал, описав ничтожный объём работ по реализации стандартной функциональности
про доработку тоже ответил - сказав, что имело бы смысл дорабатывать, а что сейчас уже есть
ну а насчёт кокнретных предложений - нет в этих маркерах индексов, на таблицах они построены. при желании можно было бы сделать, но смысл? впрочем, если индексированные маркеры на основе этого маркера очень нужны - можно попробовать самим доработать объект
насчёт прелести неявно сказал, описав ничтожный объём работ по реализации стандартной функциональности
про доработку тоже ответил - сказав, что имело бы смысл дорабатывать, а что сейчас уже есть
ну а насчёт кокнретных предложений - нет в этих маркерах индексов, на таблицах они построены. при желании можно было бы сделать, но смысл? впрочем, если индексированные маркеры на основе этого маркера очень нужны - можно попробовать самим доработать объект