FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9268
Вход
Класс хидера + индексирование таблицы.

Кликаете на хидере и в таблице происходит сортировка по возрастанию/убыванию. Плюс появляется горячая картинка, указывающая возрастание/убывание.


 
Прислал: Aries   Категория: Интерфейс


Класс хидера + индексирование таблицы.

Чтобы добавить класс MyHeader нужно открыть Грид на редактирование. Выбрать Column1 в дизайнере
прописать свойство HeaderClassLibrary равным "prgMyHeader.prg". И все работает. И так
сделать во всех столбцах грида.
Кликаете на хидере и происходит сортировка по возрастанию/убыванию. При этом появляется на
индексированном столбце картинка. Довольно симпатично получилось, и универсально.
Правда класс невизуальный. Но зато работает.
******************************
Поигрался с индексами. Теперь если индекс открыт то с ним происходит работа.
******************************
Как и обещал, сделал версии для 6-ки и для 8-ки. К сожалению для 6-й версии нет красивых картинок
указывающих
сортировку. Поэтому я заменил на простые символы "<" и ">".
В архиве две папки FOR6 and FOR8. Можна запустить примеры, чтобы посмотреть работу.
В ините формы, для 6-ки прописан код, как вставить хидер в грид.
ПЕсли у кого есть вопросы стучитесь в аську 143983622
Добавил процедуру Destroy для избавления от временных файлов-индексов, чтобы не засорять временные
каталоги.
Кстати за помощь спасибо Мичману %)
******************************
Поправлен глюк с кликом. Теперь если выкликаете на хидере, то фокус получает именно та колонка
в которой находится хидер.
16.12.2003г.
Так теперь фокус остается на той строке на которой бы до сортировке

25.12.2003г.
В папке PRG есть два файла MyHeader и MyHeaderView. MyHeader - применяется для таблиц и курсоров. Работает безотказно. MyHeaderView - применяется для вьюшек. К сожалению, я не могу проверить MyHeaderView полностью на работоспособность. Так как не использую вьюшки, и не знаю, как они работают. Поэтому, если возникнут ошибки, думаю, вы не будете ко мне слишком строги. И еще. Не забудьте сделать высоту заголовков грида равной 20 или более. Это для того чтобы нормально влазила картинка, показывающая возрастание/убывание.
16.16.2004
Новая версия. Я не помню какие изменения я внес в код но помню что что-то я изменял
29.07.2004
Сделал вот такую вещь:
Первый клик - сортировка по возростани.
Второй клик - по убыванию
Третий клик - убирается сортировка
Думаю так лучше будет. 02.08.2004
Вот решил добавить пару вещичек, а именно:
Добавил менюшку по правому клику, в ней сделано:
- Выбор сортировок
- фиксация столбцов
- Динамическое отображение столбцов, т.е пользователь может сам отображать/скрывать
нужные ему столбцы.
Кстати если кому не понравиться, то можно просто удалить процедуру RightClick
на работу самого MyHeader удаление не повлияет.
И еще это сделано только для 8-й версии!.
23.09.2005.
Исправлена ошибка при индексации, когда длина поля больше ста символов.
Теперь если длина символов 100 и более берется 99 симовлов.
это для типов данных Char
 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (5.173) Вложение [31.23]kb
Дополнения пользователей
Класс хидера + индексирование таблицы.
[+][?]
Aries
09.09.03 09:14:26

Да забыл дополнить это работает в VFP8.0 В семерке не проверял. Кстати этот класс можна переделать
и под VFP6 только вот картинки не будет.
Если вдруг кому-то непонятно как работает класс или как им пользоваться пишите, помогу раскажу!
Agishev Baiguzha
10.09.03 14:24:58

Хотел опробовать на семерке, но базу открыть не может, и форму тоже...
Николай
10.09.03 14:53:59

Как сделать программно одним махом для всех столбцов ?
Aries
10.09.03 17:03:01

