delphi4arab منتديات دلفي للعرب

نسخة كاملة : virtual string tree - ادراج صور في شجرة الحسابات
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم
استخدم Virtual string Tree في عمل شجرة حسابات . لدي حسابات رئيسية وحسابات فرعية . واحتاج ان تكون لكل منهما صورة معينة . والحسابات الفرعية قد تكون دائنة او مدينة او مغلقة ويجب ان يكون لكل منها صورة مختلفة . ماهي الطريقة الافضل لادراج الصور في شجرة الحسابات.
كود :
procedure TTree.VTTreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); begin if Kind in [ ikNormal, ikSelected ] then begin if Sender.GetNodeLevel( Node ) = 0 then ImageIndex := 0; if Sender.GetNodeLevel( Node ) = 1 then ImageIndex := 1; end; end;
هذه الطريقة غير مجدية كونه يمكن للحساب الرئيسي ان يحتوي على عدة حسابات رئسية ومن ثم تاتي الحسابات الفرعية .
شكرا لكم
يمكن للحساب الرئيسي ان يحتوي على عدة حسابات رئيسية ...ممكن توضح هذه الجملة بارك الله فيك لم افهم كيف للرئيسي ان يحتوي على شيئ رئيسي المفروض انك تستعمل VST على شكل شجرة اي ROOT و SUB ROOT المهم حسب فهمي من السآل كل ما عليك فعله ان تضيف الصور التالية الى ImageList الخاصة بك :

صورة للحساب المغلق
صورة للحساب الدائن
صورة للحساب المدين

هذه بالنسبة للحسابات الفرعية

نفس الشيئ بالنسبة للحسابات الرئيسية اضف جميع صورها

الان تحتاج الى التحقق من نوع الحساب عند اضافة الصور هذ يعتمد على ماذا استعملت في اضافة البيانات الى الشجرة اذا استخدمت بنية record و الحقيقة كان عليك ان تضهر كود البنية المستعملة مثلا لو استعملت record تقوم باضاقة
سطر var
Account: PFileNode;
begin
Account:= Sender.GetNodeData(Node);

ثم تتحقق من نوع الحساب
if Account.َAccountType = MainAccount then ImageIndex := 0

الفكرة ان تستعمل البنية التي استعملتها في اضافة البيانات في التحقق من نوع الحسابات و ستحل لك المشكل ان شاء الله
ساحاول ارفاق مثال دلفي غير متوفر لدي حاليا
إقتباس :يمكن للحساب الرئيسي ان يحتوي على عدة حسابات رئيسية ...ممكن توضح هذه الجملة بارك الله فيك لم افهم كيف للرئيسي ان يحتوي على شيئ رئيسي
اخي الكريم . الموجودات : حساب رئيسي يحتوي على الموجودات الثابتة وهي ايضا حساب رئيسي والموجودات الثابتة تحتوي على العقارات وهي ايضا حساب رئيسي والعقارات تحتوي على الاراضي وهي ايضا حساب رئيسي وهنا نستطيع البدء بالحسابات الجزئية أي ارض رقم ؟؟؟؟؟ وهي حساب جزئي تابع لحساب رئيسي هو الاراض.

وبالنسبة للكود هذا هو
كود :
procedure TTree.BitBtn1Click(Sender: TObject); var i,e,b,t,x,y : integer; str : Tstrings; NodeT: array[0..1000] of PVirtualNode; pData: PNodedata ; begin VTTree.Cursor := crhourglass; VTTree.BeginUpdate; str := Tstringlist.Create; str.Clear; VTTree.Clear; //------------------------------------------ i := 0; x := 0; y := 0; str.Append('0'); // الحصول على عدد سجلات الحسابات كاملا واسناده الى متغير e // with DM.QryTree do begin Close; SQL.Clear; sql.Text := 'select * from acc_char '; Open; e := RecordCount; Close; SQL.Add('where Father_acc = :p1 '); Parameters.ParamByName('p1').Value := str[i]; Open; First; end; VTTree.NodeDataSize := SizeOf(PNodedata); for t := 0 to DM.QryTree.RecordCount-1 do begin str.Append(DM.QryTree.fields.FieldByName('id_acc').AsString); NodeT[x] := VTTree.AddChild(nil); pData := VTTree.GetNodeData(NodeT[x]); if assigned(pdata) then pdata^.Caption := DM.QryTree.fields.FieldByName('id_acc').AsString + ' / ' + DM.QryTree.Fields.FieldByName('name_acc').AsString; x := x + 1; DM.QryTree.Next; end; for b := 0 to e-1 do begin i := i + 1; DM.QryTree.Close; DM.QryTree.Parameters.ParamByName('p1').Value := str[i]; DM.QryTree.Open; DM.QryTree.First; for t := 0 to DM.QryTree.RecordCount-1 do begin str.Append(DM.QryTree.FieldByName('id_acc').AsString); NodeT[x] := VTTree.AddChild(nodeT[y]); pData := VTTree.GetNodeData(NodeT[x]); if assigned(pdata) then pdata^.Caption := DM.QryTree.fields.FieldByName('id_acc').AsString + ' / ' + DM.QryTree.fields.FieldByName('name_acc').AsString; x := x + 1; DM.QryTree.Next; end; y := y + 1; end; //vst.FullExpand(NIL); VTTree.FullCollapse(nil); VTTree.EndUpdate; VTTree.Cursor := crdefault; end;
كود :
procedure TTree.VTTreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); begin if Kind in [ ikNormal, ikSelected ] then begin if Sender.GetNodeLevel( Node ) = 0 then ImageIndex := 0; if Sender.GetNodeLevel( Node ) = 1 then ImageIndex := 1; end; end;
كود :
procedure TTree.VTTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PNodeData; begin pData :=sender.GetNodeData(Node); if assigned(pdata) then CellText := pData^.Caption; end;
حسنا بالرغم من ان الكود يحتاج الى optimisation الا انني ساوضح فكرتي اكثر لاحظ
كود :
pdata^.Caption := DM.QryTree.fields.FieldByName('id_acc').AsString + ' / ' + DM.QryTree.fields.FieldByName('name_acc').AsString;

