Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 38

‫شرح تفصيلي ألداة ال ‪ ListView‬وكيفية استخدامها‬

‫بعد مشاهدتي للعديد من األسئلة واالستفسارات حول أداة ال ‪ ListView‬قررت كتابة مقال بشكل‬
‫تفصيلي عن أداة ال ‪ ListView‬وسيتم خالل هذا المثال طرح أمثلة لتقريب األفكار إلى ذهن‬
‫القارئ ‪  ,‬وأنوه في بداية الشرح أنني سأستخدم الكود فقط في التعامل مع أداة ال ‪ ListView‬ولن‬
‫استخدم الخصائص مطلق ًا‪ .. ‬لنبدأ على بركة هللا ‪-:‬‬

‫في البدء سنتعلم كيف تتم إضافة األداة ‪ ,‬من قائمة ‪ Project‬اختر ‪ Components‬ثم اختر‬
‫‪Microsoft Windows Common Controls 6.0‬‬

‫استخدامات أداة ال ‪ListView‬‬

‫أوالً ‪ :‬استخدام أداة ال ‪ ListView‬كأداة لعرض البيانات‬

‫من استخدامات أداة ال ‪ ListView‬هو استخدامها كأداة لعرض البيانات مثل أداة ‪ DataGrid‬وأداة‬
‫‪ MSFlexGrid‬المعروفة‪.‬‬

‫الستخدام أداة ال ‪ ListView‬كأداة لعرض البيانات يجب ضبط خاصية ‪ View‬على الخيار‬
‫‪, lvwReport‬طبع ًا خاصية ‪ View‬تستخدم لتحديد أسلوب العرض في أداة ال ‪ ListView‬وهناك‬
‫خيارات أخرى ألسلوب العرض وهذه الخيارات هي كما يلي‬

‫■‪ : lvwIcon ‬وهي لعرض أيقونات كبيرة داخل أداة ال ‪ListView‬‬

‫■‪ : lvwList ‬وهي البيانات كقائمة داخل أداة ال ‪ListView‬‬

‫■‪ : lvwReport ‬وهي لعرض البيانات كتقرير داخل أداة ال ‪ ListView‬وهي تشبه كثير ًا األدوات‬
‫المعروفة لعرض البيانات من قاعدة البيانات مثل أداة ‪ DataGrid‬وأداة ‪ ... MSFlexGrid‬الخ‪ .‬وهي‬
‫أكثر الخيارات المستخدمة من قبل المبرمجين‬

‫■‪ : lvwSmallIcon ‬وهي لعرض أيقونات صغيرة داخل أداة ال ‪ ListView‬التالية‬


‫تصميم مثال‬

‫● سأبدأ اآلن بمثال بسيط ال يعتمد على قاعدة البيانات تابع معي‬
‫‪)1‬أضف أداة ‪ ListView‬إلى ال‪Form‬‬
‫‪)2‬اذهب إلى حدث ‪ Load‬لل ‪ Form‬واكتب الكود التالي ‪ ,‬وهذا الكود كما شرحنا سابق ًا لتحديد‬
‫أسلوب العرض في أداة ال ‪. ListView‬‬

‫‪)(Private Sub Form_Load‬‬


‫‪ListView1.View = lvwReport‬‬

‫‪End Sub‬‬

‫‪)3‬لنفترض أن نريد إضافة ثالثة أعمدة داخل أداة ال ‪ ListView‬في هذه الحالة يجب إضافة عنوان‬
‫رأسي لكل عمود وهذا يتم باستخدام خاصية ‪ ColumnHeaders‬ألداة ال ‪ListView‬‬

‫◄ قبل إضافة العناوين الرأسية ألداة ال ‪ ListView‬سأشرح خاصية ‪ ColumnHeaders‬لهذه‬


‫الخاصية خمس وظائف وهي كالتالي‬

‫‪ :  Add ‬وهي الوظيفة تستخدم إلضافة عنوان رأسي داخل أداة ال ‪ ListView‬ولهذه‬


‫الخاصية ست باراميترات وهي كما يلي‬
‫‪ListView1.ColumnHeaders.Add Index, Key, Text, Width, Alignment, Icon‬‬

‫حيث‬

‫‪ : Index ‬هي الفهرس لهذا العنوان الرأسي‬

‫‪ : Key ‬المفتاح لهذا العنوان الرأسي‬

‫‪ :Text ‬النص الذي سيظهر عليه وهو الباراميتير الوحيد الذي سأستخدمه في إضافة‬
‫العناوين الرأسية‬
‫‪ :Width ‬لتحديد عرض العنوان الرأسي‬

‫‪ :  Alignment ‬لتحديد اتجاه محاذاة النص على العنوان الرأسي ولهذه الخاصية ثالثة قيم‬

‫‪lvwColumnLeft = 0‬‬
‫‪lvwColumnRight = 1‬‬
‫‪lvwColumnCenter = 2‬‬

‫مع مالحظة أن العمود األول في أداة ال ‪ ListView‬تكون قيمة ال ‪ Alignment = 0‬أي النص‬
‫محاذاة النص دائم ًا له تكون على اليسار‬

‫‪ :Icon ‬وهي خاصية إلضافة أيقونات للعناوين الرأسية‪.‬مع مراعاة ضبط خاصية‬


‫‪ ColumnHeaderIcons‬باسم أداة ال ‪ ImageList‬التي يتم إدراج الصور منها كما في الكود‬
‫التالي‬

‫‪ListView1.ColumnHeaderIcons = ImageList1‬‬

‫‪ :  Clear ‬وتستخدم هذه الوظيفة لمسح جميع العناوين الرأسية الموجودة داخل أداة ال‬
‫‪ ListView‬كما في الكود التالي‬

‫‪ListView1.ColumnHeaders.Clear‬‬

‫‪ :  Count ‬وتستخدم هذه الوظيفة لجلب عدد العناوين الرأسية الموجودة داخل أداة ال‬
‫‪ ListView‬كما في الكود التالي مثالً‬

‫‪MsgBox ListView1.ColumnHeaders.Count‬‬
‫‪ :  Remove ‬وتستخدم هذه الوظيفة لحذف عنوان رأسي معين بناء على قيمة ال ‪Index‬‬
‫لهذا العنوان كما في الكود التالي‬

‫‪ListView1.ColumnHeaders.Remove Index‬‬

‫حيث قيمة ال ‪ Index‬ألول عنوان رأسي في هذه الحالة = ‪ 1‬وباقي العناوين بنفس الطريقة مع زيادة‬
‫ال ‪ Index‬بمقدار ‪ 1‬للعنوان الرأسي الذي يليه‬

‫‪ : Item ‬وظائف هذه األداة هي نفسها باراميترات الوظيفة ‪ Add‬فقط هناك وظيفتين‬


‫جديدتين وهما‬

‫‪ : Position ‬وهي لتحديد رقم العنوان الرأسي‬

‫‪ : SubItemIndex ‬وهي لتحديد رقم ال ‪ Index‬للعناصر الموجود أسفل هذا العنوان‬


‫الرأسي‬

‫‪ )4‬بعد أن شرحنا وظائف الخاصية ‪ ColumnHeaders‬كما قلنا سابق ًا نقوم بتحديد أسلوب العرض‬
‫في أداة ال ‪ ListView‬من خالل الخاصية ‪ View‬كما يلي‬

‫‪)(Private Sub Form_Load‬‬


‫‪ListView1.View = lvwReport‬‬

‫‪End Sub‬‬

‫‪ )4‬نقوم بإضافة ثالث عنوانين رأسية ليصبح الكود كما يلي‬

‫‪)(Private Sub Form_Load‬‬


‫‪ListView1.View = lvwReport‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Name‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Number‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Address‬‬

‫‪End Sub‬‬

‫‪ )5‬قم بتشغيل المثال ستالحظ تغير شكل ال ‪ ListView‬كما في المثال التالي‪ ‬‬

‫حمل المثال التوضيحي من هنا‬

‫‪)6‬نأتي اآلن إلضافة بيانات داخل أداة ال ‪ , ListView‬إلضافة عناصر داخل أداة ال ‪ListView‬‬
‫نستخدم خاصية ‪ ListItems‬ولهذه الخاصية خمس وظائف أيض ًا وهي كالتالي‬

‫‪ : Add ‬وهي الوظيفة تستخدم إلضافة بيانات داخل أداة ال ‪ ListView‬ولهذه الخاصية‬


‫خمس باراميترات وهي كما يلي‬

‫‪ListView1.ListItems.Add Index, Key, Text, Icon, SmallIcon‬‬

‫حيث‬

‫‪ : Index ‬هي الفهرس لهذا العنصر المضاف‪.‬‬

‫‪ : Key ‬المفتاح لهذا العنوان العنصر ‪.‬‬

