ودع كثرة النوافد المنبثقة
#1
السلام عليكم

قد تبرمج بنامجا دو مستوى جيد و يطلب منك الزبون أن تجعل البرنامج كله في نافدة واحدة أو تود أن تجعل جميع نوافدك تظهر في نافدة واحدة هدا المثال سيوصل لك الفكرة ان شاء الله.

بالتوفيق.


الملفات المرفقة
.rar   InOneWindow.rar (الحجم : 3.76 ك ب / التحميلات : 939)
لا اله الا أنت سبحانك اني كنت من الضالمين
[-] كل من 1 user says قال شكرا ل me_delphi على المشاركة المفيدة
  • Tamer17
الرد
#2
وعليكم السلام ورحمة الله
مثال جميل Smile
بشكل عام، في الحالات حيث نريد تمرير متغير يختلف صنفه (هنا TForm2, TForm3, TForm4)
يمكننا مبدئيا استعمال أحد الطريقتين:
1- تمرير الصنف نفسه صنفه class of TForm في هذا مثال
معرف مسبقا باسم TFormClass في المكتبة Forms
PHP كود :
procedure CreateAForm(ClassForm: TFormClass);
var
  
AForm: TForm;
begin
  AForm 
:= ClassForm.Create(Application);
  
AForm.Parent := Form1.Panel1;
  
AForm.Width:= 380;
  
AForm.Height:= 500;
  
AForm.Top:=0;
  
AForm.Left:= 0;
  
AForm.Show;
end; 
في مثال النماذج، هناك خدعة مشابهة تقريبا بالبحث عن اسم الصنف باستخدام FindClass
Creating a Delphi Form from a String
PHP كود :
http://delphi.about.com/library/weekly/aa080905a.htm 
في هذه الحالة لا يمكن فحص إنشاء النموذج مباشرة... لذلك نلجأ إلى طريقة ثانية:
2- تمرير متغير غير ذي نمط Untyped Reference
لأجل نفس المثال السابق مثلا:
PHP كود :
procedure CreateAndCheck(var AForm; FormClass: TFormClass);
begin
  with TForm
(AForm) do
  if  
not Assigned(TForm(AForm)) then begin
      Application
.CreateForm(FormClass, TForm(AForm));
      
Parent := Form1.Panel1;
      
Width:= 380;
      
Height:= 500;
      
Top:=0;
      
Left:= 0;
    
end else
      
Show;
end; 
وهنا ينبغي تمرير المتغير وصنفه أيضا إذ لا يمكن جلب صنف المتغير باستخدام ClassParent ثم قولبتها بشيء مثل:
PHP كود :
Application.CreateForm(TComponentClass(AForm.ClassParent), TForm(AForm)); 
لماذا؟ ببساطة لأن نمطه غير معروف!
هذه الطرق سارية على جميع إصدارات دلفي...
هناك حل آخر (أحسن إن أمكن) باستخدام نماذج مورثة:
http://www.delphi4arab.net/forum/showpos...ostcount=2
بالتوفيق.
الرد
#3
[color="royalblue"]السلام عليكم و حمة الله تعالى و بركاته
فكرة جميلة اخي هذا من حيث البرمجة
لكن هذه فكرتي [/color]

كود :
procedure TForm1.Button1Click(Sender: TObject); begin PageControl1.ActivePageIndex:= 0; end; procedure TForm1.Button2Click(Sender: TObject); begin PageControl1.ActivePageIndex:= 1; end; procedure TForm1.Button3Click(Sender: TObject); begin PageControl1.ActivePageIndex:= 2; end; procedure TForm1.Button4Click(Sender: TObject); begin PageControl1.ActivePageIndex:= 3; end;


الملفات المرفقة
.rar   InOneWindow.rar (الحجم : 1.24 ك ب / التحميلات : 270)
الرد
#4
إقتباس :مثال جميل

واظافة أجمل أخي kachwahed

إقتباس :لكن هذه فكرتي

هناك عدة طرق أخي Anter2010 وطريقتك أيضا منطقية.

وجزاكم الله خيرا
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#5
السلام عليكم
فكرة رائعة جدا
ولكن هناك مشكل عند فتح مثلا Form2 وبعدها فتح Form3 وبعدها فتحت Form4 ستبقى جميعها مفتوحة وهذا سيجعل البرنامج بطيئ . تخيل لو كانت لديك عدة نوافذ مليئة بالمكونات .ماذا يحصل في رأيك ؟ أكيد البطئ وهذا يؤثر على البرنامج
المهم الفكرة طيبة جدا لكن تنقصها بعض التعديلات لإغلاق النوافذ الأخرى
الرد
#6
السلام عليكم
أخي ، إستعمل هذا الكود

أضف هذا عند الضغط على الزر Form3
كود :
if frm2<> nil then frm2.Close; if frm4 <> nil then frm4.Close;
البرنامج سيكون أسرع
الرد
#7
إقتباس :أكيد البطئ وهذا يؤثر على البرنامج

بالطبع أخي AnoirsoftDevloper هدا شيء لا يجب أن يغفل عنه أي مبرمج...لكن هدا مجرد مثال هدفه ايصال الفكرة فقط.

وجزاك الله خيرا
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#8
السلام عليكم

والله موضوع في غاية الأهمية رغم أن الدلفي كل شيء فيه مهم

يوجد تطبيقات بها 100 أو أكثر من فورم فلكثرة هته النوافذ تمل

بارك الله فيكم
إن أصبت فمن الله وإن أخطأت فمن نفسي ومن الشيطان
الرد
#9
شكرا بارك الله فيكم على هذه التوضيحات
جاري تجريبها
شمعة تحترق من اجل الآخرين
الرد


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


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