Хочу вас познакомить с моим способом вывода списков, таблиц и редактирования табличных данных.
Предположим, мы используем какую-то структуру для хранения списка, например массив, или что лучше generic список из System.Generic.Collections.
Например так,
1 2 3 4 5 6 7 8 9 10 | type TProductType = record ID: Integer ; Name: string ; Section: string ; end ; TProductTypes = class (TTableData<TProductType>) function FindCheckedID(Value: Integer ): Integer ; end ; |
TList – это generic класс для работы со списком состоящим из чего угодно. Это универсальный класс, который может работать с абсолютно любыми типами данных. Но можно и обычный массив использовать и работать с ним по старинке.
В общем, у нас есть какой-то список, мы его заполняем и он хранит там наши данные.
Теперь нам нужно его выводить юзеру, чтобы он его просматривал и/или редактировал.
Что мы для этого делаем? Мы копируем нужные поля в таблицу TListView или TListBox и надеемся на полную синхронность.
Но я делаю следующее:
- Меняю класс TList, на свой подправленный класс TTableData. Основное что он делает, это позволяет вызывать метод, если изменится кол-во элементов.
- Далее, вступает мой компонент TTableEx – таблица, которая умеет выводить данные напрямую из любого списка на экран и позволяет редактировать любые данные, также напрямую.
Так выгладит инициализация списка TTableData с таблицей
1 | FProductTypes := TProductTypes . Create(TableExProductTypes); |
И собственно вот всё что нужно сделать, чтобы данные отображались в таблице: FCol – столбце (в данном случае, 0 выступает CheckBox’ом, а 1 – Название категории продукта), FRow – строка которая сейчас выводится.
1 2 3 4 5 6 7 8 9 10 11 | procedure TFormMain . TableExProductTypesGetData(FCol, FRow: Integer ; var Value: string ); begin if not FProductTypes . IndexIn(FRow) then Exit; case FCol of 0 : Value := '' ; 1 : Value := FProductTypes[FRow].Section + ' - ' + FProductTypes[FRow].Name; end ; end ; |
TTableData так же накладывает свойство Check на элементы, чтобы их отобразить в таблице достаточно написать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | procedure TFormMain . TableExProductTypesItemColClick(Sender: TObject; MouseButton: TMouseButton; const Index: Integer ); begin if not FProductTypes . IndexIn(TableExProductTypes . ItemIndex) then Exit; FProductTypes . Checked[TableExProductTypes . ItemIndex] := not FProductTypes . Checked[TableExProductTypes . ItemIndex]; end ; procedure TFormMain . TableExVideosAlbumsDrawCellData(Sender: TObject; ACol, ARow: Integer ; Rect: TRect; State: TGridDrawState); begin if ACol <> 0 then Exit; if not FAlbumsVideos . IndexIn(ARow) then Exit; if FAlbumsVideos . Checked[ARow] then ImageList16 . Draw(TableExVideosAlbums . Canvas, Rect . CenterPoint . X - 12 , Rect . Top, 8 , True ) else ImageList16 . Draw(TableExVideosAlbums . Canvas, Rect . CenterPoint . X - 12 , Rect . Top, 9 , True ); end ; |
Первый метод – это клик по строке, мы меняем Check на Uncheck и наоборот.
Второй метод – рисуем изображение нашего чекбокса.
http://www.delphisources.ru/pages/components.php
Вот тут у меня опубликован мой собственный набор компонентов, включающий таблицу и структуру.