‫‪ :Text ‬النص الذي سيظهر لهذا العنصر ‪.‬‬


‫‪ :  Icon ‬وهي خاصية إلضافة أيقونات للعناصر ‪,‬مع مراعاة ضبط خاصية‪ Icons‬باسم‬
‫أداة ال ‪ ImageList‬التي يتم إدراج الصور منها كما في الكود التالي وهذه الخاصية تستخدم عندما‬
‫يكون أسلوب العرض = ‪. lvwIcon‬‬

‫‪ListView1. Icons= ImageList1‬‬

‫‪ :  SmallIcon ‬وهي خاصية إلضافة أيقونات للعناصر ‪,‬مع مراعاة ضبط خاصية‪Icons‬‬


‫باسم أداة ال ‪ ImageList‬التي يتم إدراج الصور منها كما في الكود التالي وهذه هي الخاصية التي‬
‫سنستخدمها في هذه الحالة‪.‬‬

‫‪ : Clear ‬وتستخدم لحذف محتويات ال‪ListView‬‬

‫‪ : Count ‬وتستخدم لمعرفة عدد الصفوف داخل أداة ال ‪ListView‬‬

‫‪ : Remove ‬وتستخدم لحذف صف معين في أداة ال ‪ ListView‬مع العلم أن قيمة ال‬


‫‪ Index‬ألول سطر = ‪1‬‬

‫‪ : Item ‬ولها العديد من الخصائص وأهم هذه الخصائص هي‬

‫‪ : Bold ‬وهي لجعل الخط غامق وهي خاصية منطقية ترجع قيمة إما ‪ True‬أو ‪False‬‬

‫‪ : Checked ‬وهي خاصية لوضع عالمة صح أمام العنصر داخل أداة ال ‪ListView‬‬


‫طبع ًا في هذه الحالة يجب ضبط خاصية ‪ Checkboxes = True‬ألداة ال ‪ ListView‬كما في الكود‬
‫التالي‬
‫‪ListView1.Checkboxes = True‬‬

‫‪ : ForeColor ‬لتغيير لون الخط لعنصر معين داخل أداة ال ‪ListView‬‬

‫‪ : Selected ‬لتحديد صف معيّن وهي خاصية منطقية ترجع قيمة إما ‪ True‬أو ‪False‬‬

‫● طبع ًا في وظيفة ‪ Add‬كلما أضفنا عنصر بالصيغة الموجودة في األعلى يتم إضافته في نفس‬
‫العمود ‪ ..‬إذن كيف سنضيف بيانات في األعمدة األخرى‪ Ž‬؟ تابع معي ‪..‬‬

‫نقوم بتعريف متغير من نوع ‪ ListItem‬ونقوم بإسناده إلى الوظيفة ‪Add‬ثم نستخدم هذا المتغير في‬
‫إضافة بيانات لألعمدة األخرى كما يلي‬

‫‪Dim Lst As ListItem‬‬


‫)"‪Set Lst = ListView1.ListItems.Add(, , "NapsTer‬‬
‫‪"Lst.ListSubItems.Add , , "123‬‬
‫‪Lst.ListSubItems.Add , , "Sqebd.com‬‬

‫"‬

‫● كما هو الحال بالنسبة للخاصية ‪ ListItems‬فإن الخاصية ‪ ListSubItems‬لها نفس الوظائف‬


‫فالصيغة العامة لوظيفة ‪ Add‬هي كما يلي‬

‫‪Lst.ListSubItems.Add Index, Key, Text, ReportIcon, ToolTipText‬‬

‫كما تالحظ في البارميترات فالوظيفة ‪ Add‬للخاصية ‪ ListSubItems‬هي تقريبا نفسها البارميترات‬


‫للوظيفة ‪ Add‬للخاصية ‪ ListItems‬ف ‪ ReportIcon‬هي نفسها ‪ SmallIcon‬والباراميتر‬
‫‪ ToolTipText‬فهو للنافذة الصغير المنبثقة عند وضع مؤشر الفأرة على ذلك العنصر‪.‬‬

‫‪)7‬نأتي اآلن لنضيف بيانات داخل أداة ال ‪ ListView‬كما في الكود التالي‬

‫‪)(Private Sub Form_Load‬‬


‫‪ListView1.View = lvwReport‬‬

‫‪"ListView1.ColumnHeaders.Add , , "Name‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Number‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Address‬‬

‫‪Dim Lst As ListItem‬‬

‫‪Dim i As Integer‬‬

‫‪For i = 0 To 4‬‬
‫)"‪Set Lst = ListView1.ListItems.Add(, , "Sniper.ps‬‬
‫‪Lst.ListSubItems.Add , , i‬‬
‫‪"Lst.ListSubItems.Add , , "Palestine‬‬
‫‪Next i‬‬
‫‪End Sub‬‬
‫أنقر للتوسيع‪...‬‬

‫ليصبح الشكل كما في الشكل التالي‬

‫تالحظ في الصورة عند تحديد صف يتم تحديد العنصر األول فقط في هذا الصف ولتحديد جميع‬
‫العناصر داخل أداة ال ‪ ListView‬نقوم بجعل خاصية ‪. FullRowSelect = True‬‬

‫حمل المثال التوضيحي من هنا‬

‫هناك أيض ًا خصائص أخرى ألداة ال ‪ ListView‬يمكنك استخدامها أيض ًا كما يلي‬

‫●‪ : Appearance ‬وهي لتحديد مظهر أداة ال ‪ ListView‬ولها قيمتين وهما ‪ ccFlat‬لجعل أداة ال‬
‫‪ ListView‬مسطحة و ‪ cc3D‬وهي لجعل أداة ال‪ ListView‬ثالثية األبعاد‪.‬‬
‫●‪ : BackColor ‬لتغيير لون خلفية أداة ال ‪. ListView‬‬
‫●‪ : FlatScrollBar ‬لتحديد مظهر أشرطة التمرير ألداة ال ‪ ListView‬وهي خاصية ذات قيمة‬
‫منطقية ‪.‬‬
‫●‪ : ForeColor ‬لتحديد لون الخط ‪.‬‬
‫●‪ : GridLines ‬وهي خاصية لجعل أداة ال ‪ ListView‬كالشبكة وهي خاصية ذات قيمة منطقية‪.‬‬
‫●‪ : HideColumnHeaders ‬وهي إلخفاء العناوين الرأسية وهي خاصية ذات قيمة منطقية‪.‬‬
‫●‪ :  HotTracking ‬وهي خاصية لتتبع شريط التحديد وهي خاصية ذات قيمة منطقية‪.‬‬
‫●‪ :  HoverSelection ‬وهذه الخاصية عند تفعيلها يتم وضع شريط التحديد على الصف الذي يمر‬
‫عليه مؤشر الفأرة‪.‬‬
‫●‪ :  MultiSelect ‬وهذه الخاصية تستخدم لتحديد أكثر من صف في نفس الوقت وهي خاصية‬
‫منطقية‪.‬‬
‫●‪ : Picture ‬وهي لوضع خلفية ألداة ال ‪. ListView‬‬
‫●‪ : PictureAlignment ‬وهي لتحديد محاذاة خلفية ال ‪. ListView‬‬
‫●‪ : Sorted ‬يتم ضبط هذه الخاصية لتساوي ‪ True‬لترتيب العناصر‪.‬‬
‫●‪ :  SortKey ‬تستخدم هذه الخاصية لتحديد رقم العمود الذي نريد ترتيب البيانات بواسطته حيث رقم‬
‫أو عمود هو ‪0‬‬
‫●‪ :  SortOrder ‬تستخدم هذه الخاصية لتحديد نمط ترتيب العناصر داخل ال ‪ ListView‬ولها‬
‫قيمتين وهما ‪ lvwAscending‬لترتيب العناصر بشكل أبجدي تصاعدي ًا و ‪lvwDescending‬‬
‫لترتيب العناصر بشكل أبجدي تنازلي ًا ‪.‬‬

‫برمجة مثال لربط ال ‪ ListView‬بقاعدة البيانات‬

‫في البدء ننشئ قاعدة بيانات وننشئ داخلها جدول اسمه ‪ Table1‬يحتوي أربع حقول وهي ‪ID ,‬‬
‫‪ Name , Number , Address‬ثم ضعها في مجلد المشروع ‪.‬‬

‫سنستخدم مكتبة ‪ Ado‬في ربط قاعدة البيانات اذهب إلى قائمة ‪ Project‬اختر ‪ Reference‬ثم اختر‬
‫مكتبة ‪Microsoft ActiveX Object‬‬

‫سنعرف في ال‪ General‬المتغيرين التاليين‬

‫‪Dim DB As ADODB.Connection‬‬
‫‪Dim RS As ADODB.Recordset‬‬

