منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
عملت مشروع جديد به نافذتان نافذة تسجيل دخول ونافذة أخرى النافذة الرئيسة وعند استدعاء النافذة الرئيسية بعد تسجيل دخول ناجح يغلق المشروع الكود الموضوع الذي يغلق المشروع :

PHP كود :
procedure TLoginFrm.BtnLoginClick(SenderTObject);
var
Uid :string;
Pass :string;
SqlStr :string;
begin
Uid
:=Txt_UserName.Text;
Pass:=Txt_Password.Text;
SqlStr:='Select * From ALL_USERS  Where USER_NAME =:USER_NAME And USER_PASS =:USER_PASS';
DBCon.Connected:=True;

DBQuery.SQL.Add(SqlStr);
DBQuery.Parameters.ParamByName('USER_NAME').Value:=Uid;
DBQuery.Parameters.ParamByName('USER_PASS').Value:=Pass;
DBQuery.Open;
if 
DBQuery.RecordCount>0 then
begin
  MainForm
.Show;
 
 Close;
end
else
begin
  ShowMessage
('الرجاء التأكد من اسم المستخدم و كلمة المرور')
end;
end

وهذا الكود الذي يعمل فقط استبدل كود الإغلاق بالإخفاء 

PHP كود :
if DBQuery.RecordCount>0 then
begin
  MainForm
.Show;
 
 Hide;
end
else
begin
  ShowMessage
('الرجاء التأكد من اسم المستخدم و كلمة المرور')
end


و هذا شيء خاطئ احب اغلاق الفورم عند الانتهاء منها هل هذا ممكن في دلفي أم هو مستحيل .
فورم تسجيل الدخول في العادة يكون أول فورم يبدأ به تشغيل البرنامج ، ولذلك لو أغلقته حتماً سيتم غلق البرنامج ككل.

الحل أنك تخفيه فبل استدعاء الشاشة الرئيسية.

وفي حدث

كود :
FormCloseQuery(Sender: TObject; var CanClose: Boolean);

للفورم الرئيسي، قم بإظهار رسالة تتأكد من قرار المستخدم هل يريد فعلا إغلاق البرنامج أم لا.

في حالة قرر الإغلاق، اكتب:

كود :
Application.Terminate;

وقبلها في زر الإغلاق اكتب:

كود :
Close;

التسلسل في تنفيذ الأحداث بيكون أولا برمجة الزر الخاص بالإغلاق، ثم يتبعه الحدث CloseQuery الخاص بالفورم.

إذا اختار المستخدم أن لا يغلق البرنامج، فاجعل قيمة البارامتر CanClose =

كود :
CanClose := False;

وإلا

كود :
CanClose := True;
Application.Terminate;


وهذا مثال (من لازاروس):

كود :
procedure TFMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
   user, pass, database, dir, Target_File_Name :String;
   Backup_Counter:Integer;
begin
     FConfirm.TMessage.Caption:= Sys_User_Name + '.. ' + 'هل تريد تسجيل الخروج من النظام؟';
     FConfirm.ShowModal;

     if FConfirm.Confirmation_ID = 0 then
     begin
          CanClose:= false;
          exit;
     end
     else
     begin

       begin
            user :=conn.UserName;
            pass :=conn.Password;
            database:=conn.DatabaseName;
            dir := application.Location;


            // get counter
            OpQuery.close;
            OpQuery.DataBase:=fmain.conn;
            OpQuery.Close;
            OpQuery.SQL.Text:='SELECT Backup_Counter FROM backup_counter WHERE ID=1';
            OpQuery.Open;

            opDataSource.DataSet:=OpQuery;

            // 2- invoice number +1
            Backup_Counter:=opDataSource.DataSet.FieldByName('Backup_Counter').AsInteger + 1;

            Target_File_Name:=application.Location + 'dumps\'  + inttostr(Backup_Counter) +'.sql';

            // update counter
            OpQuery.Close;
            OpQuery.SQL.Text:='UPDATE backup_counter SET Backup_Counter=:Backup_Counter WHERE ID=1';
            OpQuery.ParamByName('Backup_Counter').AsInteger:=Backup_Counter;
            OpQuery.ExecSQL;
            Trans.Commit;

            //showmessage(Target_File_Name);

            if pass<>'' then pass:=' --password='+pass;
            SetEnvironmentVariable(PChar('Path'),PChar(Dir));
            ShellExecute(Handle, 'open', PChar('cmd.exe'),
            pchar('/c mysqldump --user='+user+pass+ ' ' +database+' >"'+Target_File_Name+'"'),nil,0);

       conn.Close(true);
       Application.Terminate;
     end;

     end;
