Как показать родительскую категорию в Delphi 2010?

Хорошо, я использую Embarcadero Delphi 2010. В настоящее время я использую файл базы данных Access с именем flib.mdb в этом файле я делаю таблицу с именем MCategory который имеет 4 (четыре) столбца с именем: codecategory как текст и первичный ключ, parentcategory как текст, category как текст, notes как текст.

Для подключения к базе данных я использую ADOConnection. Для запроса я использую ADOQuery. Для таблицы я использую ADOTable.

Для кода автоматически генерируется с префиксом, но для примера я использую обычный номер в качестве строки.

Существует только один корень: codecategory="0" // parentcategory="" // category="ROOT" не разрешается добавлять другой ROOT (тот, у которого пустая родительская категория)

Мой вопрос заключается в том, как перемаскировать все родительские категории, как на картинке ниже? И как это просмотреть на DBGrid?

маскировка родительской категории

Должен ли я использовать рекурсивный? Есть ли простой способ сделать это?

А также исходный код в Delphi 2010, пожалуйста.... ^^

1 ответ

Решение

Вы можете конвертировать все записи набора данных в TStringList и сортировать его.

в разделе интерфейса объявите это:

TForm1=class(...)
  RecordList:TStringList;
  constructor Create(AOwner:TComponent);override;
 destructor Destroy;override; 

end;
TCategoryItem=class
public:
   CategoryTitle:string;
   Id,ParentId:Variant;
end;

в разделе реализации:

constructor TForm1.Create(AOwner: TComponent);  
begin
  inherited ;
  RecordList:=TstringList.create(true);  //  use this code in FormCreate  also


end;
 destructor TForm1.Destroy;
    begin
      ...
   RecordList.Free;//  use this code in FormDestory  also

    end;

procedure TForm1.AdoQuery1AfterOpen(DataSet:TDataSet);
var
  Item,RootItem:TCategoryItem;
begin
  DataSet.First;
  DataSet.DisableControls;

  try
   (*add abstract root item to RecordList if needed 
     RootItem:=TCategoryItem.Create;
     RootItem.CategoryTitle:='ROOT';
     RecordList.AddObject('',RootItem);*)
    while not DataSet.Eof do
    begin
      Item:=TCategoryItem.Create;
      Item.CategoryTitle:=DataSet['Cateogory'];
      Item.Id:=DataSet['CodeCategory'];
      Item.ParentId:=DataSet['ParentCategory'];
      RecordList.AddObject(VarToStr(Item.Id),Item);
      DataSet.Next;
    end;
  finally
    RecordList.Sort; // for use find(binary search)
    DataSet.EnableControls;
    DataSet.First;
  end;
end;
procedure TForm1.OnGetFieldText(Sender: TField; var Text: string;
  DisplayText: Boolean);
var 
  Idx:Integer;
  ParentValue:Variant;
  Item:TCategoryItem;
  Texts:TStringList;
begin
  ParentValue:=Sender.Value;
  Texts:=TStringList.create;
  try
    while RecordList.Find(varToStr(ParentValue),Idx) do
    begin
      Item:=RecordList.Objects[Idx] as TCategoryItem; 
      Texts.Insert(0,Item.CategoryTitle); 
      ParentValue:=Item.ParentId;
    end;
    Texts.Delimiter:='>';
    Text:=Texts.DelimitedText;
  finally
    Texts.Free;
  end;


end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.FieldByName('parentcategory').OnGetText := OnGetFieldText;
  ADOQuery1.Refresh;
end;
Другие вопросы по тегам