Здесь я не буду рассказывать, как работать со строками и столбацми таблицы или как менять внешний вид таблицы, потому что писал об этом постом выше. Тут я сразу покажу расширенную работу с таблицами 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 столбца).
Думаю, вы сами разберётесь в этом коде, ведь он очень похож на предыдущий. Главное - начинать в событий (в данном случае - атблицы) и идти по связям.
Редактирование таблиц, конечно, нужное дело. Вопрос в том, что потом делать с накопленными данными?
ОтветитьУдалитьКакими компонентами можно искать и запускать в программу информацию из ячеек таблицы?
У StringTableMT есть метод doMT_FindText, который ищет текст в таблице.
ОтветитьУдалитьИнтересно! А как можно сделать чересстрочное закрашивание строк?
ОтветитьУдалитьВот пример закрашивания определённой строки.
ОтветитьУдалитьМожно сделать что бы наличие текста в ячейки таблицы, в StringtableMT обозначалось иконкой, и при наведении мышкой на данную иконку текст появлялся всплывающей подсказкой?(текст есть-иконка есть, текста нет-иконки нет)
ОтветитьУдалитьОчень хорошие примеры. Большое Спасибо.
Стандартными средствами - вряд ли. Но можно так, как реализовано в \Elements\Delphi\Example\Forms\MTStrTbl\With_EditCtrl.sha. Только вместо списка использовать Image, где и отображать иконку. А Текст можно хранить в матрице строк (она на вкладке "Массивы"). Тогда текст будет находиться в матрице, иконка - выводиться в таблицу, а вот с подсказками сложнее. Можно спросить на форуме hiasm.com.
ОтветитьУдалитьне мог зарегистрироваться на форуме
ОтветитьУдалитьпоэтому прошу подсказку здесь
- как сохранить изменение ширины столбцов в таблице ?
Если в hiStringTableMT, то надо зайти в группу параметров Files, там выбрать SaveWidth и установить его в True и SaveColProp тоже поставить в True.
ОтветитьУдалитькак вывести таблицу на принтер? подскажите пожалуйсто!!!
ОтветитьУдалитьСм. Elements\delphi\Example\Printer\PrintDocuments\Tabel.sha
ОтветитьУдалитьПравда, в примере показана отрисовка таблицы на форме. На принтер мне вывести не удалось. Спросите на форуме hiasm.com, там лучше должны знать.
ОтветитьУдалитьКак изменить индексацию строк в таблице, сделать не с 0 до ..., а например с аа23С1 до аа23С...
ОтветитьУдалитьПодскажите пожалуйста как вывести весь столбец МТ таблицы в выпадающий список.
ОтветитьУдалитьКак сделать,чтобы при нажатии на строку в таблице открывался выпадающий список и при выборе определенного пункта выпадало сообщение "Сохранить изменения?", при нажатии кнопки ОК - сохранялось. И при следующем запуске таблицы значение было тем, на которое поменяли в предыдущем шаге. Подскажите пожалуйста
ОтветитьУдалитьПодскажите, пожалуйста, как сделать так, чтобы при выборе строки в таблице сразу показывался выпадающий список над вторым столбцом?
ОтветитьУдалить