Вот пытаюсь решить эту проблему :(

Aries
10.09.03 17:29:18

Это для того чтобы вставить програмно Хидер
Первый цикл это удаление старого хидера и добавление нового
Второй это вернуть заголовки назад
********************************
SET PROCEDURE TO MyHeader.prg
FOR lnI=1 TO THIS.oGrid.ColumnCount
  FOR lnK=1 TO THIS.oGrid.Columns(lnI).ControlCount
    IF THIS.oGrid.Columns(lnI).Objects(lnK).BaseClass=="Header"
     aCaption(lnI,1)=THIS.oGrid.Columns(lnI).Header1.Caption 
     THIS.oGrid.Columns(lnI).RemoveObject(THIS.oGrid.Columns(lnI).Objects(lnK).Name)
      THIS.oGrid.Columns(lnI).AddObject("MyHeader1","MyHeader")
    endIF
  endFOR
endFOR
FOR lnI=1 TO THIS.oGrid.ColumnCount
  FOR lnK=1 TO THIS.oGrid.Columns(lnI).ControlCount
    IF THIS.oGrid.Columns(lnI).Objects(lnK).BaseClass=="Header"
      THIS.oGrid.Columns(lnI).Objects(lnK).Caption=aCaption(lnI,1)
    endIF
  endFOR
endFOR
Aries
10.09.03 17:32:53

Сори фигню написал, так правильнее
****************************
FOR lnI=1 TO THIS.oGrid.ColumnCount
  FOR lnK=1 TO THIS.oGrid.Columns(lnI).ControlCount
    IF THIS.oGrid.Columns(lnI).Objects(lnK).BaseClass=="Header"
     lcCaption=THIS.oGrid.Columns(lnI).Header1.Caption 
     THIS.oGrid.Columns(lnI).RemoveObject(THIS.oGrid.Columns(lnI).Objects(lnK).Name)
      THIS.oGrid.Columns(lnI).AddObject("MyHeader1","MyHeader")
     THIS.oGrid.Columns(lnI).MyHeader1.Caption=lcCaption
    endIF
  endFOR
endFOR
Николай
11.09.03 09:10:18

Поясни пожалуйста куда вставить этот цикл ?
Aries
11.09.03 09:12:50

В инит грида.
Николай
11.09.03 09:49:16

на команде
THIS.oGrid.Columns(lnI).AddObject("MyHeader1","MyHeader")
Класс MyHeader не создан ?
Как и где поправить ?
А так вообще не плохо.
Aries
11.09.03 14:38:07

Проставь перед циклом такую строку
************************
SET PROCEDURE TO MyHeader.prg

Николай
11.09.03 14:47:52

В цикле на строке
     lcCaption=THIS.oGrid.Columns(lnI).Header1.Caption 
выдает Unknown member Header1.
Aries
11.09.03 14:56:55

Посмотри Name своего старого хидера.
lcCaption=THIS.oGrid.Columns(lnI).Header1.Caption
В этой строке ты в lcCaption сохраняешь каптион старого хидера.
THIS.oGrid.Columns(lnI).RemoveObject(THIS.oGrid.Columns(lnI).Objects(lnK).Name)
В этой строке удалее старого хидера.
THIS.oGrid.Columns(lnI).AddObject("MyHeader1","MyHeader")
Здесь добавление нового хидера.
THIS.oGrid.Columns(lnI).MyHeader1.Caption=lcCaption
За ним присвоение ему заголовка.
Владимир
11.09.03 19:53:08

Нормально сделано
Но - хотел бы узнать 
Я обычно в Хидере Грида по клику прописывал - 

Select People
Set order to Fio

И все правильно работало
Зачем собственно этот класс, если наблюдается избыточность кода ?


Aries
12.09.03 08:49:25

И что ты  так делаешь для каждого столбца в поле??
Меня лично хе*ит так делать. 
Во вторых невижу никакой избыточности. Обращение всегда только к этому классу, и никакого дубляжа
кода.
Aries
12.09.03 08:51:40

Забыл еще вот что. А что ты делаешь если таблица не имеет составного индекса, вообще неимеет
индексов, тогда как.
Или имеет только по одному полю??
Игорь Королёв
17.09.03 18:39:26

Предлагаю посмотреть заодно и такую вещицу как SortGridSample с сайта UniversalThread.com
Сам чуток подкорректировал под свои потребности и юзаю - идея та-же, но он ещё и сам рисует
индикатор сортировки (работает в VFP7 и даже VFP6)
Aries
18.09.03 09:13:06

а ссылочку поточнее можна кинуть, посмотрю.
Кстати мой класс хидера изначально был написан под VFP6 только вот не рисовался треугольник
сортировки. Поэтому можна его переделать и под 6-ку.
Nikolai Kremko
10.10.03 13:45:37

и даже нужно :) а треугольники можно и символами заменить
а то те , у кого нет VFP8 не могут посмотреть...
Aries
13.10.03 15:55:08

