انشاء مكون اثناء وقت التنفيذ
#1
السلام عليكم

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

تستطيع عمل ذلك من خلال عدة طرق
اسهلها هي من خلال إنشاء 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
; 

إذا اشكل عليك امر لم تفهمه تفضل بالسؤال
الكود بالمرفقات


الملفات المرفقة
.rar   Add buttons at run time.rar (الحجم : 3.25 ك ب / التحميلات : 16)
الرد
#3
طريقة أخرى أسهل باستعمال ال 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; 
Open Your Source .. Open Your Mind
الرد
#4
السلام عليكم
اضافة على ردود الاعضاء الكرام هذا الرد
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
الرد
#5
السلام عليكم
في المرفقات كود بسيط يوضح حل جميل للمشكلة


الملفات المرفقة
.rar   dynamic button.rar (الحجم : 5.07 ك ب / التحميلات : 11)
الرد
#6
آسف على التأخر وشكرا للاخوة ALmuhhnadو ,S.FATEH,وSMP3وmemoz
كل أجاب على سؤالي وبطريقة مختلفة شكرا لكم بقي فقط سؤال واحد
وهو أن المكونات المنتجة تختفي عند غلق البرنامج فكيف يكون الحل الأمثل هل بالحفظ في قاعدة البيانات أو استخدام ملف اعدادات
الرد
#7
لا فرق باستتخدام ملف أو قاعدة بيانات ..... هذا امر تحدده انت ... حسب حجم العمل و اهميته .... باعتقادي.
الرد
#8
إقتباس :لا فرق باستتخدام ملف أو قاعدة بيانات ..... هذا امر تحدده انت ... حسب حجم العمل و اهميته .... باعتقادي.
+1
اغلب البرامج تحفظ إعدادات النوافذة ..إلخ على هيئة ini
بالتوفيق
الرد


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


يقوم بقرائة الموضوع: بالاضافة الى ( 2 ) ضيف كريم