PDA

View Full Version : الگوریتم نوشتن اطلاعات یک جدول در یک TTreeView



idic1
دوشنبه 22 خرداد 1385, 18:29 عصر
جدولی با سه فیلد زیر داریم
Id
Parent_Id
Name
چگونه میتوان رکوردهای این جدول ( فیلد Name )را در یک TTreeView نمایش داد

با تشکر فراوان

ghabil
سه شنبه 23 خرداد 1385, 00:30 صبح
باید لایه اول که میشه همونایی که Parent_IDشون Null هست رو بگیری بعد روشون یک لوپ بزنی و یک تابع ریکرسیو رو که فرزندای هر Node را تا وقتی که دیگه فرزندی نباشه پیدا میکنه داخل این لوپ صدا بزنی ...
یکمی شاید اولش سخت بنظر بیاد اما بسیار کلاسیک هستش، اگر سعیت رو کردی و نتونستی بگو برات کد بزارم...

vcldeveloper
سه شنبه 23 خرداد 1385, 08:28 صبح
procedure AddToTree(DataSet: TDataSet; Tree: TTreeView; Parent:
TTreeNode; const FieldName: string='');
var
TreeChild : TTreeNode;
PrevState: boolean;
i : integer;
begin
if (DataSet=nil) or (Tree=nil) then
raise Exception.Create('Invalid parameters');
//Save state of the dataset
PrevState := DataSet.Active;
DataSet.DisableControls;
//Clear previous items in the tree.
Tree.Items.Clear;
try
DataSet.Open;
DataSet.First;
while not DataSet.Eof do
begin
//Add all fields
if FieldName = '' then
begin
//The first field is set as the group title
TreeChild := Tree.Items.AddChild(Parent,VarToStr(DataSet.Fields[0].Value));
for i := 1 to DataSet.FieldCount-1 do
Tree.Items.AddChild(TreeChild,VarToStr(DataSet.Fie lds[i].Value));
end
else
//Add the specified field
Tree.Items.AddChild(Parent,DataSet.FieldByName(Fie ldName).AsString);
DataSet.Next;
end;
finally
//restore state of the dataset
DataSet.Active := PrevState;
DataSet.EnableControls;
end;
end;

مثال:


//Add all the fields to the tree.
AddToTree(AdoTable1,TreeView1,nil,'');
//Only add a field named "City" to the tree.
AddToTree(AdoTable1,TreeView1,nil,'City');

idic1
سه شنبه 23 خرداد 1385, 09:03 صبح
آقای علیرضا کوشا ضمن تشکر از پاسخ شما

من 2 روز برای حل این مسئله وقت گذاشتم و چون نتیجه نگرفتم سوالم را اینجا مطرح کردم
و به همین روشی که شما گفتی عمل کردم
در صورت امکان لطفا کد آن را قرار دهید

ضمنا کد آقای علی کشاورز برای زمانی است که بخواهیم نام فیلد را به عنوان پدر و رکوردهای آن را به عنوان فرزند در Tree نمایش دهیم

در صورتی که در سوال من ، پدر ها و فرزندها همه رکوردهای جدول هستند که باید در Tree نمایش داده شوند و روش آن نیز همانی است که شما توضیح داده ای

idic1
سه شنبه 23 خرداد 1385, 17:37 عصر
هل من ناصرا ینصرنی

لطفا دوستان مطلع از راهنمائی دریغ نفرمایند

ghabil
سه شنبه 23 خرداد 1385, 21:22 عصر
هل من ناصرا ینصرنی

نعم یا حبیبی ، لاکن اصبر قلیلا (مسخره نکردما فردا عربا نریزن تو خیابون ...)


من الان به دلفی دسترسی نداشتم اینو همینطوری نوشتم ، برای همین ممکنه غلط املایی داشته باشه ، که شکر خدا معلم دیکته داریم اینجا بگیره غلطامو (اگر مشغول ExecPlan نوشتن نباشه)

ببین تابع ریکرسیوه اینه بقیش هم که کاری نداره دیگه ، حالا بازم اگر کامپایل کردی باگ داشت بگو درستش کنم ...


procedure AddChilds(AnID: Integer; AName := String; AParentNode: TTreeNode)
var
NewParent: TTreeNode;
begin
with TADODataset.Create do
try
Close;
CoomandText := 'Select * from Table where ParentID = ' + IntToStr(AnID);
Open;
while not Eof do
begin
NewPArent := TreeView1.Items.AddChild(AParentNode, AName);
AddChilds(FieldByNAme('ID').ASInteger, FieldByNAme('Name').AsString, NewParent);
Next;
end;
finally
ds_Qry.Free;
end;
end;


الان نیگا کردم دیدم کانکشن AdoDataSet رو هم ست نکردم خود بکن بیزحمت....