Mas Rahman, menanyakan tentang penggunaan TreeView dengan database. Aku sendiri menganjurkan TreeView dari DevExpress karena sangat mudah dan intuitif. Jedi VCL juga memiliki JDbTreeView tetapi penggunaannya sangat tidak intuitif dan manualnya sulit didapatkan. Searching di google, di milis JEDI saja ada komentar berikut:
I had successfully implemented DevExpress’s DBTreeview when I worked for
my last employer, so I thought I could apply what I had learned in my
home project using JvDBTreeview, but failed after many hours.
Apparently, they are similar, but not similar enough. I also searched
the help files and the internet extensively for any info about this
component and finally gave up looking and bought DevExpress’s DBTreeview
Suite. With the aid of their very well written help files and online
support files, I was able to create exactly what I wanted in about two
hours.
Warning: Woll2Woll’s very nice DB treeview is easier to implement than
DevExpress’s, but shields the programmer from learning how the treeview
really works and actually creates work for the programmer when they try
to override its default behavior.
I recommend DevExpress’s treeview over W2W’s. If yo
u buy it, I’ll help
you get it running.
Good luck.
Regards,
Sam Hunt
Jadi menurut saya kalau memang tidak beli TreeView dari DevExpress ya mau tidak mau menggunakan TTreeView bawaa Delphi. Nah butuh rekursif prosedur untuk bisa membaca seluruhnya.
Nah berikut ini adalah coding sample penggunaan untuk loading tree structure dari database. Intinya, setiap row butuh 1 parent ID dan ID dia sendiri, termasuk field untuk menampilkan data di treenya. Jadi minimal butuh 3 field. Parent ID, Child ID, dan Caption yang akan dimunculkan.
Untuk membuatnya, drop komponen berikut ke form:
- TTreeView
- Button dengan caption Refresh Tree
- TClientDataSet (atau gunakan komponen TTable atau TQuery atau turunan TDataSet)
- TDataSource
- TDBGrid
- TDBNavigator
unit unitMain;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
DBCtrls, Grids, DBGrids, ComCtrls, DB,
DBClient;
type
TformMain = class(TForm)
treeView: TTreeView;
tbmSample: TClientDataSet;
tbmSampleParentID: TStringField;
tbmSampleChildID: TStringField;
tbmSampleCaption: TStringField;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
dtsSample: TDataSource;
btnRefresh: TButton;
procedure btnRefreshClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure CreateTree(parentID: String; ParentNode: TTreeNode);
{ Private declarations }
public
{ Public declarations }
end;
var
formMain: TformMain;
implementation
{$R *.dfm}
procedure TformMain.CreateTree(parentID: String; ParentNode: TTreeNode);
var
list: TStringList;
i: integer;
newNode: TTreeNode;
begin
list := TStringList.Create;
tbmSample.Filtered := False;
tbmSample.Filter := 'ParentID = ' + QuotedStr(parentID);
tbmSample.Filtered := True;
while Not tbmSample.EOF do
begin
if tbmSample.FieldByName('ParentID').AsString = parentID then
list.Add(tbmSample.FieldByName('ChildID').AsString + '=' +
tbmSample.FieldByName('Caption').AsString);
tbmSample.Next;
end;
i := 0;
while i < list.Count do
begin
begin
newNode := treeView.Items.AddChild(ParentNode,
list.Values[list.Names[i]]);
CreateTree(list.Names[i], newNode);
Inc(i);
if i Mod 10 = 0 then
Application.ProcessMessages;
end;
end;
list.Free;
end;
procedure TformMain.FormCreate(Sender: TObject);
begin
tbmSample.Open;
tbmSample.Insert;
tbmSampleParentID.AsString := '0';
tbmSampleChildID.AsString := '1';
tbmSampleCaption.AsString := 'Wisnu';
tbmSample.Post;
tbmSample.Insert;
tbmSampleParentID.AsString := '1';
tbmSampleChildID.AsString := '2';
tbmSampleCaption.AsString := 'Rayyan';
tbmSample.Post;
tbmSample.Insert;
tbmSampleParentID.AsString := '1';
tbmSampleChildID.AsString := '3';
tbmSampleCaption.AsString := 'Aila';
tbmSample.Post;
tbmSample.Insert;
tbmSampleParentID.AsString := '0';
tbmSampleChildID.AsString := '4';
tbmSampleCaption.AsString := 'Rachman';
tbmSample.Post;
tbmSample.Insert;
tbmSampleParentID.AsString := '4';
tbmSampleChildID.AsString := '5';
tbmSampleCaption.AsString := 'Fina';
tbmSample.Post;
tbmSample.Insert;
tbmSampleParentID.AsString := '4';
tbmSampleChildID.AsString := '6';
tbmSampleCaption.AsString := 'Fani';
tbmSample.Post;
end;
procedure TformMain.btnRefreshClick(Sender: TObject);
var
topNode: TTreeNode;
begin
topNode := treeView.Items.Add(Nil, 'Root Node');
CreateTree('0', topNode);
tbmSample.Filtered := False;
end;
end.
Untuk project lengkapnya, download saja di sini.
Tinggalkan komentar