‫حيث سنستخدم المتغير ‪ DB‬في االتصال بقاعدة البيانات والمتغير ‪ RS‬في التعامل مع الجداول‬
‫والحقول ‪ .‬في حدث ال ‪ Form_Load‬استخدم‪ ‬الكود‪ ‬التالي في قاعدة البيانات‬

‫‪Set DB = New ADODB.Connection‬‬


‫‪Set RS = New ADODB.Recordset‬‬
‫‪"DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path + "\Sniper.mdb‬‬
‫‪DB.CursorLocation = adUseClient‬‬

‫ثم سنقوم بتحديد‪ Ž‬أسلوب العرض‪ ‬للبيانات‪ ‬وجعل شريط‪ Ž‬التحديد يحدد جميع العناصر في الصف كما في الكود التالي‬

‫‪ListView1.View = lvwReport‬‬
‫‪ListView1.FullRowSelect = True‬‬

‫ثم سنضيف‪ ‬ثالثة‪ ‬عناوين رأسية كما يلي‬

‫‪"ListView1.ColumnHeaders.Add , , "Name‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Number‬‬
‫‪"ListView1.ColumnHeaders.Add , , "Address‬‬
‫نعرف متغيّر من نوع‪ ListItem ‬كما يلي‬
‫‪Dim Lst As ListItem‬‬

‫‪If RS.State = adStateOpen Then RS.Close‬‬

‫إغالق المتغير ‪ RS‬إذا كان مفتوح ًا‬

‫‪RS.Open "Select * From Table1", DB, adOpenDynamic, adLockOptimistic‬‬

‫جملة االستعالم لجلب جميع البيانات الموجودة داخل ال ‪Table1‬‬

‫‪Do While Not RS.EOF‬‬


