понедельник, 5 октября 2009 г.

Таблицы в HiAsm-2

Первая статья про таблицы в HiAsm получилась незакноченной. Я рассказал вам лишь про основное использование таблиц, а иногда нужно расширить функции таблиц. В этой статье про таблицы в HiAsm речь пойдёт как раз про расширенное использование таблиц HiAsm.

Здесь я не буду рассказывать, как работать со строками и столбацми таблицы или как менять внешний вид таблицы, потому что писал об этом постом выше. Тут я сразу покажу расширенную работу с таблицами HiAsm.

Использать нужно только таблицу StringTableMT, но не StringTable, потому что почти ничего "расширенного" последняя не может: нет у неё нужных точек.

Для начала расскажу, как управлять содержимым отдельной ячейки. Конечно, вы можете использовать точку свойств FullTextTab (на вкладке "Точки") у таблицы и получить полный список её строк, но потом придётся использовать ещё точки и компоненты, чтобы найти в строке текст ячейки и изменить его.

А можно сделать в разы проще с помощью матриц. Ведь таблица - это и есть матрица! И точка свойств Matrix у неё тоже есть (на вкладке "Точки"). Она-то нам и понадобится. А ещё компонент MatrixRW со вкладки "Массивы" на панели компонентов. У него есть верняя точка Matrix, которую нужно подключить к такой же точке нашей таблицы.
Ну а затем, задавая нужные столбец и ячейку, можно получать или устанавливать её значение.



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

Да, что касается внешнего вида таблицы, то я рассказывал про это в предыдущем посте, но напомню: в группе параметров "Table" есть все необходимые параметры.

Матрицы нам нужны будут и для следующего случая, когда ячейка должна принимать значения только в определённом диапазоне. В прошлом посте я также говорил про это, но там преключатели были вне таблицы, а хочется сделать красиво, например выпадающий список в ячейке. Конечно, сама ячейка стать выпадающим списком не может, но зато мы можем поставить этот список и передвигать его к ячейке, когда это нужно.

Прежде всего, определимся, что нам нужно. Во-первых, при редактировании определённой ячейки должен появляться выпадающий список. Во-вторых, он должен устанавливать нужное значение в ячейку при выборе. Для этого нужен сам список и нужно событие, по которому мы будем узнавать, что редактирование началось.

Это событие таблицы называется onMT_CellClick, и оно выдаёт в поток MT-поток, содержащий координаты редактируемой ячейки, чтобы можно было определить, куда перемещать выпадающий список. Но работает это событие только при установленных параметрах Redaction=False и RowSelect=True. По умолчанию они уже установлены правильно.



Как всегда, схему начинаем рассматривать с событий.

Событие onMT_CellClick входит в компонент MT_IndexToChanel. Это нужно для того, чтобы узнать, ячейку какого столбца начали редактировать (допустим, нам нужно показывать список только для второго столбца - должности). К точке Index компонента MT_IndexToChanel подключена точка таблицы SubItem. В ней-то и содержится индекс выделенного столбца. И событие компонента MT_IndexToChanel идёт как раз под номером 2. Это значит, что попытка редактирования ячеек других столбцов ничего не даст.

Внимание! В MT-потоках следует использовать для подобных целей компонент MT_IndexToChanel, а не обычный IndexToChanel, потому что для MT-потоков он непригоден!

Дальше идёт разветвитель с тремя событиями. Первое идёт в компонент ChanelToIndex, котороый на своё событие выдаёт номер точки-метода, по которому в него вошли (индекс начинается с 0!). Но здесь поток идёт на метод выпадающего списка doVisible, поэтому нам важен второй метод ChanelToIndex, который выдаст 1, и список станет видимым (параметр списка Visible сделан False, чтобы сначала список был не виден).

Второе событие разветвителя идёт в MT_MultiData, который раскладывает MT-поток на четыре составляющих - координаты выделенной ячейки. Выпадающий список автоматически переносится на эти места.

И третье событие разветвителя берёт текст из выделенной ячейки через компонент DoData и ищет его в выпадающем списке. Если находит - показывает.

