Страница 1 из 2
Выбор дапазона записей в Browse ?
Добавлено: 12 Май 2009, 17:24
Игорь Столяров
Привет всем !
Так как в последнее время в форуме стало хорошим тоном в тему и просто для поддержания
разговора матерится на последние релизы C7, то сразу оговорюсь, что вопрос по C6 9058 ABC ...
И все реализуется штатными шаблонами C6.
Поляна следующая: есть Browse - с некоторым кол-вом закладок и сортировокой щелчком мышки по
колонкам - т.е. записи в Browse могут быть отсортированы юзером абсолютно непредсказуемым образом.
Просматриваемый в списке файл имеет поле с уникальным номером записи (и ключ по нему тоже есть).
Задача: выбрать некоторый диапазон записей из этого списка. Предположим - пользователь после
сортировки списка указывает первую и поледную запись в видимом им списке, например нажатием HotKey.
Вопрос: Можно ли как-то выбрать записи из файла - по первой и последней отмеченым записям в списке ... ?
Стандартный MARK не предлагать - работает убого по своей сути, попробовал работать с View - результат
какой-то идет непредсказуемый ...

В общем-то интересует самая идея реализации (куда копать), но если
есть возможность поделится кусочком кода - буду также весьма признателен ...

Re: Выбор дапазона записей в Browse ?
Добавлено: 12 Май 2009, 17:30
ingasoftplus
EasyMultiTag
Re: Выбор дапазона записей в Browse ?
Добавлено: 12 Май 2009, 17:54
Игорь Столяров
ingasoftplus писал(а):EasyMultiTag
Спасибо ... но я же изначально уточнил, что используются штатные шаблоны C6.
Неужели для решения такой задачи нужно вешать на приложение сторонние шаблоны, да еще и коммерческие ?!
Re: Выбор дапазона записей в Browse ?
Добавлено: 12 Май 2009, 20:35
ingasoftplus
Игорь Столяров писал(а):ingasoftplus писал(а):EasyMultiTag
Спасибо ... но я же изначально уточнил, что используются штатные шаблоны C6.
Неужели для решения такой задачи нужно вешать на приложение сторонние шаблоны, да еще и коммерческие ?!
EMT и работает со штатными шаблонами (с броузом).
Задача, возможно, выглядит достаточно просто. Но если не хотите изобретать велосипед...
в забугорных НГ проскакивали недавно решения данной проблемы руками.
Re: Выбор дапазона записей в Browse ?
Добавлено: 12 Май 2009, 22:30
Игорь Столяров
ingasoftplus писал(а):Задача, возможно, выглядит достаточно просто.
Действительно, вполне достаточно отбросить свои идеи и посмотреть EMT, что бы понять как это все в простоте своей должно работать. Берем очередь по которой строится Browse и выбираем из нее записи наращивая внутренний номер Queue от стартовой позиции до последней. Из нее получаем уникальные номера записей файла. Вот и весь балет - на написание прекрасно работающего прототипа ушло полчаса. В общем-то спасибо за помощь.