‫)‪Set Lst = ListView1.ListItems.Add(, , RS!Name‬‬
‫‪Lst.ListSubItems.Add , , RS!Number‬‬
‫‪Lst.ListSubItems.Add , , RS!Address‬‬
‫‪RS.MoveNext‬‬
‫‪Loop‬‬

‫نستخدم هنا حلقة ‪ Do While .. Loop‬لملئ أداة ال ‪ ListView‬حتى نصل للسجل األخير في‬
‫قاعدة البيانات‬
‫نسند المتغير ‪ Lst‬للوظيفة ‪ Add‬التي تضيف حقل ‪ Name‬في السجل ألداة ال‪ , ListView‬ثم‬
‫نستخدم المتغير ‪ Lst‬في إضافة العمود الثاني (‪ )Number‬والعمود الثالث (‪)Address‬‬
‫ننتقل إلى السجل التالي ‪ ,‬ثم نستخدم ‪ Loop‬إلغالق الحلقة‪.‬‬
‫ويمكن االستغناء عن الوظيفة ‪ Add‬للمتغير ‪ Lst‬واستخدام الوظيفة ‪ SubItems‬ليصبح الكود كما‬
‫يلي‬
‫‪Do While Not RS.EOF‬‬
‫)‪Set Lst = ListView1.ListItems.Add(, , RS!Name‬‬
‫‪Lst.SubItems(1) = RS!Number‬‬
‫‪Lst.SubItems(2) = RS!Address‬‬
‫‪RS.MoveNext‬‬
‫‪Loop‬‬

‫صورة المثال بعد التشغيل‬

‫حمل المثال التوضيحي من هنا‬

‫مالحظات قد تهمك في حالة استخدام أداة ال ‪ ListView‬كأداة لعرض البيانات‬


‫● حذف العنصر المحدد يتم باستخدام الكود التالي‬

ListView1.ListItems.Remove ListView1.SelectedItem.Index

‫ باستخدام‬MultiSelect ‫ عند تفعيل خاصية‬ListView‫حذف جميع العناصر المحددة في أداة ال‬


‫الكود التالي‬

Dim i As Integer
For i = ListView1.ListItems.Count To 1 Step -1
If ListView1.ListItems(i).Selected = True Then ListView1.ListItems.Remove i
Next i

‫ لكن كما تالحظ فإننا نستخدم هنا الحلقة بالعكس وذلك‬For .. Next ‫حيث في هذا الكود نستخدم حلقة‬
‫ ألننا لو قمنا بحذف عنصر من بداية‬ListView‫حتى يتم حذف العناصر الصحيحة في أداة ال‬
. ‫العناصر فإن جميع مواقع العناصر األخر ستتغير‬

‫ كما في الكود التالي‬ListView ‫● عرض بيانات الصف المحدد في أداة ال‬

)(Private Sub ListView1_Click


Text1.Text = ListView1.SelectedItem.Text
Text2.Text = ListView1.SelectedItem.SubItems(1)
Text3.Text = ListView1.SelectedItem.SubItems(2)
End Sub

Text1 ‫ فيتم عرض العنصر األول في أداة‬ListView1_Click ‫حيث استخدمنا هذا الكود في حدث‬
‫ وباقي العناصر في الصف نستخدم الخاصية‬Text ‫طبع ًا ألول عنصر في الصف نستخدم خاصية‬
. SubItems

‫ سنستخدم هنا دالة‬: ListView ‫ لألعمدة الموجود في أداة ال‬AutoSize ‫● عمل‬


‫ سنكون هنا دالة بسيطة الستخدامها في حالة كان لدينا‬Api ‫ وهي إحدى دوال ال‬SendMessage
‫ كما يلي‬ListView ‫أكثر من‬

‫ وبعض ثوابتها‬SendMessage ‫هذه هي دالة‬

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long,
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const LVM_FIRST = &H1000
Private Const LVM_SETCOLUMNWIDTH = (LVM_FIRST + 30)
Private Const LVSCW_AUTOSIZE = -1
Private Const LVSCW_AUTOSIZE_USEHEADER = -2

‫وهذه هي الدالة التي قمنا بتصميمها‬


‫)‪Public Function AutoSizeListView(xListView As ListView‬‬
‫‪Dim i As Integer‬‬
‫‪For i = 0 To xListView.ColumnHeaders.Count - 1‬‬
‫‪SendMessage xListView.hWnd, LVM_SETCOLUMNWIDTH, i, LVSCW_AUTOSIZE_USEHEADER‬‬
‫‪Next i‬‬
‫‪End Function‬‬

‫وفي حالة أردنا استخدام هذه الدالة نقوم فقط باستدعائها ألداة ال ‪ ListView‬التي نريد أن نعمل لها‬
‫‪. AutoSize‬‬

‫كما يلي‬

‫‪AutoSizeListView ListView1‬‬

‫ثاني ًا ‪ :‬استخدام أداة ال ‪ ListView‬عندما تكون خاصية ‪View = lvwIcon‬‬

‫طبع ًا عندما يكون أسلوب العرض ‪ lvwIcon‬فلن يختلف عن أسلوب العرض ‪ lvwReport‬من حيث‬
‫إضافة العناصر لكن هنا ال يوجد أعمدة وال ‪( ColumnHeaders‬عنوانين رأسية) وهناك خصائص‬
‫أخرى ال نستخدمها في هذه الحالة وسيكون شكل ال ‪ ListView‬كما في الشكل التالي‬

‫لكن في هذه الحالة سنستخدم الباراميتر ‪ Key‬للوظيفة ‪ Add‬لنتمكن من التعامل بسهولة مع كل‬
‫عنصر‪ .‬سنضيف ‪ 5‬عناصر ‪ ,‬سنبدأ اآلن في برمجة المثال سنحتاج في هذا المثال أداة ‪ImageList‬‬
‫تحتوي على بعض الصور‬

‫في حدث ‪ Form_Load‬الكود التالي‬

‫‪ListView1.View = lvwIcon‬‬

‫لتحديد أسلوب عرض األداة وهو ‪lvwIcon‬‬

‫‪ListView1.Icons = ImageList1‬‬

‫لتحديد مصدر اإليقونات‪ Ž‬التي سيتم‪ Ž‬استخدامها‪ Ž‬في ال‪ListView‬‬


‫ثم الكود التالي‬

‫‪Dim i As Integer‬‬
‫‪For i = 1 To 5‬‬
‫‪ListView1.ListItems.Add , "M" & i, "Sniper" & i, i‬‬
‫‪Next i‬‬

‫قمنا بتعرف المتغير ‪ i‬الستخدامه في حلقة ‪For .. Next‬‬


‫ثم قمنا بتحديد عدد دورات الحلقة ‪ For .. Next‬وهي من ‪ 1‬إلى ‪5‬‬
‫ثم سيتم إضافة عنصر في دورة كما هو مالحظ من الكود حيث سيكون ال ‪ Key‬للعنصر األول هو‬
‫‪ M1‬العنصر الثاني هو ‪ ... M2‬وهكذا ‪ .‬مع مالحظ أن ال ‪ Key‬ال يجب أن يتكرر عند إضافة‬
‫العناصر ‪ ,‬وبالنسبة لباراميتر األيقونة يتم تحديده بكتابة رقم ال ‪ Index‬للصورة المراد إضافتها‬
‫للعنصر المضاف مع مالحظ أن الباراميترالذي يتم إضافة رقم ال ‪ Index‬هو الباراميتر ‪ Icon‬وليس‬
‫الباراميتر ‪. SmallIcon‬‬
‫ثم قمنا بإغالق حلقة ‪. Next‬‬

‫إذن الكود النهائي سيكون كما يلي‬


‫‪End Sub‬‬

‫‪)(Private Sub Form_Load‬‬

‫‪ListView1.View = lvwIcon‬‬

‫‪ListView1.Icons = ImageList1‬‬

‫‪Dim i As Integer‬‬
‫‪For i = 1 To 5‬‬
‫‪ListView1.ListItems.Add , "M" & i, "Sniper" & i, i‬‬
‫‪Next i‬‬

‫اآلن انتهينا من تصميم المثال ‪ ..‬طيب السؤال اآلن كيف سنقوم بربط كل أيقونة بكود معيّن عن النقر‬
‫‪ DblClick‬مثالً ؟ ‪ ..‬الجواب طبع ًا باستخدام ال ‪ Key‬لكل عنصر ‪ ..‬تابع معي ‪..‬‬

‫سنقوم باستخدام جملة ‪ Select Case‬في حدث ‪ ListView1_DblClick‬كما في الكود التالي‬

‫‪)(Private Sub ListView1_DblClick‬‬


‫‪Select Case ListView1.SelectedItem.Key‬‬
‫‪"Case "M1‬‬
‫‪Form2.Show‬‬

‫‪"Case "M2‬‬
‫‪Form3.Show‬‬
‫‪"Case "M3‬‬
‫‪"MsgBox "Programmed By Sniper.ps‬‬

‫‪"Case "M4‬‬
‫‪"MsgBox "www.vb4arab.com‬‬

‫‪"Case "M5‬‬
‫‪End‬‬

‫‪End Select‬‬
‫‪End Sub‬‬
‫أنقر للتوسيع‪...‬‬

‫حيث في هذا الكود نستخدم جملة بناء على قيمة ال‪ Key‬للعنصر المحدد لذلك استخدمنا الخاصية‬
‫‪SelectedItem‬‬
‫ثم قلنا أنه في حالة كان ال ‪ Key‬للعنصر قيمته هي ‪ M1‬فسيتم إظهار ال‪ Form2‬وبنفس الطريقة‬
‫لجميع العناصر‪.‬‬

‫حمل المثال التوضيحي من هنا‬

‫ثالث ًا ‪ :‬استخدام أداة ال ‪ ListView‬عندما تكون خاصية ‪ View = lvwSmallIcon‬و ‪lvwList‬‬

‫في هاتين الحالتين لن تختلفا عن الحالة ‪ lvwIcon‬إال في نمط عرض األيقونات حيث في حالة‬
‫‪ lvwSmallIcon‬ستظهر اإليقونات‬

‫وفي حالة ‪ lvwList‬ستظهر اإليقونات‬


This subroutine prints the contents of a ListView control in report view. The parameter
Lines specifies the number of rows that will be printed, beginning with the first row. If
LV.ListCount is less than the parameter Lines, then all the rows will be printed. The
columns in the LV control are tabbed to be uniformly distributed across the page.

Public Sub PrintListView(LV As ListView, Lines%)


    Dim i%, LVWidth%, NewTab%, j%
    Dim itmX As ListItem
    Dim LineCount%
  
    LVWidth = 0
    For i = 1 To LV.ColumnHeaders.Count
        LVWidth = LVWidth + LV.ColumnHeaders(i).Width
    Next
    NewTab = 0
    For i = 1 To LV.ColumnHeaders.Count
        NewTab = NewTab + CInt(LV.ColumnHeaders(i).Width * Printer.ScaleWidth /
LVWidth)
        Printer.Print LV.ColumnHeaders(i).Text;
        Printer.CurrentX = NewTab
    Next
    Printer.Print
    If Lines < LV.ListItems.Count And Lines <> 0 Then
        LineCount = Lines
    Else
        LineCount = LV.ListItems.Count
    End If
    For i = 1 To LineCount
        NewTab = 0
        Set itmX = LV.ListItems(i)
        Printer.Print itmX.Text;
        For j = 1 To LV.ColumnHeaders.Count - 1
            NewTab = NewTab + CInt(LV.ColumnHeaders(j).Width * Printer.ScaleWidth /
LVWidth)
            Printer.CurrentX = NewTab
            Printer.Print itmX.SubItems(j);
        Next
        Printer.Print
    Next
 
End Sub
‫طريقة اخرى‬
Hi James;

the following is a function I just hammered out (rather quickly so you may need to debug) I
took bits from another function I wrote a while back that I know runs fine so this should work
no problem:

Code:
Public Function getListView(ByVal lView as ListView) as ADODB.Recordset

Dim sudoCol as String


Dim i as Integer
Dim j as Integer
Dim rsResult As ADODB.Recordset
set rsResult = New ADODB.Recordset    
    
    
For i = 1 To lView.ColumnHeaders.Count
    If lView.ColumnHeaders(i).Text = "" Then
        rsResult.Fields.Append sudoCol & i, adLongVarWChar, 1
    Else
        rsResult.Fields.Append lView.ColumnHeaders(i).Text, adLongVarWChar, 1
    End If
Next i

For i = 1 To lView.ListItems.Count
     rsResult.AddNew
     For j = 0 To lView.ColumnHeaders.Count - 1
         If j = 0 Then 'grab the ListItem text
              rsResult.Fields(j).Value = lView.ListItems(i).Text
         Else 'grab ListSubItem text
               rsResult.Fields(j).Value = lView.ListItems(i).ListSubItems(j).Text
         End If
                                          
     Next j
     rsResult.Update
Next i
if not rsREsult.BOF and not rsResult.EOF then
    rsResult.MoveFirst
end if

set getListView = rsResult

End Function

I checked some of our apps that use Crystal Reports....the reports use a mthod
SetDataSource....

Code:
Report.Database.SetDataSource rsQuery 'valid recordset

so I see no reason why you would not be able to do:

Code:
Report.Database.SetDataSource getListView(yourListView)

hope that helps - all the best!


The print listview code follows:
Code:
Private Function FittedText(ByVal txt As String, ByVal wid As Single) As String
Do While Printer.TextWidth(txt) > wid
txt = Left$(txt, Len(txt) - 1)
Loop
FittedText = txt
End Function

Private Sub PrintListView(lvw As ListView)


Const MARGIN = 30
Const COL_MARGIN = 120

Dim ymin As Single


Dim ymax As Single
Dim xmin As Single
Dim xmax As Single
Dim num_cols As Integer
Dim column_header As ColumnHeader
Dim list_item As ListItem
Dim i As Integer
Dim num_subitems As Integer
Dim col_wid() As Single
Dim X As Single
Dim Y As Single
Dim line_hgt As Single

xmin = Printer.CurrentX
ymin = Printer.CurrentY

' ******************
' Get column widths.
ReDim col_wid(1 To lstMeritve.SelCount + 1)

' Check the column headers.


For i = 1 To lstMeritve.SelCount + 1
col_wid(i) = Printer.TextWidth(lvw.ColumnHeaders(i).Text)
Next i

' Check the items.


num_subitems = lstMeritve.SelCount
For Each list_item In lvw.ListItems
' Check the item.
If col_wid(1) < Printer.TextWidth(list_item.Text) Then _
col_wid(1) = Printer.TextWidth(list_item.Text)

' Check the subitems.


For i = 1 To num_subitems
If col_wid(i + 1) < Printer.TextWidth(list_item.SubItems(i)) Then _
col_wid(i + 1) = Printer.TextWidth(list_item.SubItems(i))
Next i
Next list_item

' Add a column margin.


For i = 1 To lstMeritve.SelCount + 1
col_wid(i) = col_wid(i) + COL_MARGIN
Next i

' *************************
' Print the column headers.
CommonDialog1.ShowPrinter
Printer.CurrentY = ymin + MARGIN
Printer.CurrentX = xmin + MARGIN
X = xmin + MARGIN
For i = 1 To lstMeritve.SelCount + 1
Printer.CurrentX = X
Printer.Print FittedText( _
lvw.ColumnHeaders(i).Text, col_wid(i));
X = X + col_wid(i)
Next i
xmax = X + MARGIN

Printer.Print
line_hgt = Printer.TextHeight("X")
Y = Printer.CurrentY + line_hgt / 2
Printer.Line (xmin, Y)-(xmax, Y)
Y = Y + line_hgt / 2

' Print the rows.


num_subitems = lstMeritve.SelCount
For Each list_item In lvw.ListItems
X = xmin + MARGIN

' Print the item.


Printer.CurrentX = X
Printer.CurrentY = Y
Printer.Print FittedText( _
list_item.Text, col_wid(1));
X = X + col_wid(1)

' Print the subitems.


For i = 1 To num_subitems
Printer.CurrentX = X
Printer.Print FittedText( _
list_item.SubItems(i), col_wid(i + 1));
X = X + col_wid(i + 1)
Next i

Y = Y + line_hgt * 1.5
Next list_item
ymax = Y

' Draw lines around it all.


Printer.Line (xmin, ymin)-(xmax, ymax), , B

X = xmin + MARGIN / 2
For i = 1 To lstMeritve.SelCount
X = X + col_wid(i)
Printer.Line (X, ymin)-(X, ymax)
Next i
End Sub
Private Sub btnNatisni_Click()
Printer.CurrentX = 120
Printer.CurrentY = 220

PrintListView lvwList

Printer.EndDoc
End Sub
‫وكيفية استخدامها ‪ ListView‬شرح تفصيلي ألداة ال‬

‫قررت كتابة مقال ‪ ListView‬بعد مشاهدتي للعديد من األسئلة واالستفسارات حول أداة ال‬
‫وسيتم خالل هذا المثال طرح أمثلة لتقريب األفكار ‪ ListView‬بشكل تفصيلي عن أداة ال‬
‫إلى ذهن القارئ ‪ ,‬وأنوه في بداية الشرح أنني سأستخدم الكود فقط في التعامل مع أداة ال‬
‫‪ :-‬ولن استخدم الخصائص مطلقاً‪ .. i‬لنبدأ على بركة هللا ‪ListView‬‬

‫ثم ‪ Components‬اختر ‪ Project‬في البدء سنتعلم كيف تتم إضافة األداة ‪ ,‬من قائمة‬
‫‪ :‬كما في الصور التالية ‪ Microsoft Windows Common Controls 6.0‬اختر‬

‫‪ Form‬صورة األداة بعد إضافتها على ال‬

‫‪ ListView‬استخدامات أداة ال‬


‫كأداة لعرض البيانات ‪ ListView‬أوالً ‪ :‬استخدام أداة ال‬

‫هو استخدامها كأداة لعرض البيانات مثل أداة ‪ ListView‬من استخدامات أداة ال‬
‫‪.‬المعروفة ‪ MSFlexGrid‬وأداة ‪DataGrid‬‬

‫على الخيار ‪ View‬كأداة لعرض البيانات يجب ضبط خاصية ‪ ListView‬الستخدام أداة ال‬
‫‪ ListView‬تستخدم لتحديد أسلوب العرض في أداة ال ‪ View‬طبعا ً خاصية‪lvwReport ,‬‬
‫وهناك خيارات أخرى ألسلوب العرض وهذه الخيارات هي كما يلي‬

‫كما في الصورة ‪ ListView‬وهي لعرض أيقونات كبيرة داخل أداة ال ‪■ lvwIcon :‬‬


‫التالية‬

‫كما في الصورة التالية ‪ ListView‬وهي البيانات كقائمة داخل أداة ال ‪■ lvwList :‬‬


‫وهي تشبه كثيراً ‪ ListView‬وهي لعرض البيانات كتقرير داخل أداة ال ‪■ lvwReport :‬‬
‫وأداة ‪ DataGrid‬األدوات المعروفة لعرض البيانات من قاعدة البيانات مثل أداة‬
‫الخ‪ .‬وهي أكثر الخيارات المستخدمة من قبل المبرمجين كما في ‪MSFlexGrid ...‬‬
‫الصورة التالية‬

‫كما في ‪ ListView‬وهي لعرض أيقونات صغيرة داخل أداة ال ‪■ lvwSmallIcon :‬‬


‫الصورة التالية‬

‫تصميم مثال‬

‫سأبدأ اآلن بمثال بسيط ال يعتمد على قاعدة البيانات تابع معي ●‬

‫‪Form‬إلى ال ‪ ListView‬أضف أداة)‪1‬‬

