سؤال في Tchecklistbox
#1
السلام عليكم ورحمة الله وبركاته

في برنامج أهلا فيدورا أردت أضافة أيقونات الي قائمة تثبيت البرامج (استخدم Tchecklistbox)
لكني فوجئت بأن ذلك غير ممكن الا عن طريق تخصيصه ownerdraw checklistbox وانا لا اعرف كيف افعل ذلك



لذا استخدمت TlistView ووضعت الايقونات

[صورة مرفقة: moJGT.png]

ولكني لم أجد الـ Event اللذ استخدمته للـ TcheckListBox وهو

OnItemClick
بحثت قليلا فوجدت ListViewChange ولكنه للأسف يعمل عند تغيير selected او checked لاي من العناصر في listview


فهل منكم من عنده حل لهذه المعضلة Sad
الرد
#2
وعليكم السلام

بالنسبة ل TTreeView يمكن استغلال الحدث OnMouseDown للحصول على بند الشجرة مثل التالي:

كود :
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Node: TTreeNode;
begin
  Node := TTreeView(Sender).GetNodeAt(X, Y);
end;

بالنسبة ل TListView يمكم مراجعة الكود في الرابط التالي ومرفق ايضا:
كود :
http://www.shagrouni.com/english/software/xlist.html

بالتوفيق.


الملفات المرفقة
.rar   The List Box Got a New Face.rar (الحجم : 267.89 KB / التحميلات : 62)
الرد
#3
هنا حل رائع ليجعل TListView يرفع حدث (raise an event) عند تغير حالة الـ Checkbox لكني فشلت في تطبيقه علي لازاروس

كود :
http://delphi.about.com/od/delphitips2007/qt/listviewchecked.htm

كود :
uses CommCtrl;

procedure TForm1.FormCreate(Sender: TObject) ;
begin
   OriginalListViewWindowProc := ListView1.WindowProc;
   ListView1.WindowProc := ListViewWindowProcEx;
end;

procedure TForm1.ListViewWindowProcEx(var Message: TMessage) ;
var
   listItem : TListItem;
begin
   if Message.Msg = CN_NOTIFY then
   begin
     if PNMHdr(Message.LParam)^.Code = LVN_ITEMCHANGED then
     begin
       with PNMListView(Message.LParam)^ do
       begin
         if (uChanged and LVIF_STATE) <> 0 then
         begin
           if ((uNewState and LVIS_STATEIMAGEMASK) shr 12) <> ((uOldState and LVIS_STATEIMAGEMASK) shr 12) then
           begin
             listItem := listView1.Items[iItem];
             memo1.Lines.Add(Format('%s checked:%s', [listItem.Caption, BoolToStr(listItem.Checked, True)])) ;
           end;
         end;
       end;
     end;
   end;
   //original ListView message handling
   OriginalListViewWindowProc(Message) ;
end;

procedure TForm1.GetCheckedButtonClick(Sender: TObject) ;
var
   li : TListItem;
begin
   memo1.Lines.Clear;
   memo1.Lines.Add('Checked Items:') ;
   for li in listView1.Items do
   begin
     if li.Checked then
     begin
       memo1.Lines.Add(Format('%s %s %s', [li.Caption, li.SubItems[0], li.SubItems[1]])) ;
     end;
   end;
end;

الخطأ هو
كود :
unit1.pas(17,57) Error: Identifier not found "TMessage"
الرد
#4
ربما الوحدة Messages ليست مدرجة في قسم uses

ملاحظة:
آسف، لم أنتبه في مشاركتي السابقة و خلطت بين TlistView و TTreeView.
الرد
#5
معك حق تجاوزت هذا الخطأ باضافة الوحدة messages لاصطدم بالكثير من الاخطاء الاخري

هل من فكرة أخري أكثر جمالا لقائمة تثبيت التطبيقات هذه

هذه الواجهة الجديدة للبرنامج -أكثر جمالا Smile -

[صورة مرفقة: QTsL2.png]
أرغب في تحسين شكل هذه القائمة من checkboxes هل من أفكار ؟؟
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف