سلام
لو اردت نقل عناصر TreeView فيما بينهم بطريقة السحب و الافلات
drag&drop ,
1- ضع TreeView على الفورم , قم بتكوين بعض العناصر و العناصر الفرعية فيها ,
2- في الحدت OnDragDrop ضع الأوامر التالية :
[l] procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); begin TreeView1.Items.AddChild(TreeView1.GetNodeAt(x,y),TreeView1.Selected.Text); TreeView1.Selected.Delete; end; [/l]
الأمر الاول هو أمر اضافة العنصر المسحوب drag كأحد العناصر الفرعية Child للعنصر المسحوب اليه ,
الأمر الثاني هة أمر الغاء العنصر المسحوب من مكانه الاصلي , و لو قمت بازالة هدا الامر فتكون العملية بدل نقل للعنصر عملية نسخ له ,
3- الخطوت المهمة هي تغيير خاصية حالة السحب DragMode
من الحالة dmManual الى الحالة dmAutomatic
الآن نفد البرنامج , وحاول سحب العناصر و افلاتها ,
لو أردت مزيد من التحسيات البرمجية ,
مثلا لو اردنا العناصر الرئيسية تابتة لايمكن تغببر مكانها , فقط نستطيع نقل العناصر الفرعية فعليك بالاتجاه الى الحدث DragOver هدا الحدث ينفد كلما قمت بتحريك عنصر الى مكان معين , حيت ينفد هذا الحدت قبل تنفيد الحدث OnDragDrop و توجد به امكانية لقبول أو عدم قبول العملية Accept ,
متلا لتطبيق الفكرة السابقة بأن تكون العناصر الرئيسية تابتة , فعليك بمقارنة المستوى Level الذي أخدت منه العنصر ادا كان المستوى 0
فهدا يعنى مستوى العناصر الرئيسية , لدلك نرفظ العملية كالتالي , واي مستوى اخر فأن العملية سوف تقبل .
[l] procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if TreeView1.Selected.Level=0 then Accept:=False; end; [/l]
الكود كاملا
[l] procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin if TreeView1.Selected.Level=0 then Accept:=False; end; procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); begin TreeView1.Items.AddChild(TreeView1.GetNodeAt(x,y),TreeView1.Selected.Text); TreeView1.Selected.Delete; end; [/l]
وشكرا