‫واكتب الكود التالي ‪ ,‬وهذا الكود كما شرحنا سابقا ً ‪ Form‬لل ‪ Load‬اذهب إلى حدث)‪2‬‬
‫‪ ListView .‬لتحديد أسلوب العرض في أداة ال‬

‫)(‪Private Sub Form_Load‬‬


‫‪ListView1.View = lvwReport‬‬

‫‪End Sub‬‬

‫في هذه الحالة‪ i‬يجب إضافة ‪ ListView‬لنفترض أن نريد إضافة ثالثة أعمدة داخل أداة ال)‪3‬‬
‫ألداة ال ‪ ColumnHeaders‬عنوان رأسي لكل عمود وهذا يتم باستخدام خاصية‬
‫‪ListView‬‬

‫سأشرح خاصية ‪ ListView‬قبل إضافة العناوين الرأسية ألداة ال ◄‬


‫لهذه الخاصية خمس وظائف وهي كالتالي ‪ColumnHeaders‬‬

‫ولهذه ‪ ListView‬وهي الوظيفة تستخدم إلضافة عنوان رأسي داخل أداة ال ‪♦ Add :‬‬
‫الخاصية ست باراميترات وهي كما يلي‬
‫‪ListView1.ColumnHeaders.Add Index, Key, Text, Width,‬‬
‫‪Alignment, Icon‬‬

‫حيث‬

‫هي الفهرس لهذا العنوان الرأسي ‪▪ Index :‬‬

‫المفتاح لهذا العنوان الرأسي ‪▪ Key :‬‬

‫النص الذي سيظهر عليه وهو الباراميتير الوحيد الذي سأستخدمه في إضافة ‪▪ Text:‬‬
‫العناوين الرأسية‬

‫لتحديد عرض العنوان الرأسي ‪▪ Width:‬‬

‫لتحديد اتجاه محاذاة النص على العنوان الرأسي ولهذه الخاصية ثالثة قيم ‪▪ Alignment :‬‬
‫‪  Quote‬‬
‫‪lvwColumnLeft = 0‬‬

‫‪lvwColumnRight = 1‬‬

‫‪lvwColumnCenter = 2‬‬

‫أي ‪ Alignment = 0‬تكون قيمة ال ‪ ListView‬مع مالحظة أن العمود األول في أداة ال‬
‫النص محاذاة النص دائما ً له تكون على اليسار‬

‫وهي خاصية إلضافة أيقونات للعناوين الرأسية‪.‬مع مراعاة ضبط خاصية ‪▪ Icon:‬‬
‫التي يتم إدراج الصور منها كما في ‪ ImageList‬باسم أداة ال ‪ColumnHeaderIcons‬‬
‫الكود التالي‬
‫‪  Quote‬‬
‫‪ListView1.ColumnHeaderIcons = ImageList1‬‬

‫وتستخدم هذه الوظيفة لمسح جميع العناوين الرأسية الموجودة داخل أداة ال ‪♦ Clear :‬‬
‫كما في الكود التالي ‪ListView‬‬
‫‪  Quote‬‬
‫‪ListView1.ColumnHeaders.Clear‬‬

‫وتستخدم هذه الوظيفة لجلب عدد العناوين الرأسية الموجودة داخل أداة ال ‪♦ Count :‬‬
‫كما في الكود التالي مثالً ‪ListView‬‬
‫‪  Quote‬‬
‫‪MsgBox ListView1.ColumnHeaders.Count‬‬

‫‪ Index‬وتستخدم هذه الوظيفة لحذف عنوان رأسي معين بناء على قيمة ال ‪♦ Remove :‬‬
‫لهذا العنوان كما في الكود التالي‬
‫‪  Quote‬‬
‫‪ListView1.ColumnHeaders.Remove Index‬‬

‫ألول عنوان رأسي في هذه الحالة‪ 1 = i‬وباقي العناوين بنفس الطريقة ‪ Index‬حيث قيمة ال‬
‫بمقدار ‪ 1‬للعنوان الرأسي الذي يليه ‪ Index‬مع زيادة ال‬

‫فقط هناك وظيفتين ‪ Add‬وظائف هذه األداة هي نفسها باراميترات الوظيفة ‪♦ Item :‬‬
‫جديدتين وهما‬

‫وهي لتحديد رقم العنوان الرأسي ‪▪ Position :‬‬

‫للعناصر الموجود أسفل هذا العنوان ‪ Index‬وهي لتحديد رقم ال ‪▪ SubItemIndex :‬‬


‫الرأسي‬

