![]() |
|
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:= yourimageindexvirtual 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;كود : 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; |