end;
بمشروعي استخدمت نفس الفكرة لكن في المين فورم استخدمت الحدث OnClose لإغلاق نافذة تسجيل الدخول هل هو افضل ام FormCloseQuery أفضل أم نفس الشيئ .
لا يوجد شيء يحل مكان شيء، أو شيء أفضل من شيء.

أنت تلاحظ في بعض البرامج عندما تريد إغلاقه يسألك: هل تريد فعلاً الخروج؟
نعم او لا.
في هذه الحالة، استخدم الحدث FormCloseQuery لأنه يتيح لك إلغاء الخروج، والاستمرار في العمل على البرنامج.

فترتيب الأحداث يكون كالتالي:
أنت تعطي الأمر للإغلاق بالكود

كود :
Close;

في حدث النقر لزر معين.

فيتم إطلاق الحدث FormCloseQuery وذلك لغرض إعطاء فرصة اخيرة للمستخدم للتراجع عن عملية الإغلاق.
فإذا تراجع المستخدم فخير وبركة، أما إذا لم يتراجع وقرر المضي قدماً في الإغلاق، فسيتم إطلاق الحدث OnClose، وبعده سيتم قفل البرنامج.


عليك بفهم دورة حياة الفورم حتى تتضح لك الصورة كاملة.
أتمنى لك الفائدة.
مشكور جدا على هذه الملاحظة .
الشكر لله.
(20-06-19, 08:08 PM)asemshahen5 كتب : [ -> ]عملت مشروع جديد به نافذتان نافذة تسجيل دخول ونافذة أخرى النافذة الرئيسة وعند استدعاء النافذة الرئيسية بعد تسجيل دخول ناجح يغلق المشروع الكود الموضوع الذي يغلق المشروع :

PHP كود :
procedure TLoginFrm.BtnLoginClick(SenderTObject);
var
Uid :string;
Pass :string;
SqlStr :string;
begin
Uid
:=Txt_UserName.Text;
Pass:=Txt_Password.Text;
SqlStr:='Select * From ALL_USERS  Where USER_NAME =:USER_NAME And USER_PASS =:USER_PASS';
DBCon.Connected:=True;

DBQuery.SQL.Add(SqlStr);
DBQuery.Parameters.ParamByName('USER_NAME').Value:=Uid;
DBQuery.Parameters.ParamByName('USER_PASS').Value:=Pass;
DBQuery.Open;
if 
DBQuery.RecordCount>0 then
begin
  MainForm
.Show;
 
 Close;
end
else
begin
  ShowMessage
('الرجاء التأكد من اسم المستخدم و كلمة المرور')
end;
end

وهذا الكود الذي يعمل فقط استبدل كود الإغلاق بالإخفاء 

PHP كود :
if DBQuery.RecordCount>0 then
begin
  MainForm
.Show;
 
 Hide;
end
else
begin
  ShowMessage
('الرجاء التأكد من اسم المستخدم و كلمة المرور')
end


و هذا شيء خاطئ احب اغلاق الفورم عند الانتهاء منها هل هذا ممكن في دلفي أم هو مستحيل .

تفضل (لست مبرمج ديلفي Delphi)
كيفية التحقق من قيمتين edit1 and edit2 واخفاء الفورم الحالي واظهار آخر : #14
أشكرك أخي asemshahen5 على الشكر.
في الاحداث تجد دائما احداث لها نفس الشئ ولكن توقيتها يسبق بعضها
مثل
FormCloseQuery يسبق الحدث Onclose
فالثاني عندما يتم اغلاق النموذج فعلا ويكون النموذج قد تم اغلاقه
اما FormCloseQuery فالنموذج لم يتم اغلاق بعد لهذا ينفع هذا الحدث في اظهار رسالة للمستخدم مثلا تسأله هل تريد الاغلاق ام لا .

يمكن مراجعة هذا المثال

https://vb4arb.com/vb/showthread.php?tid=29950
أشكرك أخي asemshahen5 على التقييم.