الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

بحث في Treeview

بدأه rober في 30 يوليو 2008 · 6 رد · 1,003 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

أنا أستخدم التابع التالي في البحث ضمن الـ treeview لكنه يبحث عن كلمة مطابقة لكلمة البحث

و أريد أن أقوم بالبحث عن أيتم مشابه لكلمة البحث أي لا يشترط أن يكون مطابق لكلمة البحث

أأمل أن أجد الحل هنا

function getnodebytext(atree : ttreeview; avalue : string):ttreenode ;

var node : ttreenode ;

begin

result := nil ;

if atree.Items.Count = 0 then

exit ;

node := atree.items[0] ;

while node <> nil do

begin

if uppercase(node.text) = uppercase(avalue) then

begin

result := node ;

break ;

end ;

node := node.getnext ;

end ;

end ;



procedure TForm1.Button1Click(Sender: TObject);

var tn : ttreenode ;

begin

tn := getnodebytext(treeview1,edit1.Text) ;

if tn = nil then

begin

showmessage('name is not found') ;

end

else

begin

treeview1.SetFocus ;

tn.selected := true ;

end ;

end;

تم تعديل هذه المشاركة بواسطة rober في 30 يوليو 2008 في 01:05

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#2

السلام عليكم...

إذا كنت تريد البحث عن Item (أو Node) يبدأ نصها بالنص الذي تبحث عنه (مثلاً تحديد "محمد أحمد" عند البحث عن "محمد") فاستبدل سطر المقارنة if uppercase(node.text) = uppercase(avalue) then كالتالي:

  1.  
  2. if Length(avalue) < Length(node.text) then begin
  3. if uppercase(Copy(node.text, 1, Length(avalue)) = uppercase(avalue) then begin
  4. result := node ;
  5. break ;
  6. end;
  7. end
  8. else if uppercase(node.text) = uppercase(avalue) then begin
  9. result := node ;
  10. break ;
  11. end;
  12.  

أما إذا كنت تريد البحث عن وجود النص في أي مكان من نص الـ Node فاستعمل الدالة Pos للبحث عنه. الدالة Pos تعيد صفراً إذا لم يوجد النص المطلوب البحث في النص المطلوب البحث فيه، أما إذا وجدته فتعيد رقم موقع أول حرف يبدأ عنده النص المطلوب البحث عنه.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#3

كما قال najy استخدم التابع Pos بدل من =

شيئ اخر ربما يفيدك إذا أردت تسريع عملية البحث:

كيفية البحث في TreeView نريد تنافس في سرعة البحث

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#4

السلام عليكم

مشكورين يا أخوان القصة أنحلت لكن تبقى مشكلة في حال كان هناك أكثر من مشابه فالكود الذي إستخدمته يبحث عن أول مطابق فقط

الكود المستخدم

function getnodebytext(atree : ttreeview; avalue : string):ttreenode;
var node : ttreenode;
i : integer;
begin
   i := 0;
   result := nil;
   if atree.Items.Count = 0 then
	  exit;
   node := atree.items[0];
   while node <> nil do
   begin
	  i := pos(uppercase(avalue),uppercase(node.text));
	  if i > 0  then
	  begin
		 result := node;
		 break;
	  end;
	  node := node.getnext;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var tn : ttreenode;
begin
   tn := getnodebytext(treeview1,edit1.Text);
   if tn = nil then
   begin
	  showmessage('name is not found');
   end
   else
   begin
	  treeview1.SetFocus;
	  tn.selected := true;
   end;
end;

عذرا على الإزعاج لكن الأمر مهم :blush:

تم تعديل هذه المشاركة بواسطة rober في 31 يوليو 2008 في 22:57

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#5

السلام عليكم...

ما أحلى المنتدى عندما توجد أفكار للنقاش!!

الكود التالي هو نفس الدالة التي كتبتها أنت مع بعض التعديلات عليها. لاحظ تعريف النوع TFindWhichNode الذي يمكن إضافته إلى عبارة type في أعلى الـ Unit أو وضعه في جملة type مستقلة في قسم الـ implementation. كما يمكنك أن تستعمل بدله أرقاماً مثلاً 1، 2، 3، 4.

لاحظ كذلك إضافة بارامتر ثالث للدالة لتحديد نوع و اتجاه البحث.

فكرة البحث هذه مستوحاة من طريقة البحث في جدول أو استعلام قاعدة بيانات في Visual Basic و هي:

البحث عن الأول (First): البحث عن أول تطابق ابتداءً من بداية الـ TreeView و باتجاه الأسفل.

البحث عن التالي (Next): البحث عن التطابق التالي ابتداءً من الـ Node المحددة حالياً و باتجاه الأسفل.

البحث عن السابق (Previous): البحث عن التطابق السابق ابتداءً من الـ Node المحددة حالياً و باتجاه الأعلى.

البحث عن الأخير (Last): البحث عن آخر تطابق ابتداءً من نهاية الـ TreeView و باتجاه الأعلى.

  1. type
  2. TFindWhichNode = (fwnFirst, fwnNext, fwnPrevious, fwnLast);
  3.  
  4. function GetNodeByText(ATree: TTreeView; AValue: string; FindWhat: TFindWhichNode): TTreeNode;
  5. var
  6. Node : TTreeNode;
  7. I : Integer;
  8. begin
  9. Result := nil;
  10. if ATree.Items.Count = 0 then
  11. Exit;
  12.  
  13. case FindWhat of
  14. fwnFirst: Node := ATree.Items[0];
  15. fwnLast: Node := ATree.Items[ATree.Items.Count - 1];
  16. fwnNext: Node := ATree.Selected.GetNext;
  17. fwnPrevious: Node := ATree.Selected.GetPrev;
  18. end;
  19.  
  20. while Node <> nil do begin
  21. I := Pos(UpperCase(AValue), UpperCase(Node.Text));
  22. if I > 0 then begin
  23. Result := Node;
  24. Break;
  25. end;
  26. case FindWhat of
  27. fwnFirst, fwnNext: Node := Node.GetNext;
  28. fwnLast, fwnPrevious: Node := Node.GetPrev;
  29. end;
  30. end;
  31. end;
  32.  

و بالطبع عند استدعاء الدالة ستضيف البارامتر الثالث، مثلاً:

  1. tn := GetNodeByText(TreeView1, Edit1.Text, fwnNext);
  2.  

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#6

السلام عليكم

مشكور يا معلم الطريقة روعة بالفعل لم أجربها بعد لكني متأكد من أنها 100%

najy_zl كتب:
ما أحلى المنتدى عندما توجد أفكار للنقاش!!

أي و الله

مشكور مرة ثانية

أول ما أجلس على جهازي لح أطبق و أضع مثال كامل لها

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

#7

حاولت أن أشرح الكود الذي كتبه الأخ najy_zl للفائدة أرجو من الأخوان التعليق في حال كان هناك خطأ في الشرح

كما قمت بعمل مثال في المرفقات

ملاحظة :

التابع Pos يقوم بأختبار وجود شبه بين نصين و يعيد رقم هو عبارة عن رقم أول محرف للنص المطلوب البحث عنه في النص المبحوث فيه

إذا لم يكن هناك شبه فيعيد (0)

 

[color= #000000; font-weight: bold;]type TFindWhichNode [color= #000066;]= [color= #000066;](fwnFirst[color= #000066;], fwnNext[color= #000066;], fwnPrevious[color= #000066;], fwnLast[color= #000066;])[color= #000066;];

 

[color= #000000; font-weight: bold;]var

  Form1[color= #000066;]: TForm1[color= #000066;];

 

[color= #000000; font-weight: bold;]implementation

 

[color= #008000; font-style: italic;]{$R *.DFM}

 

[color= #000000; font-weight: bold;]function GetNodeByText[color= #000066;](ATree[color= #000066;]: TTreeView[color= #000066;]; AValue[color= #000066;]: [color= #000066; font-weight: bold;]string[color= #000066;]; FindWhat[color= #000066;]: TFindWhichNode[color= #000066;])[color= #000066;]: TTreeNode[color= #000066;];

[color= #000000; font-weight: bold;]var    Node [color= #000066;]: TTreeNode[color= #000066;];

I [color= #000066;]: [color= #000066; font-weight: bold;]Integer[color= #000066;];

[color= #000000; font-weight: bold;]begin

   Result [color= #000066;]:[color= #000066;]= [color= #000000; font-weight: bold;]nil[color= #000066;];

   [color= #808080; font-style: italic;]// إختبار في حال كانت التري فارغة

   [color= #000000; font-weight: bold;]if ATree[color= #000066;].[color= #006600;]Items[color= #000066;].[color= #006600;]Count [color= #000066;]= [color= #0000ff;]0 [color= #000000; font-weight: bold;]then

      [color= #000066;]Exit[color= #000066;];

   [color= #808080; font-style: italic;]// إختبار نوع البحث

   [color= #000000; font-weight: bold;]case FindWhat [color= #000000; font-weight: bold;]of

      [color= #808080; font-style: italic;]// تحديد أول عنصر

      fwnFirst[color= #000066;]: Node [color= #000066;]:[color= #000066;]= ATree[color= #000066;].[color= #006600;]Items[color= #000066;][[color= #0000ff;]0[color= #000066;]][color= #000066;];

      [color= #808080; font-style: italic;]// تحديد أخر عنصر

      fwnLast[color= #000066;]: Node [color= #000066;]:[color= #000066;]= ATree[color= #000066;].[color= #006600;]Items[color= #000066;][ATree[color= #000066;].[color= #006600;]Items[color= #000066;].[color= #006600;]Count [color= #000066;]- [color= #0000ff;]1[color= #000066;]][color= #000066;];

      [color= #808080; font-style: italic;]// تحديد العنصر التالي

      fwnNext[color= #000066;]: Node [color= #000066;]:[color= #000066;]= ATree[color= #000066;].[color= #006600;]Selected[color= #000066;].[color= #006600;]GetNext[color= #000066;];

      [color= #808080; font-style: italic;]// تحديد العنصر السابق

      fwnPrevious[color= #000066;]: Node [color= #000066;]:[color= #000066;]= ATree[color= #000066;].[color= #006600;]Selected[color= #000066;].[color= #006600;]GetPrev[color= #000066;];

   [color= #000000; font-weight: bold;]end[color= #000066;];

   [color= #000000; font-weight: bold;]while Node <> [color= #000000; font-weight: bold;]nil [color= #000000; font-weight: bold;]do

   [color= #000000; font-weight: bold;]begin

      [color= #808080; font-style: italic;]// إختبار محتوى العنصر إذا كان مشابه للقيمة المبحوث عنها

      I [color= #000066;]:[color= #000066;]= [color= #000066;]Pos[color= #000066;]([color= #000066;]UpperCase[color= #000066;](AValue[color= #000066;])[color= #000066;], [color= #000066;]UpperCase[color= #000066;](Node[color= #000066;].[color= #006600;]Text[color= #000066;])[color= #000066;])[color= #000066;];

      [color= #808080; font-style: italic;]// في حال وجود شبه

      [color= #000000; font-weight: bold;]if I > [color= #0000ff;]0  [color= #000000; font-weight: bold;]then

      [color= #000000; font-weight: bold;]begin

         Result [color= #000066;]:[color= #000066;]= Node[color= #000066;];

         [color= #000066;]Break[color= #000066;];

      [color= #000000; font-weight: bold;]end[color= #000066;];

      [color= #000000; font-weight: bold;]case FindWhat [color= #000000; font-weight: bold;]of

         fwnFirst[color= #000066;], fwnNext[color= #000066;]: Node [color= #000066;]:[color= #000066;]= Node[color= #000066;].[color= #006600;]GetNext[color= #000066;];

         fwnLast[color= #000066;], fwnPrevious[color= #000066;]: Node [color= #000066;]:[color= #000066;]= Node[color= #000066;].[color= #006600;]GetPrev[color= #000066;];

      [color= #000000; font-weight: bold;]end[color= #000066;];

   [color= #000000; font-weight: bold;]end[color= #000066;];

[color= #000000; font-weight: bold;]end[color= #000066;];

 

[color= #000000; font-weight: bold;]procedure TForm1[color= #000066;].[color= #006600;]Button1Click[color= #000066;](Sender[color= #000066;]: [color= #000066; font-weight: bold;]TObject[color= #000066;])[color= #000066;];

[color= #000000; font-weight: bold;]var tn [color= #000066;]: ttreenode [color= #000066;];

[color= #000000; font-weight: bold;]begin

   [color= #808080; font-style: italic;]// إستدعاء التابع ليبحث عن العنصر التالي

   [color= #808080; font-style: italic;]// المشابه لنص الإديت

   [color= #808080; font-style: italic;]// في التري

   tn [color= #000066;]:[color= #000066;]= GetNodeByText[color= #000066;](TreeView1[color= #000066;], Edit1[color= #000066;].[color= #006600;]Text[color= #000066;], fwnNext[color= #000066;])[color= #000066;];

   [color= #000000; font-weight: bold;]if tn [color= #000066;]= [color= #000000; font-weight: bold;]nil [color= #000000; font-weight: bold;]then

   [color= #000000; font-weight: bold;]begin

      [color= #808080; font-style: italic;]// في حال عدم وجود مشابه

      showmessage[color= #000066;]([color= #ff0000;]'name is not found'[color= #000066;]) [color= #000066;];

   [color= #000000; font-weight: bold;]end

   [color= #000000; font-weight: bold;]else

   [color= #000000; font-weight: bold;]begin

      [color= #808080; font-style: italic;]// تحديد العنصر في حال وجود الشبه

      treeview1[color= #000066;].[color= #006600;]SetFocus [color= #000066;];

      tn[color= #000066;].[color= #006600;]selected [color= #000066;]:[color= #000066;]= [color= #000000; font-weight: bold;]true [color= #000066;];

   [color= #000000; font-weight: bold;]end [color= #000066;];

[color= #000000; font-weight: bold;]end[color= #000066;];

 

[color= #000000; font-weight: bold;]end[color= #000066;].

نرجو الفائدة

Search_in_treeview.zip

I'm Away For Sometimes

I'll Finish My Works

Come Back Soon

More Study > More Search > More Try > More Learning > Great Success

مواضيع مشابهة