اي انك ملئت الحقل Caption في pData الذي هو record
قم باضافة حقل اخر لل record و ليكن AccountType مثل
ثم تقوم بملئه بنفس الطريقة التي ملئت بها الـ caption من قواعد البيانات اي تضيف نوع الحساب الان عند الحدث OnGetImageIndex تضيف

كود :
pData: PNodeData; begin pData :=sender.GetNodeData(Node);

ثم تتحقق من نوع الحساب و تضيف الصورة المعنية به

كود :
if pData.AccountType = MainAccount then ImageIndex:= yourimageindex
وعليكم السلام ورحمة الله وبركاته . بارك الله بك اخي الكريم . شجرة الحسابات كلها مأخوذه من جدول واحد يحتوي على رقم الحساب وهو رئيسي ورقم الحساب الاب واسم الحساب .

وهذه صورة جدول الحسابات
السلام عليكم ورحمة الله وبركاته
بعد ادراج سجل جديد من نوع integer واسمه acckind
كود :
type PNodeData = ^TNodeData; TNodeData = record caption : String; image,id,level,acckibd:Integer; end;

ليصبح الكود كامل
كود :
procedure TTree.BitBtn1Click(Sender: TObject); var i,e,b,t,x,y : integer; str : Tstrings; NodeT: array[0..1000] of PVirtualNode; pData: PNodedata ; begin VTTree.Cursor := crhourglass; VTTree.BeginUpdate; str := Tstringlist.Create; str.Clear; VTTree.Clear; //------------------------------------------ i := 0; x := 0; y := 0; str.Append('0'); with DM.QryTree do begin Close; SQL.Clear; sql.Text := 'select * from acc_char '; Open; e := RecordCount; Close; SQL.Add('where Father_acc = :p1 '); Parameters.ParamByName('p1').Value := str[i]; Open; First; end; VTTree.NodeDataSize := SizeOf(PNodedata); for t := 0 to DM.QryTree.RecordCount-1 do begin str.Append(DM.QryTree.fields.FieldByName('id_acc').AsString); NodeT[x] := VTTree.AddChild(nil); pData := VTTree.GetNodeData(NodeT[x]); if assigned(pdata) then begin pdata^.Caption := DM.QryTree.fields.FieldByName('id_acc').AsString + ' / ' + DM.QryTree.Fields.FieldByName('name_acc').AsString; pdata^.acckibd := DM.QryTree.fields.FieldByName('id_kind').Value ; end; x := x + 1; DM.QryTree.Next; end; for b := 0 to e-1 do begin i := i + 1; DM.QryTree.Close; DM.QryTree.Parameters.ParamByName('p1').Value := str[i]; DM.QryTree.Open; DM.QryTree.First; for t := 0 to DM.QryTree.RecordCount-1 do begin str.Append(DM.QryTree.FieldByName('id_acc').AsString); NodeT[x] := VTTree.AddChild(nodeT[y]); pData := VTTree.GetNodeData(NodeT[x]); if assigned(pdata) then begin pdata^.Caption := DM.QryTree.fields.FieldByName('id_acc').AsString + ' / ' + DM.QryTree.fields.FieldByName('name_acc').AsString; pdata^.acckibd := DM.QryTree.fields.FieldByName('id_kind').Value ; end; x := x + 1; DM.QryTree.Next; end; y := y + 1; end; //vst.FullExpand(NIL); VTTree.FullCollapse(nil); VTTree.EndUpdate; VTTree.Cursor := crdefault; end;
وفي الحدث ONGetImageIndex
كود :
procedure TTree.VTTreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); var PDate :PNodeData ; begin PDate :=sender.GetNodeData(Node); if PDate.acckibd =1 then ImageIndex :=0 ; if PDate.acckibd =2 then ImageIndex :=1 ; end;
ولكن يكون الاستخراج غير صحيح .
مع العلم جميع الحسابات في جدول الحسابات رئسية الا حساب ارض رقم كذا وارض رقم كذا هي حسابات جزئية
السلام عليكم لم استطع تخميم المشكل بالصبط اخي المهم لا تنسى اضافة الكود

