Использование IMarker

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Использование IMarker

Сообщение stix »

Посмотрел пример (vipprogr.chm) использования маркера IMarker. Но так и не понял, как получить выбранные пользователем значения, а также проверить - была ли выделена запись с некоторым NRec. Неужели нужно экспортировать все пометки в другой маркер и уже по нему делать SearchMarker? Вообще, пример в хэлпе несколько запутанный. Нельзя ли добавить отдельный пример по использованию возможностей IMarker. А то в стандартном примере приведены три типа маркера (IMarker, унаследованный от IMarker и стандартный) и неясны некоторые моменты - например как выгружать (высвобождать) маркер (в примере в cmDone происходит выгрузка из IMarker в стандартный маркер и лишь затем вызывается DoneMarker). Т.е. неясно, нужно ли при использовании IMarker создавать дополнительно стандартный маркер или же нет?
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

up
Неужели никто не знает как заюзать IMarker?

В общем сейчас затык в том, как получить выбранные записи. Пробовал вот такой код:

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

var _mrk : IMarker(Marker) new;
...

procedure ProcessMarker;
{
   _loop _mrk
   {
      ProcessNRec(_mrk.pNRec);
   }
не работает :-( Похоже индекс iByNRec не является индексом navigate

неужели нужно работать вот так:

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

var _mrk : IMarker(Marker) new;
...
procedure ProcessMarker;
{
   var tmpMarker : longInt;

   tmpMarker := InitMarker('tmpMarker', 8, 100, 10);
   _mrk.ExportTo(tmpMarker);

  ...тут обрабатываем tmpMarker
  GetMarker(tmpMarker, .., ..);
  ... 
}
НЕ верю! В чем тогда преимущество и удобство использования IMarker???
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Снова :up:

А свойство 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);
  }
Для каких целей это свойство? И как же все таки заюзать IMarker правильно?

P.S. Кстати свойство Owner объявлено как protected, а обращаться можно из внешнего кода!

Если имелось в виду -> что protected это read only свойство, тогда конструкция явно неудачно выбрана, тоже самое можно сделать описав свойство как: property Owner : longInt read, а protected-ом нужно ограничивать область видимости рамками интерфейса и унаследованных фейсов
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

баунды надо накладывать, которые сделают обратную привязку - того, что выбирали, к маркеру
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Фёдор Терсин
не совсем понял о чем речь. Можно пояснить примером кода?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

пример кода в документации
суть - в нормальном режиме работы к узлу, по которому построен браузер, подцепляется объект-маркер
это обеспечивает возможность пометки и отображения
для обработки необходимо выполнить обратную подцепку - к маркеру подцепить узел логической таблицы
соответственно, при компиляции генерируются два баунда - прямой и обратный
правила генерации их имён описаны в документации
для обработки надо наложить обратный браузер и пройтись по маркеру
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Фёдор Терсин
Использование IMarker в документации показано лишь в одном примере. Его я смотрел. Ответы на свои вопросы в нем не нашел. Какой пример мне еще посмотреть? Если не сложно напишите название раздела в vip_progr.chm
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

При использования выражения recMarker без задания опции <вычисляемое-выражение> в системе VIP становятся доступны два переключаемых реляционных отношения под следующими именами:

bounds tbRM<имя>1

bounds tbRM<имя>2

Где <имя> - имя таблицы, корневой для данного браузера.

Первый bounds автоматически накладывается при открытии окна. Если есть необходимость обработать только выделенные записи, то необходимо снять первый bounds (функцией SubBounds) и установить второй. И соответственно после обработки выделенных записей снять второй и установить первый (функцией AddBounds) bounds.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Фёдор Терсин
Спасибо! Почитал, нашел этот раздел в 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 выбранной записи
   } 
}
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

для элементарных операций телодвижений минимум
1 описал в браузере
2 в нужное место воткнул обработку (в т.ч. переналожение баундов)
просто в доке навороченный общий пример на перекрытие функциональности и т.п.
единственное, в чём имело бы смысл упрощать - это скрытое переналожение баундов при организации цикла по маркеру
в цикле по маркеру и сейчас можно пройтись - достаточно снять с него подцепку
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Фёдор Терсин
Переналожение баундов - это уже детали реализации, уходить нужно от таких вещей. Абстрагироваться, добавлять врапперы, скрывающие всю черновую работу.
Вы так и не ответили, в чем прелесть использования IMarker, да и на мои предложения по доработке похоже вообще не отреагировали. Грустно
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Сообщение larin »

К вопросу зачем нужны унаследованные IMarker.

Думаю автор стати "Автопометка с возможностью обхода помеченных записей в порядке их пометки" не обидится если его статью перепечатаю в форуме.
Последний раз редактировалось larin Вт, 14/10/2008 09:33, всего редактировалось 1 раз.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Сообщение larin »

Собственно сама сатья.

Автопометка с возможностью обхода помеченных записей в порядке их пометки

Назначение
Стандартная Атлантическая автопометка (объектный интерфейс 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;
Полностью исходники можно посмотреть в каталоге CompSrc\F\F_Common\Vip\PosMarker.

Использование
Пример использования можно увидеть в компоненте 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.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Михаил Ларин
СПАСИБО! Я так счастлив! Ведь этого ответа я ждал 2 недели, видимо мои страдания были вознаграждены! А нет ли в тайной кладези знаний Галактики другой статьи - по поиску элемента в маркере?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

я и говорю, переналожение баундов - самое очевидное, что имело бы смысл дорабатывать
насчёт прелести неявно сказал, описав ничтожный объём работ по реализации стандартной функциональности
про доработку тоже ответил - сказав, что имело бы смысл дорабатывать, а что сейчас уже есть
ну а насчёт кокнретных предложений - нет в этих маркерах индексов, на таблицах они построены. при желании можно было бы сделать, но смысл? впрочем, если индексированные маркеры на основе этого маркера очень нужны - можно попробовать самим доработать объект
Ответить