delphi4arab منتديات دلفي للعرب

نسخة كاملة : انشاء مكون اثناء وقت التنفيذ
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم

كيف أقوم باشاء مكون فليكن مثلا عدد من الـ buttons أثناء وقت التنفيذ حيث كل Button تأخد حدث معين دون تكرار
السلام عليكم ورحمة الله وبركاتة

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

لنفرض انك تريد عمل اربعه ازرار (زر جمع, زر طرح, زر قسمة, زر ضرب)
بعد ذلك نقوم بتعبئة الأحداث الخاصة بالازرار في الـ TListActions
وسنسمي الأحداث كتالي : (actSum, actMaines, actDiv, actMultiplication)

وسيكون شكل الاحداث كتالي :
PHP كود :
procedure TForm1.actMainesExecute(Sender: TObject);
begin
  ShowMessage
(IntToStr(9 - 3));
end;

procedure TForm1.actMultiplicationExecute(Sender: TObject);
begin
  ShowMessage
(IntToStr(9 * 3));
end;

procedure TForm1.actDivExecute(Sender: TObject);
begin
  ShowMessage
(IntToStr(9 div 3));
end;

procedure TForm1.actSumExecute(Sender: TObject);
begin
  ShowMessage
(IntToStr(9 + 3));
end; 

الآن بقي لنا عمل مصفوفة تحتوي الأزرار كي نستطيع التحكم بالأزرار وسنقوم بتعريفها في الـ Global
أي متغير عام :
PHP كود :
var
  
Form1: TForm1;
  
arrBtn : array[0..3] of TButton;  // add this line 

الآن بقيي ان نضع امر الإنشاء(create) وأمر التدمير(Destroy) او المسح او اين كان اسمه
بالنسبة لأمر الإنشاء تستطيع وضعه في اي مكان
اما امر التدمير يجب ان تضعه في الحدث FormDestroy الخاص بالنافذ التي تحتوي على الأزرار
كي يتم حذف الازرار قبل خروج البرنامج ويكون عملنا نضيف

لنضع زر في النافذة ونضع داخله امر إنشاء الازرار الآخرى وسيكون الأمر كتالي :
PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  
i : Integer;
begin
  
for i := 1 to 4 do
  
begin
    arrBtn
[i] := TButton.create(Self);
    
arrBtn[i].Left := 60 * i;
    
arrBtn[i].Top := 15;
    
arrBtn[i].Width := 50;
    
arrBtn[i].Height := 20;
    
arrBtn[i].Visible := True;
    
arrBtn[i].Parent := Self;
    case 
i of
      1 
: arrBtn[i].Action := actSum;
      
// 1 : arrBtn[i].OnClick := actSum.OnExecute;  You can do somethink like this
      
2 : arrBtn[i].Action := actMaines;
      
3 : arrBtn[i].Action := actDiv;
      
4 : arrBtn[i].Action := actMultiplication;
    else ;
    
end;
  
end;
end; 

ونضع امر التدمير كتالي :
PHP كود :
procedure TForm1.FormDestroy(Sender: TObject);
var
  
i : Integer;
begin
  
for i := 0 to 3 do
    
arrBtn[i].Free
end
; 

إذا اشكل عليك امر لم تفهمه تفضل بالسؤال
الكود بالمرفقات
طريقة أخرى أسهل باستعمال ال Generics :
PHP كود :
var
  
BtnsList: TDictionary<Integer, TButton>;

procedure TForm2.BtnFreeClick(Sender: TObject);
begin
  BtnsList
.Free;
end;

procedure TForm2.BtnsClick(Sender: TObject);
var
  
Btn: TButton;
begin
  
if not(Sender is TCustomButton) then
    
exit;
  
Btn := TButton(Sender);
  case 
Btn.Tag of
    0
:
      
begin
        ShowMessage
('0');
        
// You clicked button 0;
      
end;
    
1:
      
begin
        ShowMessage
('1');
        
// You clicked button 1;
      
end;
  
end;
end;

procedure TForm2.BtnInitClick(Sender: TObject);
var
  
i: Integer;
  
Btn: TButton;
begin
  BtnsList 
:= TDictionary<Integer, TButton>.Create;
  for 
i := 0 to 10 do
  
begin
    Btn 
:= TButton.Create(Self);
    
Btn.Parent := Self;
    
Btn.Left := (i * Btn.Width);
    
Btn.Caption := Format('Button %d', [i]);
    
Btn.Tag := i;
    
Btn.OnClick := BtnsClick;
    
BtnsList.Add(i, Btn);
  
end;
end; 
السلام عليكم
اضافة على ردود الاعضاء الكرام هذا الرد
السلام عليكم
في المرفقات كود بسيط يوضح حل جميل للمشكلة
آسف على التأخر وشكرا للاخوة ALmuhhnadو ,S.FATEH,وSMP3وmemoz
كل أجاب على سؤالي وبطريقة مختلفة شكرا لكم بقي فقط سؤال واحد
وهو أن المكونات المنتجة تختفي عند غلق البرنامج فكيف يكون الحل الأمثل هل بالحفظ في قاعدة البيانات أو استخدام ملف اعدادات
لا فرق باستتخدام ملف أو قاعدة بيانات ..... هذا امر تحدده انت ... حسب حجم العمل و اهميته .... باعتقادي.
إقتباس :لا فرق باستتخدام ملف أو قاعدة بيانات ..... هذا امر تحدده انت ... حسب حجم العمل و اهميته .... باعتقادي.
+1
اغلب البرامج تحفظ إعدادات النوافذة ..إلخ على هيئة ini
بالتوفيق