‫كما قلنا سابقا ً نقوم بتحديد ‪ ColumnHeaders‬بعد أن شرحنا وظائف الخاصية )‪4‬‬
‫كما يلي ‪ View‬من خالل الخاصية ‪ ListView‬أسلوب العرض في أداة ال‬

‫‪ListView1.View = lvwReport‬‬

‫‪End Sub‬‬
‫)(‪Private Sub Form_Load‬‬

‫نقوم بإضافة ثالث عنوانين رأسية ليصبح الكود كما يلي )‪4‬‬

‫‪ListView1.View = lvwReport‬‬

‫"‪ListView1.ColumnHeaders.Add , , "Name‬‬
‫"‪ListView1.ColumnHeaders.Add , , "Number‬‬
‫"‪ListView1.ColumnHeaders.Add , , "Address‬‬

‫‪End Sub‬‬
‫)(‪Private Sub Form_Load‬‬
‫ليصبح كما في الصورة التالية ‪ ListView‬قم بتشغيل المثال ستالحظ تغير شكل ال )‪5‬‬

‫حمل المثال التوضيحي من هنا‬

‫إلضافة عناصر داخل أداة ال ‪ ListView ,‬نأتي اآلن إلضافة بيانات داخل أداة ال)‪6‬‬
‫ولهذه الخاصية خمس وظائف أيضا ً وهي كالتالي ‪ ListItems‬نستخدم خاصية ‪ListView‬‬

‫ولهذه الخاصية ‪ ListView‬وهي الوظيفة تستخدم إلضافة بيانات داخل أداة ال ‪♦ Add :‬‬
‫خمس باراميترات وهي كما يلي‬
‫‪  Quote‬‬
‫‪ListView1.ListItems.Add Index, Key, Text, Icon, SmallIcon‬‬

‫حيث‬

‫‪.‬هي الفهرس لهذا العنصر المضاف ‪▪ Index :‬‬

‫‪ .‬المفتاح لهذا العنوان العنصر ‪▪ Key :‬‬

‫‪ .‬النص الذي سيظهر لهذا العنصر ‪▪ Text:‬‬

‫باسم ‪Icons‬وهي خاصية إلضافة أيقونات للعناصر ‪,‬مع مراعاة ضبط خاصية ‪▪ Icon :‬‬
‫التي يتم إدراج الصور منها كما في الكود التالي وهذه الخاصية تستخدم ‪ ImageList‬أداة ال‬
‫‪ = lvwIcon .‬عندما يكون أسلوب العرض‬
‫‪  Quote‬‬
‫‪ListView1. Icons= ImageList1‬‬

‫‪Icons‬وهي خاصية إلضافة أيقونات للعناصر ‪,‬مع مراعاة ضبط خاصية ‪▪ SmallIcon :‬‬
‫التي يتم إدراج الصور منها كما في الكود التالي وهذه هي ‪ ImageList‬باسم أداة ال‬
‫‪.‬الخاصية التي سنستخدمها في هذه الحالة‬

‫‪ListView‬وتستخدم لحذف محتويات ال ‪♦ Clear :‬‬

‫‪ ListView‬وتستخدم لمعرفة عدد الصفوف داخل أداة ال ‪♦ Count :‬‬

‫مع العلم أن قيمة ال ‪ ListView‬وتستخدم لحذف صف معين في أداة ال ‪♦ Remove :‬‬


‫ألول سطر = ‪Index 1‬‬
‫ولها العديد من الخصائص وأهم هذه الخصائص هي ‪♦ Item :‬‬

‫‪ False‬أو ‪ True‬وهي لجعل الخط غامق وهي خاصية منطقية ترجع قيمة إما ‪▪ Bold :‬‬

‫‪ ListView‬وهي خاصية لوضع عالمة صح أمام العنصر داخل أداة ال ‪▪ Checked :‬‬


‫‪ ListView‬ألداة ال ‪ Checkboxes = True‬طبعا ً في هذه الحالة‪ i‬يجب ضبط خاصية‬
‫كما في الكود التالي‬
‫‪  Quote‬‬
‫‪ListView1.Checkboxes = True‬‬

‫‪ ListView‬لتغيير لون الخط لعنصر معين داخل أداة ال ‪▪ ForeColor :‬‬

‫‪ False‬أو ‪ True‬لتحديد صف معيّن وهي خاصية منطقية ترجع قيمة إما ‪▪ Selected :‬‬

‫كلما أضفنا عنصر بالصيغة الموجودة في األعلى يتم إضافته في ‪ Add‬طبعا ً في وظيفة ●‬
‫‪ ..‬نفس العمود ‪ ..‬إذن كيف سنضيف بيانات في األعمدة األخرى ؟ تابع معي‬

‫ثم نستخدم هذا‪ Add‬ونقوم بإسناده إلى الوظيفة ‪ ListItem‬نقوم بتعريف متغير من نوع‬
‫المتغير في إضافة بيانات لألعمدة األخرى كما يلي‬

‫)"‪Set Lst = ListView1.ListItems.Add(, , "Sniper.ps‬‬


‫"‪Lst.ListSubItems.Add , , "123‬‬
‫"‪Lst.ListSubItems.Add , , "Palestine‬‬
‫‪Dim Lst As ListItem‬‬

‫لها نفس ‪ ListSubItems‬فإن الخاصية ‪ ListItems‬كما هو الحال بالنسبة للخاصية ●‬


‫هي كما يلي ‪ Add‬الوظائف فالصيغة العامة لوظيفة‬
‫‪  Quote‬‬
‫‪Lst.ListSubItems.Add Index, Key, Text, ReportIcon, ToolTipText‬‬

‫هي تقريبا نفسها ‪ ListSubItems‬للخاصية ‪ Add‬كما تالحظ في البارميترات فالوظيفة‬


‫هي نفسها ‪ ReportIcon‬ف ‪ ListItems‬للخاصية ‪ Add‬البارميترات للوظيفة‬
‫فهو للنافذة الصغير المنبثقة عند وضع مؤشر ‪ ToolTipText‬والباراميتر ‪SmallIcon‬‬
‫‪.‬الفأرة‪ i‬على ذلك العنصر‬

‫كما في الكود التالي ‪ ListView‬نأتي اآلن لنضيف بيانات داخل أداة ال)‪7‬‬
ListView1.View = lvwReport

ListView1.ColumnHeaders.Add , , "Name"
ListView1.ColumnHeaders.Add , , "Number"
ListView1.ColumnHeaders.Add , , "Address"

Dim Lst As ListItem

Dim i As Integer

For i = 0 To 4
Set Lst = ListView1.ListItems.Add(, , "Sniper.ps")
Lst.ListSubItems.Add , , i
Lst.ListSubItems.Add , , "Palestine"
Next i
End Sub
Private Sub Form_Load()

‫ليصبح الشكل كما في الشكل التالي‬

‫تالحظ في الصورة عند تحديد صف يتم تحديد العنصر األول فقط في هذا الصف ولتحديد‬
‫ جميع العناصر داخل أداة ال‬ListView ‫ نقوم بجعل خاصية‬FullRowSelect = True
.
‫حمل المثال التوضيحي من هنا‬

‫ هناك أيضا ً خصائص أخرى ألداة ال‬ListView ‫يمكنك استخدامها أيضا ً كما يلي‬

● Appearance : ‫ وهي لتحديد مظهر أداة ال‬ListView ‫ ولها قيمتين وهما‬ccFlat


‫لجعل أداة ال‬ListView ‫ مسطحة و‬cc3D ‫وهي لجعل أداة ال‬ListView ‫ثالثية األبعاد‬.

● BackColor : ‫ لتغيير لون خلفية أداة ال‬ListView .


‫وهي خاصية ‪ ListView‬لتحديد مظهر أشرطة التمرير ألداة ال ‪● FlatScrollBar :‬‬
‫‪ .‬ذات قيمة منطقية‬

‫‪ .‬لتحديد لون الخط ‪● ForeColor :‬‬

‫كالشبكة وهي خاصية ذات قيمة ‪ ListView‬وهي خاصية لجعل أداة ال ‪● GridLines :‬‬
‫‪.‬منطقية‬

‫وهي إلخفاء العناوين الرأسية وهي خاصية ذات قيمة ‪● HideColumnHeaders :‬‬


‫‪.‬منطقية‬

‫‪.‬وهي خاصية لتتبع شريط التحديد وهي خاصية ذات قيمة منطقية ‪● HotTracking :‬‬

‫وهذه الخاصية عند تفعيلها يتم وضع شريط التحديد على الصف ‪● HoverSelection :‬‬
‫‪.‬الذي يمر عليه مؤشر الفأرة‪i‬‬

‫وهذه الخاصية تستخدم لتحديد أكثر من صف في نفس الوقت وهي ‪● MultiSelect :‬‬


‫‪.‬خاصية منطقية‬