Событие onClick выпадающего списка завершает редактирование. Оно происходит при выборе значения из списка (а к разветвителю также подключается и событие onEcsCell таблицы). У списка параметр DataType должен быть равен String, чтобы в поток на onClick выдавалась выбранная строка, а не её индекс.

Вначале список делается невидимым (опять же через ChanelToIndex, у которого теперь вызывается метод №0). А затем через матрицу устанавливается выбранное значение списка в таблицу. Это значение передаётся в потоке, поэтому точка Value компонента MatrixRW не задействована.


Осталось теперь решить, как быть с ячейками других столбцов, ведь их-то нужно редактировать свободно, без выбора из списка. Но отредактировать их не получится прочто так, потому что Redaction=False, а в true его устанавливать нельзя, иначе перестанет работать onMT_CellClick.

Придётся делать так же, как со списком. Только у MT_IndexToChanel нужно задействовать другие события: первое и третье (ведь у нас только 3 столбца).



Думаю, вы сами разберётесь в этом коде, ведь он очень похож на предыдущий. Главное - начинать в событий (в данном случае - атблицы) и идти по связям.

15 комментариев:

  1. Редактирование таблиц, конечно, нужное дело. Вопрос в том, что потом делать с накопленными данными?
    Какими компонентами можно искать и запускать в программу информацию из ячеек таблицы?

    ОтветитьУдалить
  2. У StringTableMT есть метод doMT_FindText, который ищет текст в таблице.

    ОтветитьУдалить
  3. Интересно! А как можно сделать чересстрочное закрашивание строк?

    ОтветитьУдалить
  4. Вот пример закрашивания определённой строки.

    ОтветитьУдалить
  5. Можно сделать что бы наличие текста в ячейки таблицы, в StringtableMT обозначалось иконкой, и при наведении мышкой на данную иконку текст появлялся всплывающей подсказкой?(текст есть-иконка есть, текста нет-иконки нет)
    Очень хорошие примеры. Большое Спасибо.

    ОтветитьУдалить
  6. Стандартными средствами - вряд ли. Но можно так, как реализовано в \Elements\Delphi\Example\Forms\MTStrTbl\With_EditCtrl.sha. Только вместо списка использовать Image, где и отображать иконку. А Текст можно хранить в матрице строк (она на вкладке "Массивы"). Тогда текст будет находиться в матрице, иконка - выводиться в таблицу, а вот с подсказками сложнее. Можно спросить на форуме hiasm.com.

    ОтветитьУдалить
  7. не мог зарегистрироваться на форуме
    поэтому прошу подсказку здесь
    - как сохранить изменение ширины столбцов в таблице ?

    ОтветитьУдалить
  8. Если в hiStringTableMT, то надо зайти в группу параметров Files, там выбрать SaveWidth и установить его в True и SaveColProp тоже поставить в True.

    ОтветитьУдалить
  9. как вывести таблицу на принтер? подскажите пожалуйсто!!!

    ОтветитьУдалить
  10. См. Elements\delphi\Example\Printer\PrintDocuments\Tabel.sha

    ОтветитьУдалить
  11. Правда, в примере показана отрисовка таблицы на форме. На принтер мне вывести не удалось. Спросите на форуме hiasm.com, там лучше должны знать.

    ОтветитьУдалить
  12. Как изменить индексацию строк в таблице, сделать не с 0 до ..., а например с аа23С1 до аа23С...

    ОтветитьУдалить
  13. Подскажите пожалуйста как вывести весь столбец МТ таблицы в выпадающий список.

    ОтветитьУдалить
  14. Как сделать,чтобы при нажатии на строку в таблице открывался выпадающий список и при выборе определенного пункта выпадало сообщение "Сохранить изменения?", при нажатии кнопки ОК - сохранялось. И при следующем запуске таблицы значение было тем, на которое поменяли в предыдущем шаге. Подскажите пожалуйста

    ОтветитьУдалить
  15. Подскажите, пожалуйста, как сделать так, чтобы при выборе строки в таблице сразу показывался выпадающий список над вторым столбцом?

    ОтветитьУдалить