Как показать родительскую категорию в 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;