منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟ - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة Delphi (http://vb4arb.com/vb/forumdisplay.php?fid=213)
+--- قسم : قسم اسئلة Delphi (http://vb4arb.com/vb/forumdisplay.php?fid=215)
+--- الموضوع : هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟ (/showthread.php?tid=29937)



هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟ - asemshahen5 - 20-06-19

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

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


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


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق الشروع ؟ - أبوبكر سويدان - 20-06-19

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

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

وفي حدث

كود :
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;



RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق الشروع ؟ - asemshahen5 - 20-06-19

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


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق الشروع ؟ - أبوبكر سويدان - 20-06-19

لا يوجد شيء يحل مكان شيء، أو شيء أفضل من شيء.

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

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

كود :
Close;

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

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


عليك بفهم دورة حياة الفورم حتى تتضح لك الصورة كاملة.
أتمنى لك الفائدة.


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق الشروع ؟ - asemshahen5 - 21-06-19

مشكور جدا على هذه الملاحظة .


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق الشروع ؟ - أبوبكر سويدان - 21-06-19

الشكر لله.


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق الشروع ؟ - wared - 21-06-19

(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


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟ - wared - 21-06-19

أشكرك أخي asemshahen5 على الشكر.


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟ - viv - 21-06-19

في الاحداث تجد دائما احداث لها نفس الشئ ولكن توقيتها يسبق بعضها
مثل
FormCloseQuery يسبق الحدث Onclose
فالثاني عندما يتم اغلاق النموذج فعلا ويكون النموذج قد تم اغلاقه
اما FormCloseQuery فالنموذج لم يتم اغلاق بعد لهذا ينفع هذا الحدث في اظهار رسالة للمستخدم مثلا تسأله هل تريد الاغلاق ام لا .

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

http://vb4arb.com/vb/showthread.php?tid=29950


RE: هل من الممكن إغلاق نافذة تسجيل الدخول دون إغلاق المشروع ؟ - wared - 21-06-19

أشكرك أخي asemshahen5 على التقييم.