Re: Выбор дапазона записей в Browse ?
Добавлено: 12 Май 2009, 22:48
ingasoftplus
Re: Выбор дапазона записей в Browse ?
Добавлено: 16 Май 2009, 3:49
lsgsoftware
Я так понимаю,что условия отбора тебе известны.
Попробуй вот так. В точке Validate record сделай такую вставочку
IF NOT(условия отбора) then return(Record:filtered).
Re: Выбор дапазона записей в Browse ?
Добавлено: 16 Май 2009, 8:15
Игорь Столяров
Нет, нужно не отбирать записи по условию, а отмечать диапазон записей в Browse c
произвольной сортировкой, в т.ч. и с сортировкой щелчком мышкой по шапке колонок Browse.
В общем-то задача уже решена, если интересно - то:
- Вешаем на Browse AltertKey ShiftMouseLeft и F8Key (делаем отмету по "стандарту" MS Excel)
- В Event AlertKey Browse ловим нажатие этх кнопок: If (KeyCode() = ShiftMouseLeft) Or (KeyCode() = F8Key)
и по ним нажимаем кнопку выбора диапазона: Post(Event:Accepted,?MultiSelect)
- Заводим флаг выбора диапазона, т.к. выбор начала и конца диапазона производится одинаковыми кнопками.
- Если выбор первой записи диапазона - запоминаем позицию записи в View: Queue:Browse:1.ViewPosition и
можно также запомнить уникальный код записи и по нему выделить первую отмеченную запись в Browse.
Я еще меняю цвет цвет полосы прокрутки, что бы было явно видно, что включен режим выбора диапазона
записей в Browse: ?Browse{Prop:SelectedFillColor} = Color:Maroon
- Далее пользователь произвольно прокручивает записи в Browse и отмечает последнюю запись диапазона,
аналогично запоминаем Queue:Browse:1.ViewPosition
- Делаем Reset(BRW1::View:Browse,первая позиция) и прокручиваем Next(BRW1::View:Browse) выбирая и
запоминая номера записей диапазона в очередь до позиции View конца диапазона.
- Все. Показываем в выбранные номера записей в Browse как выбранные.
Есстественно нужно отслеживать отметку одной записи, направление выбора записей (вверх-вниз), наличие
первой выбранной записи в списке при отметке последней (пользователь может после отметки первой записи
изменить условия фильтрации) и т.д. Но это уже мелочи, не меняющие общую идею работы отметки записей
в списке.
Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 11:37
seawolf
Попробовал данную схему. Работает за следующим исключением:
_____
- Если выбор первой записи диапазона - запоминаем позицию записи в View: Queue:Browse:1.ViewPosition и
можно также запомнить уникальный код записи и по нему выделить первую отмеченную запись в Browse
_____
вот здесь имеем почему-то пусто а не Position а код запоминаем без проблем и красим запись!
_____
Далее пользователь произвольно прокручивает записи в Browse и отмечает последнюю запись диапазона,
аналогично запоминаем Queue:Browse:1.ViewPosition
_____
вот здесь имеем почему-то тоже имеем пусто а не Position и не можем далее через Loop(View) Next (View) обработать диапазон чтобы его покрасить!
Queue:Browse:1.ViewPosition описывается по умолчанию как String(1024) по почему дает пусто а не указатель позиции не пойму! что не так?
Cобирал на C6.3 9059
Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 13:55
Игорь Столяров
seawolf писал(а):Cобирал на C6.3 9059
Аналогично - все прекрасно работает.
Возможно зависит от драйвера БД. Я сделал, проверял и работаю с TPS и Btrieve - здесь точно проблем нет.
Насчет Position - то это не указатель на запись, а некая строка однозначно идентифицирующая запись в списке VIEW, причем независимо от наличия уникального ID и / или Primary Key ... В этом и есть главная прелесь и отличие использование Position от некого поля с уникальным кодом в списке.
И я так понимаю, что что ее значение будет разным для различных файловых драверов, а размер взят по максимуму.
Если смотреть как текстовую строку - то она пустая, если как Binary - то она содержит некую последовательность бинарных кодов.
Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 14:38
seawolf
Использовал topspeed драйвер. Position теперь я понимаю так, что подсмотреть нельзя, поэтому априори можно считать что он выдает правильное положение во View:Browse. Остается установиться на начало view - Reset(BRW1::View:Browse,первый Position ) Далее Loop(BRW1::View:Browse), Next(BRW1::View:Browse) пока не встретим последний Position или я не прав?
Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 15:02
Игорь Столяров
seawolf писал(а):Использовал topspeed драйвер. Position теперь я понимаю так, что подсмотреть нельзя, поэтому априори можно считать что он выдает правильное положение во View:Browse.
Абсолютно верно !
seawolf писал(а):Остается установиться на начало view - Reset(BRW1::View:Browse,первый Position ) Далее Loop(BRW1::View:Browse), Next(BRW1::View:Browse) пока не встретим последний Position или я не прав?
Если совсем тупо действовать - да. Но лучше попробовать немного оптимизировать.
Что у нас есть ? Первая и последняя позиция в списке. При этом, в общем случае, мы не знаем сортировку списка и куда двигался пользователь после отметки первой записи диапазона: вверх или вниз по списку ... Правильно ?
Соответсвенно - от первой отмеченной записи идем вниз по списку
Loc:FirstSelect = Queue:Browse:.ViewPosition ! Начало диапазона записей
....
Loc:SecondSelect = Queue:Browse:.ViewPosition ! Конец диапазона записей
Reset(BRW::View:Browse,Loc:FirstSelect)
Loop
Next(Next(BRW::View:Browse))
If ErrorCode() then "Конец списка".
If Position(BRW::View:Browse) = Loc:SecondSelect then "Нашли конец диапазона".
end
Если дошли до конца списка и не нашли конец диапазона - то возвращаемся на первую запись и идем вверх по списку.
При этом запоминаем приоритетное направление поиска (вверх или вниз) - пользователи как правило выбирают диапазоны записей в одном направлении. При этом нужно проверять еще такой ньюанс - как наличие в текущем списке первой отмеченной записи. Т.е. пользователь может выбрать первую запись - а потом включить в списке фильтр или переключить закладку и на момент выбора записи с указанием конца диапазона - первой записи уже может и не быть в текущем списке ...

Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 15:19
seawolf
Да, эта схема работает. Сейчас пытаюсь понять можно -ли определить направление движения вверх или вниз по первой Postion и по последней (можно -ли их сравнить). Неохота двойной проход делать сначала вниз потом вверх. Плюс, добавил чек-бокс, чтобы пользователь вне зависимости от желания работать с дипазоном мог включением флажка выбирать отдельные записи как в момент когда начало задано так и когда оно не задано.
Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 15:34
Игорь Столяров
seawolf писал(а):Да, эта схема работает.
Отлично ! Насчет сортировки и движения пользователя по списку в момент выбора - к сожалению полная неопределенность ... Не забудь, что в общем случае, список может еще быть отсортирован множесвенным выбором щелчком мышки на шапке списка по нескольким колонка в разных направлениях ....

Впрочем - если будут идеи - пиши, постараюсь найти в них косяк ...
А по поводу выбора записей - я решил не изобретать велосипед и сделал как в MS Office (пользователи привыкли):
- ПРОБЕЛ - выбор текщей записи с перемещением засветки вниз на одну запись
- CTRL+LeftMouse - выбор текущей записи
- Shift+LeftMouse или F8 - выбор начала и конца диапазона для выбора.
- F5 - обновление списка и сброс всех выбранных записей.
(все по AlertKey Browse)
На мой субъективный вгляд - просто, понятно, привычно и без лишних наворотов.

Но главное - полная управляемость. Потому, то что в нескольких вариантах готововых шаблонов мне не понравилась в первую очередь ОГРАНИЧЕННАЯ УПРАВЛЯЕМОСТЬ И РЕАЛИЗАЦИЯ, а не их небесплатность ....
Re: Выбор дапазона записей в Browse ?
Добавлено: 29 Июнь 2009, 16:26
seawolf
Если чего будет, то напишу. Заметил только, что если Работает Previous(View) когда проматриваем вверх, то наблюдаю замедление по сравнению с Next.
Насчет сортировок по заголовкам тоже понял.