Виртуальные таблицы

Хочу вас познакомить с моим способом вывода списков, таблиц и редактирования табличных данных.

Предположим, мы используем какую-то структуру для хранения списка, например массив, или что лучше 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 и надеемся на полную синхронность.

Но я делаю следующее:

  1. Меняю класс TList, на свой подправленный класс TTableData. Основное что он делает, это позволяет вызывать метод, если изменится кол-во элементов.
  2. Далее, вступает мой компонент TTableEx – таблица, которая умеет выводить данные напрямую из любого списка на экран и позволяет редактировать любые данные, также напрямую.

Так выгладит инициализация списка TTableData с таблицей

FProductTypes := TProductTypes.Create(TableExProductTypes);
Собственно вот выделена табличка TTableEx

 И собственно вот всё что нужно сделать, чтобы данные отображались в таблице: 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
Вот тут у меня опубликован мой собственный набор компонентов, включающий таблицу и структуру.

Share

You may also like...

Добавить комментарий

Войти с помощью: