easyDelphi Q&A

Reword

+2 تصويتات
84 مشاهدات
if Assigned(MyForm) then

  if MyForm.Showing then

     MyForm.Close;

حسنا النافذة منشأة و ظاهرة -- مع العلم ان لها بارنت -- و كود التحقق السالف كتابته لا يعمل
ما رأيكم ؟

سُئل في تصنيف vcl بواسطة
أعيد الوسم بواسطة | 84 مشاهدات
 

2 إجابة

+5 تصويتات

لا اعتقد انك تحتاج لمثل هذا في اجراء OnClose يوجد برمتر المسها Action . هذا سيحدد ماذا سيحدث عند الاغلاق


اكتب هذه اخر سطر في اجراء OnClose 

 Action := caFree

هكذا ستتحرر تلقائيا بعد الاغلاق .
 

caNone  
هذه لن تسمح باغلاق النافذة . يمكنك وضع شرط قبلها لتتحقق من شيء وحسب التحقق تسمح باغلاقها او لا .  
caHide  
هذه ستخفي النافذة بدل اغلاق . فقط اخفاء .  
caFree  
هذه ستحرر النافذة بعد الاغلاق ( ستحتاج لاعادة انشاءها مرة اخرى اذا اردت اعادة فتحها ).  
caMinimize  
هذه ستصغر النافذة بدل اغلاقها . هذا الوضع الافتراضي في تطبيقات MDI . 
تم الرد عليه بواسطة (6,200 نقاط)
+1 تصويت

إليك هذا المثال البسيط عن كيفية إنشاء نافذة أثناء "RunTime" مع مراعاة كل الحالات الممكنة للأنشاء و الأغلاق معا... لربما قد يفيدك - رابط تحميل البرنامج كاملا مع الكود سورس هنا-

المثال كالأتي:

unit UMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TFrmMain = class(TForm)
    Btn_CreateFrm: TButton;
    Btn_FreeFrm: TButton;
    procedure Btn_CreateFrmClick(Sender: TObject);
    procedure Btn_FreeFrmClick(Sender: TObject);
  private
    { Private declarations }
    procedure Create_MyFrm(AFrm_Owner: TComponent; AFrm_Parent: TWinControl; AFrm_Leftt, AFrm_Top, AFrm_Width, AFrm_Height: Integer);
    procedure AForm_OnClose(Sender: TObject; var Action: TCloseAction);
    procedure Destroy_MyForm;
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;
  MyForm: TForm;

implementation

{$R *.dfm}

procedure TFrmMain.Create_MyFrm(AFrm_Owner: TComponent;
  AFrm_Parent: TWinControl; AFrm_Leftt, AFrm_Top, AFrm_Width,
  AFrm_Height: Integer);
begin
  MyForm := nil;
  MyForm := TForm.Create(AFrm_Owner);
  MyForm.Parent := AFrm_Parent;

  if AFrm_Owner = nil then // لتتمكن من تحرير نفسها بنفسها "OnClose"فإن الفورم ستأخذ الخاصية "Nil"هنا إذا كان منشأ الفورم يساوي
  begin
    MyForm.OnClose := AForm_OnClose;
  end;

  if AFrm_Parent = nil then
  begin
    MyForm.SetBounds(AFrm_Leftt, AFrm_Top, AFrm_Width, AFrm_Height); // "Vcl.Controls" هذا الأجراء يوجد في وحدة
    MyForm.Show;
  end else
  begin
    MyForm.Show;
    MyForm.SetBounds(AFrm_Leftt, AFrm_Top, AFrm_Width, AFrm_Height);
  end;

end;

