пятница, 2 октября 2009 г.

Таблицы в HiAsm

Когда нужно вывести список каких-то текстовых данных, мы используем список строк. А когда каждой строке соответствуют ещё какие-то данные, которые нужно показать, необходимо использовать компонент для вывода двумерных данных.
Этот компонент - таблица.

Таблица - это пересечение столбцов и строк, в результате чего образуются ячейки. Таблицы используются не только в Excel. В Excel таблицы служат для сложных, профессиональных вычислений, а простые таблицы (которые даже иногда не похпжи на таблицы) используются в большинстве программ, причём даже необязательно для редактирования пользователем.

Обратите внимание, например, на Диспетчер задач. Его вкладки "Приложения" и "Процессы" содержат типичные таблицы, только обрамления ячеек у них нет. Использование таких таблиц настолько просто и удобно, что используются они почти везде, где только можно.

HiAsm предоставляет нам два варианта таблиц. По внешнему виду они похожи, но у второго больше возможностей. И сначала мы рассмотрим первую таблицу в HiAsm - StringTable. Компонент находится недалеко от списка строк на вкладке "Интерфейс". У него есть немало параметров и точек. Если вы взглянете не методы компонента, то увидите, что они аналогичны методам списка строк: добавить, удалить, очистить, сохранить, загрузить. Но всё это проделывается не со списком строк, а с таблицей.

Прежде всего в таблицу необходимо добавить столбцы. Это делается через параметр Columns. Задаются столбцы в формате <название>=<ширина>, но ширину указывать необязательно, тогда будет ширина по умолчанию.

После этого нужно позаботиться о добавлении строк. Но каждая строка должна содержать данные для всех столбцов! Значит, элементы строки нужно разделять. Символ-разделитель задаётся в параметре StrDelimiter. По умолчанию это точка с запятой, но если в ваших ячейках возможен такой символ, то лучше разделитель изменить, ведь он служит для разделения строки на ячейки.

Если вы собираетесь испльзовать все символы, то можно разделителем сделать табуляцию. Она задаётся сочетанием символов \9. А как при составлении строки вставить этот символ? Для этого мы воспользуемся компонентом HiAsm FormatStr со вкладки "Строки".



Здесь все поля подготовлены, и при нажатии кнопки текст каждого передаётся HiAsm'овскому компоненту FormatStr. В параметре этого компонента Mask задаётся маска, по которой нужно отформатировать текст. %x - это номер верхней точки, с которой берутся данные, а \9 - это табуляция.

Что касается переключателей, то при нажатии на любом компонент DoData передаёт свои данные в поток, который несёт их в компонент Memory. А тот уже - на верхнюю точку FormatStr.

Ну и doAdd таблицы принимает данные, разделённые табуляцией, записывая их в таблицу. Удалять строки, очищать таблицу и сохранять/загружать так же легко, как у списка строк.

Теперь обратите внимание на другие параметры компонента HiAsm StringTable. Если в таблице вам нужна сетка, то включите Grid. Параметры сохранения, очистки таблицы - тоже рядом.
Отдельно нужно сказать про редактирование таблицы. По умолчанию это разрешено, и, дважды щёлкнув по строке, вы сможете отредактировать её текст. Но если параметры редактирования какие-то особенные (как в примере - колонка "пол" должна содержать только одну букву), то лучше ручное редактирование выключить и позволять редактировать только через поля и переключатели.



Ручное редактирование запрещено, и пользователь не сможет ввести в колонку "пол" что-то своё.
При нажатии на строке запускается компонент MultiStrData, который разбивает строку, разделённую символами, на элементы. Символ задаётся в параметре Char, у нас это табуляция. Ну а каждый элемент поступает в предназначенное для него поле. А "Пол" сначала определяется, а потом выбирается нужный переключатель.

Ещё один интересный метод этой таблицы HiAsm - doAddColumn, который находится на вкладке "Точки" панели параметров. Он добавляет в таблицу новый столбец.


На этом знакомство с HiAsm'овским StringTable закончим. Есть более умелый компонент - StringTableMT, который использует MT-потоки. Про них я писал в предыдущей статье.

