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

ارسم داخل ListBox

مغلق
بدأه madi في 29 يناير 2002 · 3 رد · 1,591 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام

قد تحتاج يوما الى أن ترسم داخل أي عنصر متلا ListBox

بشرط يحتوي الخاصية Canvas ,

الطريقة طويلة جدا لكن ................................ جرب

[l]

procedure TForm1.Button1Click(Sender: TObject);

begin

ListBox1.Canvas.Brush.Color := clYellow;

    ListBox1.Canvas.Ellipse(1, 1, 20, 20);

end;

[/l]

وشكرا

مــــMADIــــدي

#2

لو أردنا أن نرسم صورة داخل ListBox

أولا لكي نرسم صورة داخل ListBox توجد فكرة جميلة لكي نحتفظ بالصورة كأحد عناصر ListBox وهي مفيدة في حالات كثيرة , هذه الفكرة هي إضافة كائن كأحد عناصر كأن أخر

مثلا لإضافة صورة كأحد عناصر ListBox الامرAddObject كالتالي :

ListBox2.items.AddObject('Ali',Image1.Picture.Bitmap);

ولكي نتعامل مع هدا العنصر في المستقبل

ListBox1.Items.Objects[index]

حيت index هو رقم العنصر وفي هذه الحالة لانه العنصر الوحيد سنستخدم

ListBox1.Items.Objects[0];

و نتيجة لانه سوف يعامل ككائن عادي TObject فإننا سوف نحتاج لاسترجاع خصائصه كصورة TBitmap, لدلك نستخدم أمر As كالتالي :

ListBox2.Items.Objects[0]as TBitmap;

أما بالنسبة ل ListBox فيجب أن نغير Style الخاص به الى

lbOwnerDrawVariable

حتى نتمكن من الرسم عليه , وهده الخاصية تجعله يرسم عناصره حسب الأوامر الموجودة في الحدث DrawItem

ListBox2.style:=lbOwnerDrawVariable;

أخيرا فان الأمر الذي سنستخدمه لكي تتم عملية الرسم هو أمرCanvas.BrushCopy

وهو أمر مشهور خاصة عندما تريد نسخ محتويات صورة ( المصدر) إلى صورة أخرى (الهدف) .

و تحتاج فقط إلى أن تحدد الصورة المصدر و تحدد حدود الجزء الذي تريده نسخه منها Source rectangle , وتحدد الجرء الذي تريد الإلصاق به Dest rectangle في الصورة الهدف .

الآن إلى البرنامج

ضع ListBox و Image على الفورم

بالنسبة للImage سوف أعطيك صورة مناسبة لكي تجرب بها وحاول أن يكون حجم Image بنفس حجم هده الصورة , ولا تستخدم خاصية Stretch ,بمعنى حاول أن يكون حجم الصورة صغيرا ,

انزل الصورة

4.bmp

[l]

procedure TForm1.FormCreate(Sender: TObject);

begin

      ListBox2.Items.Clear;

      ListBox2.style:=lbOwnerDrawVariable;

      ListBox2.items.AddObject('Ali',Image1.Picture.Bitmap);



end;



procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer;

  Rect: TRect; State: TOwnerDrawState);



 var Bitmap : TBitmap;

begin

    ListBox2.Canvas.FillRect(Rect);

   if ListBox2.Items.Objects[Index] <> nil then

    begin

      Bitmap :=ListBox2.Items.Objects[index]as TBitmap;

      ListBox2.Canvas.CopyMode:=cmPatCopy;

      ListBox2.Canvas.BrushCopy(Bounds(Rect.Left, Rect.Top ,Bitmap.Width,Bitmap.Height), Bitmap,Bounds(0,0,Bitmap.Width,

      Bitmap.Height),Bitmap.Canvas.Pixels[0,Bitmap.Height-1]);

    end;



end;

[/l]

وشكرا

مــــMADIــــدي

#3

أخر مرحلة هي رسم صورة لكل عنصر ,

ضع تلاث Image على الفورم و اختر الصور المناسبة لها , كما في المرة الماضية ,

ضع ListBox و كبر قليلا في حجمه باستخدام الماوس ,

الان سوف تحتاج الى التعامل مع تلات أحدات

FormCreate سوف نكون فيه عناصر ListBox متال المرة الماضية تماما ,

ListBox1MeasureItem و تنفد هده الدالة عند تكوين اى عنصر جديد في ListBox و سنستفيد منها لتحديد حجم العنصر المتكون حسب حجم الصورة ,

ListBox1DrawItem ينفد بصفة مستمرة , يستخدم لرسم عناصر ListBox ونحن سنستخدمه لرسم الصور داخل عناصر ListBox

البرنامج

[l]

procedure TForm1.FormCreate(Sender: TObject);

begin

     with ListBox1.Items do

     begin

          clear;

          ListBox1.style:=lbOwnerDrawVariable;

          AddObject('Bitmap1',Image1.Picture.Bitmap);

          AddObject('Bitmap2',Image2.Picture.Bitmap);

          AddObject('Bitmap3',Image3.Picture.Bitmap);

     end;

end;



procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;

  var Height: Integer);

begin

  If Index = 0 Then Height := Image1.Height + 4;

  If Index = 1 Then Height := Image2.Height + 4;

  If Index = 2 Then Height := Image3.Height + 4;

end;





procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;

  Rect: TRect; State: TOwnerDrawState);

var Bitmap : TBitmap;

begin



  with ListBox1 do

  begin

    Canvas.FillRect(Rect);

    if Items.Objects[Index] <> nil then

    begin

      Bitmap := Items.Objects[Index] as TBitmap;

      Canvas.CopyMode:=cmPatCopy;

      Canvas.BrushCopy(Bounds(Rect.Left+ 2, Rect.Top + 2,Bitmap.Width,Bitmap.Height), Bitmap,Bounds(0,0,Bitmap.Width,

      Bitmap.Height),Bitmap.Canvas.Pixels[0,Bitmap.Height-1]);

    end;

  end;

end;





[/l]

وشكرا

مــــMADIــــدي

هذا الموضوع مغلق.

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