‫‪ ListView .‬وهي لوضع خلفية ألداة ال ‪● Picture :‬‬

‫‪ ListView .‬وهي لتحديد محاذاة خلفية ال ‪● PictureAlignment :‬‬

‫‪.‬لترتيب العناصر ‪ True‬يتم ضبط هذه الخاصية لتساوي ‪● Sorted :‬‬

‫تستخدم هذه الخاصية لتحديد رقم العمود الذي نريد ترتيب البيانات بواسطته ‪● SortKey :‬‬
‫حيث رقم أو عمود هو ‪0‬‬

‫‪ ListView‬تستخدم هذه الخاصية لتحديد نمط ترتيب العناصر داخل ال ‪● SortOrder :‬‬


‫لترتيب العناصر بشكل أبجدي تصاعديا ً و ‪ lvwAscending‬ولها قيمتين وهما‬
‫‪ .‬لترتيب العناصر بشكل أبجدي تنازليا ً ‪lvwDescending‬‬
‫بقاعدة البيانات ‪ ListView‬برمجة مثال لربط ال‬

‫يحتوي أربع حقول وهي ‪ Table1‬في البدء ننشئ قاعدة بيانات وننشئ داخلها‪ i‬جدول اسمه‬
‫‪ .‬ثم ضعها في مجلد المشروع ‪ID , Name , Number , Address‬‬

‫اختر ‪ Project‬في ربط قاعدة البيانات اذهب إلى قائمة ‪ Ado‬سنستخدم مكتبة‬
‫كما في الصورة التالية ‪ Microsoft ActiveX Object‬ثم اختر مكتبة ‪Reference‬‬
‫سنعرف في ال‬General ‫المتغيرين التاليين‬

Dim RS As ADODB.Recordset
Dim DB As ADODB.Connection

‫ حيث سنستخدم المتغير‬DB ‫ في االتصال بقاعدة البيانات والمتغير‬RS ‫في التعامل مع‬
‫ في حدث ال‬. ‫ الجداول والحقول‬Form_Load ‫استخدم الكود التالي في قاعدة البيانات‬

Set RS = New ADODB.Recordset


DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
App.Path + "\Sniper.mdb"
DB.CursorLocation = adUseClient
Set DB = New ADODB.Connection

‫ثم سنقوم بتحديد أسلوب العرض للبيانات وجعل شريط التحديد يحدد جميع العناصر في‬
‫الصف كما في الكود التالي‬

ListView1.FullRowSelect = True
ListView1.View = lvwReport

‫ثم سنضيف ثالثة عناوين رأسية كما يلي‬

ListView1.ColumnHeaders.Add , , "Number"
ListView1.ColumnHeaders.Add , , "Address"
ListView1.ColumnHeaders.Add , , "Name"

‫ نعرف متغيّر من نوع‬ListItem ‫كما يلي‬


Dim Lst As ListItem
If RS.State = adStateOpen Then RS.Close

‫ إغالق المتغير‬RS ً ‫إذا كان مفتوحا‬


RS.Open "Select * From Table1", DB,
adOpenDynamic, adLockOptimistic

‫ جملة االستعالم لجلب جميع البيانات الموجودة داخل ال‬Table1

Do While Not RS.EOF


Set Lst = ListView1.ListItems.Add(, , RS!Name)
Lst.ListSubItems.Add , , RS!Number
Lst.ListSubItems.Add , , RS!Address
RS.MoveNext
Loop

‫ نستخدم هنا حلقة‬Do While .. Loop ‫ لملئ أداة ال‬ListView ‫حتى نصل للسجل األخير‬
‫في قاعدة البيانات‬

‫ نسند المتغير‬Lst ‫ للوظيفة‬Add ‫ التي تضيف حقل‬Name ‫في السجل ألداة‬


‫ال‬ListView , ‫ ثم نستخدم المتغير‬Lst ‫( في إضافة العمود الثاني‬Number) ‫والعمود‬
‫( الثالث‬Address)

‫ ثم نستخدم‬, ‫ ننتقل إلى السجل التالي‬Loop i‫إلغالق الحلقة‬.

‫ ويمكن االستغناء عن الوظيفة‬Add ‫ للمتغير‬Lst ‫ واستخدام الوظيفة‬SubItems ‫ليصبح‬


‫الكود كما يلي‬

Set Lst = ListView1.ListItems.Add(, , RS!Name)


Lst.SubItems(1) = RS!Number
Lst.SubItems(2) = RS!Address
RS.MoveNext
Loop
Do While Not RS.EOF

‫صورة المثال بعد التشغيل‬

‫حمل المثال التوضيحي من هنا‬


‫كأداة لعرض البيانات ‪ ListView‬مالحظات قد تهمك في حالة استخدام أداة ال‬

‫حذف العنصر المحدد يتم باستخدام الكود التالي ●‬


‫‪ListView1.ListItems.Remove‬‬
‫‪ListView1.SelectedItem.Index‬‬

‫‪ MultiSelect‬عند تفعيل خاصية ‪ListView‬حذف جميع العناصر المحددة في أداة ال ●‬


‫باستخدام الكود التالي‬
‫‪Dim i As Integer‬‬
‫‪For i = ListView1.ListItems.Count To 1 Step -1‬‬
‫‪If ListView1.ListItems(i).Selected = True Then‬‬
‫‪ListView1.ListItems.Remove i‬‬
‫‪Next i‬‬

‫لكن كما تالحظ فإننا نستخدم هنا الحلقة ‪ For .. Next‬حيث في هذا الكود نستخدم حلقة‬
‫ألننا لو قمنا بحذف ‪ListView‬بالعكس وذلك حتى يتم حذف العناصر الصحيحة في أداة ال‬
‫‪ .‬عنصر من بداية العناصر فإن جميع مواقع العناصر األخر ستتغير‬

‫كما في الكود التالي ‪ ListView‬عرض بيانات الصف المحدد في أداة ال ●‬


‫)(‪Private Sub ListView1_Click‬‬
‫‪Text1.Text = ListView1.SelectedItem.Text‬‬
‫)‪Text2.Text = ListView1.SelectedItem.SubItems(1‬‬
‫)‪Text3.Text = ListView1.SelectedItem.SubItems(2‬‬
‫‪End Sub‬‬

‫فيتم عرض العنصر األول في أداة ‪ ListView1_Click‬حيث استخدمنا هذا الكود في حدث‬
‫وباقي العناصر في الصف ‪ Text‬طبعا ً ألول عنصر في الصف نستخدم خاصية ‪Text1‬‬
‫‪ SubItems .‬نستخدم الخاصية‬

‫سنستخدم هنا دالة ‪ ListView :‬لألعمدة الموجود في أداة ال ‪ AutoSize‬عمل ●‬


‫سنكون هنا دالة بسيطة الستخدامها في حالة ‪ Api‬وهي إحدى دوال ال ‪SendMessage‬‬
‫كما يلي ‪ ListView‬كان لدينا أكثر من‬

‫وبعض ثوابتها ‪ SendMessage‬هذه هي دالة‬


Private Declare Function SendMessage Lib
"user32" Alias "SendMessageA" (ByVal hWnd As
Long, ByVal wMsg As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
Private Const LVM_FIRST = &H1000
Private Const LVM_SETCOLUMNWIDTH = (LVM_FIRST +
30)
Private Const LVSCW_AUTOSIZE = -1
Private Const LVSCW_AUTOSIZE_USEHEADER = -2

‫وهذه هي الدالة التي قمنا بتصميمها‬


Public Function AutoSizeListView(xListView As
ListView)
Dim i As Integer
For i = 0 To xListView.ColumnHeaders.Count - 1
SendMessage xListView.hWnd, LVM_SETCOLUMNWIDTH,
i, LVSCW_AUTOSIZE_USEHEADER
Next i
End Function

‫ وفي حالة أردنا استخدام هذه الدالة نقوم فقط باستدعائها ألداة ال‬ListView ‫التي نريد أن‬
‫ نعمل لها‬AutoSize .

‫كما يلي‬
AutoSizeListView ListView1
‫ استخدام أداة ال‬: ً ‫ ثانيا‬ListView ‫ عندما تكون خاصية‬View = lvwIcon

‫ طبعا ً عندما يكون أسلوب العرض‬lvwIcon ‫ فلن يختلف عن أسلوب العرض‬lvwReport


‫ من حيث إضافة العناصر لكن هنا ال يوجد أعمدة وال‬ColumnHeaders (‫عنوانين‬
‫ وهناك خصائص أخرى ال نستخدمها في هذه الحالة وسيكون شكل ال )رأسية‬ListView
‫كما في الشكل التالي‬
‫لنتمكن من التعامل بسهولة مع ‪ Add‬للوظيفة ‪ Key‬لكن في هذه الحالة سنستخدم الباراميتر‬
‫كل عنصر‪ .‬سنضيف ‪ 5‬عناصر كما في الصورة السابقة ‪ ,‬سنبدأ اآلن في برمجة المثال‬
‫تحتوي على بعض الصور كما في الصورة التالية ‪ ImageList‬سنحتاج في هذا المثال أداة‬

‫الكود التالي ‪ Form_Load‬في حدث‬


‫‪ListView1.View = lvwIcon‬‬

‫‪ lvwIcon‬لتحديد أسلوب عرض األداة وهو‬


‫‪ListView1.Icons = ImageList1‬‬

‫‪ListView‬لتحديد مصدر اإليقونات التي سيتم استخدامها في ال‬

‫ثم الكود التالي‬

‫‪For i = 1 To 5‬‬
‫‪ListView1.ListItems.Add , "M" & i, "Sniper" & i, i‬‬
‫‪Next i‬‬
‫‪Dim i As Integer‬‬

‫‪ For .. Next‬الستخدامه في حلقة‪ i i‬قمنا بتعرف المتغير‬

‫وهي من ‪ 1‬إلى ‪ For .. Next 5‬ثم قمنا بتحديد عدد دورات الحلقة‬

‫للعنصر ‪ Key‬ثم سيتم إضافة عنصر في دورة كما هو مالحظ من الكود حيث سيكون ال‬
‫ال يجب أن ‪ Key‬وهكذا ‪ .‬مع مالحظ أن ال ‪ M2 ...‬العنصر الثاني هو ‪ M1‬األول هو‬
‫‪ Index‬يتكرر عند إضافة العناصر ‪ ,‬وبالنسبة لباراميتر األيقونة يتم تحديده بكتابة رقم ال‬
‫للصورة المراد إضافتها للعنصر المضاف مع مالحظ أن الباراميترالذي يتم إضافة رقم ال‬
‫‪ SmallIcon .‬وليس الباراميتر ‪ Icon‬هو الباراميتر ‪Index‬‬

‫‪ Next .‬ثم قمنا بإغالق حلقة‬

‫إذن الكود النهائي سيكون كما يلي‬


ListView1.View = lvwIcon

ListView1.Icons = ImageList1

Dim i As Integer
For i = 1 To 5
ListView1.ListItems.Add , "M" & i, "Sniper" & i, i
Next i
End Sub
Private Sub Form_Load()

‫ طيب السؤال اآلن كيف سنقوم بربط كل أيقونة بكود معيّن‬.. ‫اآلن انتهينا من تصميم المثال‬
‫ عن النقر‬DblClick ‫ الجواب طبعا ً باستخدام ال‬.. ‫ مثالً ؟‬Key ‫ تابع معي‬.. ‫ لكل عنصر‬..

‫ سنقوم باستخدام جملة‬Select Case ‫ في حدث‬ListView1_DblClick ‫كما في الكود‬


‫التالي‬

Select Case ListView1.SelectedItem.Key


Case "M1"
Form2.Show

Case "M2"
Form3.Show

Case "M3"
MsgBox "Programmed By Sniper.ps"

Case "M4"
MsgBox "www.vb4arab.com"

Case "M5"
End

End Select
End Sub
‫)(‪Private Sub ListView1_DblClick‬‬

‫للعنصر المحدد لذلك استخدمنا ‪Key‬حيث في هذا الكود نستخدم جملة بناء على قيمة ال‬
‫‪ SelectedItem‬الخاصية‬

‫وبنفس ‪Form2‬فسيتم إظهار ال ‪ M1‬للعنصر قيمته هي ‪ Key‬ثم قلنا أنه في حالة‪ i‬كان ال‬
‫‪.‬الطريقة لجميع العناصر‬
‫حمل المثال التوضيحي من هنا‬

‫‪ lvwList‬و ‪ View = lvwSmallIcon‬عندما تكون خاصية ‪ ListView‬ثالثا ً ‪ :‬استخدام أداة ال‬

‫إال في نمط عرض األيقونات حيث في ‪ lvwIcon‬في هاتين الحالتين لن تختلفا عن الحالة‬
‫ستظهر اإليقونات كما في الصورة التالية ‪ lvwSmallIcon‬حالة‪i‬‬

‫ستظهر اإليقونات كما في الصورة التالية ‪ lvwList‬وفي حالة‬


Private Sub mnuFilePrint_Click()
Printer.CurrentX = 1440
Printer.CurrentY = 1440

PrintListView ListView1

Printer.EndDoc
End Sub

Private Sub PrintListView(lvw As ListView)


Const MARGIN = 60
Const COL_MARGIN = 240

Dim ymin As Single


Dim ymax As Single
Dim xmin As Single
Dim xmax As Single
Dim num_cols As Integer
Dim column_header As ColumnHeader
Dim list_item As ListItem
Dim i As Integer
Dim num_subitems As Integer
Dim col_wid() As Single
Dim X As Single
Dim Y As Single
Dim line_hgt As Single

xmin = Printer.CurrentX
ymin = Printer.CurrentY

' ******************
' Get column widths.
num_cols = lvw.ColumnHeaders.Count
ReDim col_wid(1 To num_cols)

' Check the column headers.


For i = 1 To num_cols
col_wid(i) = _
Printer.TextWidth(lvw.ColumnHeaders(i).Text)
Next i

' Check the items.


num_subitems = num_cols - 1
For Each list_item In lvw.ListItems
' Check the item.
If col_wid(1) < Printer.TextWidth(list_item.Text) _
Then _
col_wid(1) = Printer.TextWidth(list_item.Text)

' Check the subitems.


For i = 1 To num_subitems
If col_wid(i + 1) < _
Printer.TextWidth(list_item.SubItems(i)) _
Then _
col_wid(i + 1) = _
Printer.TextWidth(list_item.SubItems(i))
Next i
Next list_item

' Add a column margin.


For i = 1 To num_cols
col_wid(i) = col_wid(i) + COL_MARGIN
Next i

' *************************
' Print the column headers.
Printer.CurrentY = ymin + MARGIN
Printer.CurrentX = xmin + MARGIN
X = xmin + MARGIN
For i = 1 To num_cols
Printer.CurrentX = X
Printer.Print FittedText( _
lvw.ColumnHeaders(i).Text, col_wid(i));
X = X + col_wid(i)
Next i
xmax = X + MARGIN

Printer.Print
line_hgt = Printer.TextHeight("X")
Y = Printer.CurrentY + line_hgt / 2
Printer.Line (xmin, Y)-(xmax, Y)
Y = Y + line_hgt / 2

' Print the rows.


num_subitems = num_cols - 1
For Each list_item In lvw.ListItems
X = xmin + MARGIN

' Print the item.


Printer.CurrentX = X
Printer.CurrentY = Y
Printer.Print FittedText( _
list_item.Text, col_wid(1));
X = X + col_wid(1)

' Print the subitems.


For i = 1 To num_subitems
Printer.CurrentX = X
Printer.Print FittedText( _
list_item.SubItems(i), col_wid(i + 1));
X = X + col_wid(i + 1)
Next i

Y = Y + line_hgt * 1.5
Next list_item
ymax = Y

' Draw lines around it all.


Printer.Line (xmin, ymin)-(xmax, ymax), , B

X = xmin + MARGIN / 2
For i = 1 To num_cols - 1
X = X + col_wid(i)
Printer.Line (X, ymin)-(X, ymax)
Next i
End Sub

' Return as much text as will fit in this width.


Private Function FittedText(ByVal txt As String, ByVal wid _
As Single) As String
Do While Printer.TextWidth(txt) > wid
txt = Left$(txt, Len(txt) - 1)
Loop
FittedText = txt
End Function
‫مثال اخر‬
Re: Print Listview
And here is an example of printing it to a file (then you can print that file to a printer
easily enough, and you will still have a file copy of what was printed.)
Code:
Dim lvItem As MSComctlLib.ListItem
Dim j As Long
Dim k As Long
Dim n As Long
Dim r As String

On Error Resume Next

Kill strFolder & "\*.txt" ' delete all previous saved items

For j = 1 To lv.ListItems.Count
Set lvItem = lv.ListItems.Item(j)
n = FreeFile
Open strFolder & "\" & j & ".txt" For Output As #n
'If you want to save the row in one line, replace vbNewLine with your desired
delimiter
r = lvItem.Text & vbNewLine
For k = 1 To lvItem.ListSubItems.Count - 1
r = r & lvItem.SubItems(k) & vbNewLine
Next
Print #n, Mid$(r, 1, Len(r) - 2) ' remove the last delimiter
'if you used comma as delimiter, replace Print #n, Mid$(r, 1, Len(r) - 2) with
' Print #n, Mid$(r, 1, Len(r) - 1)
Close #n
Next

End Sub

You might also like