procedure TFrmMain.Destroy_MyForm;
begin
  if Assigned(MyForm) then
  begin
    if MyForm.Owner = nil then // هنا نبحث عن من أنشأ الفورم  لنغـلقها بشكل صحيح
    begin   //التي جاوبك عليها الأستاذ سامر "OnClose" هي من ستحرر نفسها بخاصية  "Nil" و الفورم التي كان إنشاؤها
      MyForm.Close; // هنا الفورم هي من ستحرر نفسها بنفسها
    end else
    begin
      FreeAndNil(MyForm);// or MyForm.DisposeOf;
    end;

  end;
end;

procedure TFrmMain.AForm_OnClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
  Btn_FreeFrm.Enabled := False;
  Btn_CreateFrm.Enabled   := True;
end;

procedure TFrmMain.Btn_CreateFrmClick(Sender: TObject);
begin
   Create_MyFrm(Self, Self, 100, 100, 200, 100);
  // Create_MyFrm(nil, Self, 100, 100, 200, 100);
  // Create_MyFrm(Application, Self, 100, 100, 200, 100);
  // Create_MyFrm(Self, nil, 100, 100, 200, 100);
  // Create_MyFrm(nil, nil, 100, 100, 200, 100);
  // Create_MyFrm(Application, nil, 100, 100, 200, 100);  //   بإمكانك الأختيار بين الستة

  Btn_CreateFrm.Enabled := False;
  Btn_FreeFrm.Enabled   := True;
end;

procedure TFrmMain.Btn_FreeFrmClick(Sender: TObject);
begin
  Destroy_MyForm;
  Btn_FreeFrm.Enabled := False;
  Btn_CreateFrm.Enabled   := True;
end;

end.

مع العلم أنني لا أستعمل أنا شخصيا هذه الطريقة في برامجي و إنما أعمل مثل "Template" أو نموذج جاهز للفورم و أضعها في حالة "Available Forms" عوضا عن "Auto Create Forms" ثم أناديها على حسب كل حالة على حدى ... وفي الأخير يعتبر هذا المثال مجرد مثال تعليمي لا غير ...

تم الرد عليه بواسطة (2,080 نقاط)
عُدل بواسطة
هو طلب . اغلاق نافذة . وليس انشاء نافذة
عذرا أخي سامر و لكن لا يمكنني أن أفهمه الأغلاق مادام الأنشاء مجهولا ؟ لذلك إرتأيت أن أعطيه مثالا كاملا ليفهم الأثنين معا .....
كما أن ليس كل النوافذ التي تنشأ أثناء "RunTime" تغلق بخاصية "OnClose" لذلك و عذرا أراني قد بذلت ما بوسعي لتلخيص ما كان يسعى إليه فهو من سأل السؤال السابق عن كيفية الأنشاء ثم بعدها أعقب بهذا السؤال و هو الدافع القوي للرد عليه بالأثنين معا ... و شكرا.
مشكور على المجهود . وزيادة الخير خير . :)
أنت المشكور يا أستاذ سامر و فضلك هذا سيضاعف عند المولى عز وجل أضعافا مضاعفة ... إنشاء الله.
رجاءا تحقق من الرابط الذي نشرته يبدو غير آمن و شكرا
يبدو أن الرابط آمن و يعمل .... لا أدري ماذا تقصد بغير آمن و شكرا .
للأسف لم يشتغل عندي
تظهر صفحة النورتون سيكيوريتي + و اشعار من الكاسبرسكي
it's a false Positif ... anyway i will reupload the file without Binary Exe and thank's for your comment..

اسئلة متعلقة

+2 تصويتات
3 إجابة
سُئل يونيو 26 بواسطة عائشة | 70 مشاهدات
–1 تصويت
1 إجابة
سُئل منذ 2 أيام في تصنيف vcl بواسطة djaoui (760 نقاط) | 19 مشاهدات
0 تصويتات
2 إجابة
+1 تصويت
1 إجابة
+2 تصويتات
1 إجابة
سُئل منذ 6 أيام في تصنيف fmx بواسطة rabbchii (180 نقاط) | 17 مشاهدات

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

66 سؤال
141 إجابة
228 تعليق
77 مستخدم