Хочу вас познакомить с моим способом вывода списков, таблиц и редактирования табличных данных.
Предположим, мы используем какую-то структуру для хранения списка, например массив, или что лучше generic список из System.Generic.Collections.
Например так,
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 с таблицей
FProductTypes := TProductTypes.Create(TableExProductTypes);

И собственно вот всё что нужно сделать, чтобы данные отображались в таблице: FCol – столбце (в данном случае, 0 выступает CheckBox’ом, а 1 – Название категории продукта), FRow – строка которая сейчас выводится.
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 на элементы, чтобы их отобразить в таблице достаточно написать:
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
Вот тут у меня опубликован мой собственный набор компонентов, включающий таблицу и структуру.