كود :
PDate :=sender.GetNodeData(Node); if Kind in [ ikNormal, ikSelected ] then begin if PDate.acckibd =1 then ImageIndex :=0 ; if PDate.acckibd =2 then ImageIndex :=1 ; end;

ربما يجب ان تضيف حقل الى قاعدة البيانات لتعرف به من هي الحسابات الرئيسية من الثانوي
وعليكم السلام ورحمة الله وبركاته . الكود موجود بالاساس . والحقل موجود في قاعدة البيانات وهو id_kind من نوع integer . القيمة 1 رئيسي والقيمة 2جزئي

اعتقد حتى كود عرض الشخره غير صحيح . لانه عند التحديث تختلف النتائج

عند وضع خاصية bidimode من اليسار الى اليمين تكون النتيجة في الصورة رقم 1
وعند وضع الخاصية من اليمين الى اليسار تكون النتيجة ناقصة الحقل الاول . ماسبب هذه المشكله الصورة رقم 2
نجحت معي بهذه الطريقة
كود :
procedure TTree.BitBtn1Click(Sender: TObject); var i,e,b,t,x,y : integer; str : Tstrings; NodeT: array[0..1000] of PVirtualNode; pData: PNodedata ; begin VTTree.Cursor := crhourglass; VTTree.BeginUpdate; str := Tstringlist.Create; str.Clear; VTTree.Clear; //------------------------------------------ i := 0; x := 0; y := 0; str.Append('0'); with DM.QryTree do begin Close; SQL.Clear; sql.Text := 'select * from acc_char '; Open; e := RecordCount; Close; SQL.Add('where Father_acc = :p1 '); Parameters.ParamByName('p1').Value := str[i]; Open; First; end; VTTree.NodeDataSize := SizeOf(PNodedata); for t := 0 to DM.QryTree.RecordCount-1 do begin str.Append(DM.QryTree.fields.FieldByName('id_acc').AsString); NodeT[x] := VTTree.AddChild(nil); pData := VTTree.GetNodeData(NodeT[x]); if assigned(pdata) then pdata^.Caption := DM.QryTree.Fields.FieldByName('name_acc').AsString; x := x + 1; DM.QryTree.Next; end; for b := 0 to e-1 do begin i := i + 1; DM.QryTree.Close; DM.QryTree.Parameters.ParamByName('p1').Value := str[i]; DM.QryTree.Open; DM.QryTree.First; for t := 0 to DM.QryTree.RecordCount-1 do begin str.Append(DM.QryTree.FieldByName('id_acc').AsString); NodeT[x] := VTTree.AddChild(nodeT[y]); pData := VTTree.GetNodeData(NodeT[x]); if assigned(pdata) then pdata^.Caption := DM.QryTree.fields.FieldByName('name_acc').AsString; x := x + 1; DM.QryTree.Next; end; y := y + 1; end; //vst.FullExpand(NIL); VTTree.FullCollapse(nil); VTTree.EndUpdate; VTTree.Cursor := crdefault; end;

كود :
procedure TTree.VTTreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean; var ImageIndex: Integer); var PDate :PNodeData ; begin PDate :=sender.GetNodeData(Node); with dm.qrysersh do begin close; sql.clear; sql.add('select*from acc_char where name_acc=:p1'); parameters.parambyname('p1').value :=pdate.caption; open end; if dm.qrysersh.fields.fieldbyname('id_kind').value=1 then then ImageIndex :=0 else ImageIndex :=1 ; end;

ولكن لماذا عند استخدام الطريقة السابقة باضافة سجل جديد تكون النتائج خاظئة
كود :
type PNodeData = ^TNodeData; TNodeData = record caption : String; image,id,level,acckibd:Integer; end;

كود :
if assigned(pdata) then begin pdata^.Caption := DM.QryTree.fields.FieldByName('id_acc').AsString + ' / ' + DM.QryTree.Fields.FieldByName('name_acc').AsString; pdata^.acckibd := DM.QryTree.fields.FieldByName('id_kind').Value ; end;