delphi4arab منتديات دلفي للعرب
virtual string tree - ادراج صور في شجرة الحسابات - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : virtual string tree - ادراج صور في شجرة الحسابات (/showthread.php?tid=5021)



virtual string tree - ادراج صور في شجرة الحسابات - talal - 16-03-2013

السلام عليكم
استخدم 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;
هذه الطريقة غير مجدية كونه يمكن للحساب الرئيسي ان يحتوي على عدة حسابات رئسية ومن ثم تاتي الحسابات الفرعية .
شكرا لكم


virtual string tree - ادراج صور في شجرة الحسابات - S.FATEH - 16-03-2013

يمكن للحساب الرئيسي ان يحتوي على عدة حسابات رئيسية ...ممكن توضح هذه الجملة بارك الله فيك لم افهم كيف للرئيسي ان يحتوي على شيئ رئيسي المفروض انك تستعمل VST على شكل شجرة اي ROOT و SUB ROOT المهم حسب فهمي من السآل كل ما عليك فعله ان تضيف الصور التالية الى ImageList الخاصة بك :

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

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

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

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

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

الفكرة ان تستعمل البنية التي استعملتها في اضافة البيانات في التحقق من نوع الحسابات و ستحل لك المشكل ان شاء الله
ساحاول ارفاق مثال دلفي غير متوفر لدي حاليا


virtual string tree - ادراج صور في شجرة الحسابات - talal - 16-03-2013

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

وبالنسبة للكود هذا هو
كود :
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;



virtual string tree - ادراج صور في شجرة الحسابات - S.FATEH - 17-03-2013

حسنا بالرغم من ان الكود يحتاج الى 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



virtual string tree - ادراج صور في شجرة الحسابات - talal - 17-03-2013

وعليكم السلام ورحمة الله وبركاته . بارك الله بك اخي الكريم . شجرة الحسابات كلها مأخوذه من جدول واحد يحتوي على رقم الحساب وهو رئيسي ورقم الحساب الاب واسم الحساب .

وهذه صورة جدول الحسابات


virtual string tree - ادراج صور في شجرة الحسابات - talal - 17-03-2013

السلام عليكم ورحمة الله وبركاته
بعد ادراج سجل جديد من نوع 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;
ولكن يكون الاستخراج غير صحيح .
مع العلم جميع الحسابات في جدول الحسابات رئسية الا حساب ارض رقم كذا وارض رقم كذا هي حسابات جزئية


virtual string tree - ادراج صور في شجرة الحسابات - S.FATEH - 19-03-2013

السلام عليكم لم استطع تخميم المشكل بالصبط اخي المهم لا تنسى اضافة الكود

كود :
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;

ربما يجب ان تضيف حقل الى قاعدة البيانات لتعرف به من هي الحسابات الرئيسية من الثانوي


virtual string tree - ادراج صور في شجرة الحسابات - talal - 20-03-2013

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

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

عند وضع خاصية bidimode من اليسار الى اليمين تكون النتيجة في الصورة رقم 1
وعند وضع الخاصية من اليمين الى اليسار تكون النتيجة ناقصة الحقل الاول . ماسبب هذه المشكله الصورة رقم 2


virtual string tree - ادراج صور في شجرة الحسابات - talal - 24-03-2013

نجحت معي بهذه الطريقة
كود :
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;