StringTableMT находится также на вкладке "Интерфейс", в группе "Расширенные". Есть, правда, её вариант на технологии менеджеров, но я пока про них не писал, поэтому его мы рассматривать не будем, тем более что этот вариант может всё то же, что и StringTableMT, но состоит из многих компонентов (группа "Строковая таблица MT).

StringTableMT имеет очень много параметров и точек. Все мы их рассмотреть просто не сможем, но основные рассмотрим.

Во-первых, это строковый накопитель (группа параметров "StringList"). В нём можно задать строки, которые будут добавляться при запуске программы. Это бывает очень удобно, если у таблицы есть обязательные неизменяемые строки. В параметре StringsStrList задайте строки с разделителем (не забудьте добавить сначала столбцы и указать разделитель в группе параметров Columns, параметре StrDelimiter). Если вы хотите сразу после запуска программы видеть эти строки в таблице, то включите параметр AutoTblStrList.

Теперь о добавлении через MT-потоки. Стандартный метод doAdd добавляет строки в разделителем, а для MT-потока есть метод doMT_add, находящийся на вкладке "Точки" панели параметров. Каждый элемент такого потока содержит текст для одной ячейки добавляемой строки, благодаря чему не нужно никаких разделителей.



Эта несложная схема HiAsm выводит даже значки в таблицу! Но для начала разберём параметр Columns у таблицы. Первый столбец зада в ней полностью, а формат его можно посмотреть в описании к параметру. Остальные два столбца содержат по три знака равенства, причём между первым и вторым пусто, а должна была бы находиться ширина столбца. Ну а если нет, значит - по умолчанию. Нам нужно было указать иконку с индексом -1. Такой не существует, значит, иконок у двух последних столбцов не будет. И выравнивания тоже.

А где хранятся иконки? Раскройте группу параметров Images и выберите параметр Icons. Вот тут-то и хранится наша единственная иконка. Только нужно обязательно включить параметры AssignedList и ImgColumn, чтобы иконки отображались.

Но иконки также можно задать для каждой строки! Для этого самым первым элементом MT-потока должен идти индекс иконки из параметра Icons (нумерация начинается с 0!). Мы в компоненте Memory указали "-1", чтобы не было никаких иконок у строк.

Ну и напоследок раскроем группу параметров Table, чтобы задать вид нашей таблицы.
Параметр Style позволит менять отображение ячеек таблицы, но не рекомендуется его изменять, потому что многие "украшения" не работают в других стилях.
Параметр TableWBreak позволит сделать ячейки многострочными, хотя в этом нет большой необходимости. Однако включить этот параметр нужно, чтобы опять-таки позволить отображаться "украшениям". Если при этом вам не нужны многострочные ячейки - включите также SingleString.

Параметры TabGrid и TabGridFrame задают отображение выделенной строки. Включите их для эксперимента. Также интересен параметр Grid3D. Поэкспериментируйте и с другими параметрами.



Видите, никаких компонентов, кроме таблицы, нет, а таблица уже со строками и отличается красотой выделения строк.

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

  1. Hiasm уже давно использует менеджеры, а StringTableMT всё ещё сохраняет иконки в себе. Лучше MTStrTbl.

    ОтветитьУдалить
  2. Таблицы - страсть бухгалтеров. В начале говорилось, что их используют все повсюду, но так и осталось непонятным, для каких общих повсеместных задач они нужны при создании программ. В примерах - только данные о кадрах.

    ОтветитьУдалить
  3. Там приведён пример Диспетчера задач, ftp-клиент Filezilla содержит окошки-таблицы, да даже в проводнике windows можно выбрать табличный способ отображения файлов. И в основе всего этого - таблицы. В StringTableMT есть группа параметров для управления отображаемыми файлами.

    ОтветитьУдалить
  4. В инженерных-строительных расчёта, очень часто используют таблицы

    ОтветитьУдалить
  5. Доброго времени суток! Возможно ли указать выравнивание по центру для одного из столбцов?

    ОтветитьУдалить
    Ответы
    1. Add(StringTableMT,15163531,259,224)
      {
      Left=15
      Top=25
      Width=245
      Height=215
      Columns=#15:Столбец1=150==2|
      IconsCheck=[]
      MiscIcons=[]
      Icons=[]
      StringsStrLst=#1:1|1:2|1:3|
      AutoTblStrLst=0
      }


      Свойство Columns - это параметры столбцов таблицы (формат строки параметров: Название=Ширина=Индекс иконки=Индекс выравнивания (0 - taLeft; 1 - taRight; 2 - taCenter))

      Удалить
    2. Огроменное СПАСИБО!

      Удалить
  6. Подскажите, как вывести в денежном формате в таблице три столбца в mstrtbl? Нежно для вывода на печать чеков с ценами и суммой. В таблице 2-3 х значные цифры, а привести надо все к денежному формату.

    ОтветитьУдалить
    Ответы
    1. Немного поясню. Есть бд sqlite. В ней таблица temp с ячейками: название, цена нетто, цена брутто, количество. Ну и заполнена соответственно. Содержание выводится на mstrtbl, оттуда на html. Проблема в том, что количество знаков после запятой всегда должно быть равно двум. Например: цена 10,50, а в таблицу выводится 10,5. Конечно форматом цены сдесь и не пахнет. Подскажите, как сделать формат строки, чтоб все правильно было?

      Удалить
    2. Использовать компонент ConvertorEx.
      И заполнить параметры for NumToFStr, а также использовать Mode=NumToFStr. Это для знаков после запятой.

      Add(ConvertorEx,197847,252,329)
      {
      Mode=15
      link(onResult,11202713:doStrCat,[])
      }
      Add(Edit,7654540,203,322)
      {
      Width=150
      Text="10.5"
      link(onEnter,197847:doConvert,[])
      }
      Add(Message,1703163,343,329)
      {
      }
      Add(StrCat,11202713,294,329)
      {
      Str2=" р."
      link(onStrCat,1703163:doMessage,[])
      }

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

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