Ты прав Николай. В течении двух-трех дней выложу новое решение. Где будет версии для 6-ки и для 8-ки
Nikolai Kremko
21.10.03 16:04:12

Посмотрел код... 
1) перетащить колонку без того ,чтобы не перестроить индекс по перетаскиваемой колонке 
Проверил -- так и есть.
2) индекс строиться в любом слечае...А ведь можно и проверить ...зачем строить индекс , если он
уже есть в таблице?
3) при сетевом режиме работы с временными индексами, построенными на машине у пользователя,далеко 
не всегда будем иметь корректную информацию.
4) не знаю ,может это и не так у других, но у меня пользователи привыкли, что при смене сортировки
указатель остается на той же записи ...
****************************************************
 у меня есть идеи как порешеть некоторые из этих проблемм... если интересно -- скину то что у меня
получилось...
Nikolai Kremko
21.10.03 16:12:38

Посмотрел код... 
1) перетащить колонку без того ,чтобы не перестроить индекс по перетаскиваемой колонке 
Проверил -- так и есть.
2) индекс строиться в любом слечае...А ведь можно и проверить ...зачем строить индекс , если он
уже есть в таблице?
3) при сетевом режиме работы с временными индексами, построенными на машине у пользователя,далеко 
не всегда будем иметь корректную информацию.
4) не знаю ,может это и не так у других, но у меня пользователи привыкли, что при смене сортировки
указатель остается на той же записи ...
****************************************************
 у меня есть идеи как порешеть некоторые из этих проблемм... если интересно -- скину то что у меня
получилось...
Aries
21.10.03 16:19:29

Кидай буду очень признателен :)
Nikolai Kremko
21.10.03 16:28:43

Посмотрел код... 
1) перетащить колонку без того ,чтобы не перестроить индекс по перетаскиваемой колонке 
Проверил -- так и есть.
2) индекс строиться в любом слечае...А ведь можно и проверить ...зачем строить индекс , если он
уже есть в таблице?
3) при сетевом режиме работы с временными индексами, построенными на машине у пользователя,далеко 
не всегда будем иметь корректную информацию.
4) не знаю ,может это и не так у других, но у меня пользователи привыкли, что при смене сортировки
указатель остается на той же записи ...
****************************************************
 у меня есть идеи как порешеть некоторые из этих проблемм... если интересно -- скину то что у меня
получилось...
Nikolai Kremko
21.10.03 17:28:06

Посмотрел код... 
1) перетащить колонку без того ,чтобы не перестроить индекс по перетаскиваемой колонке 
Проверил -- так и есть.
2) индекс строиться в любом слечае...А ведь можно и проверить ...зачем строить индекс , если он
уже есть в таблице?
3) при сетевом режиме работы с временными индексами, построенными на машине у пользователя,далеко 
не всегда будем иметь корректную информацию.
4) не знаю ,может это и не так у других, но у меня пользователи привыкли, что при смене сортировки
указатель остается на той же записи ...
****************************************************
 у меня есть идеи как порешеть некоторые из этих проблемм... если интересно -- скину то что у меня
получилось...
Nikolai Kremko
21.10.03 17:29:49

Бред..... такого у меня еще не было.... при боновлении страницы дублируется дополнение... сорри
Игорь Королёв
17.12.03 17:13:56

Да ещё - удалять старый хедер при доблении нового не нужно - фокс это сделает автоматом, как
только ты попытаешься добавить в колонку новый объект класса Header.
Aries
18.12.03 11:53:32

Не надо только для 8-й версии, а для 6-ки надо
Deil
24.11.05 15:56:27

на VFP 9 тоже работает
Хорошая весчь... прикрутил к своей проге.
Все работает если к гриду подцеплен обычный курсор/таблица, 

This.Grid1.Column1.ControlSource='fio'

Но вот так уже не работает: 

This.Grid1.Column1.ControlSource='Alltr(family)+Alltr(name)'

Если не затруднит подправьте плиз...
Aries
24.11.05 17:25:28

Прив Deil
В классе MyHeader есть свойство ControlSource
Это как раз для того сделано, если ControlSource колонки
составное выражение.
Поэтому пропишите в ControlSource хидера поле из таблицы
что бы по нему шла сортировка.
Прим:
This.Grid1.Column1.MyHeader1.ControlSource='tTable.family'

Удачи!
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика