عملت مشروع جديد به نافذتان نافذة تسجيل دخول ونافذة أخرى النافذة الرئيسة وعند استدعاء النافذة الرئيسية بعد تسجيل دخول ناجح يغلق المشروع الكود الموضوع الذي يغلق المشروع :
PHP كود :
procedure TLoginFrm.BtnLoginClick(Sender: TObject);
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;
وقبلها في زر الإغلاق اكتب:
التسلسل في تنفيذ الأحداث بيكون أولا برمجة الزر الخاص بالإغلاق، ثم يتبعه الحدث CloseQuery الخاص بالفورم.
إذا اختار المستخدم أن لا يغلق البرنامج، فاجعل قيمة البارامتر CanClose =
وإلا
كود :
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 لأنه يتيح لك إلغاء الخروج، والاستمرار في العمل على البرنامج.
فترتيب الأحداث يكون كالتالي:
أنت تعطي الأمر للإغلاق بالكود
في حدث النقر لزر معين.
فيتم إطلاق الحدث FormCloseQuery وذلك لغرض إعطاء فرصة اخيرة للمستخدم للتراجع عن عملية الإغلاق.
فإذا تراجع المستخدم فخير وبركة، أما إذا لم يتراجع وقرر المضي قدماً في الإغلاق، فسيتم إطلاق الحدث OnClose، وبعده سيتم قفل البرنامج.
عليك بفهم دورة حياة الفورم حتى تتضح لك الصورة كاملة.
أتمنى لك الفائدة.
مشكور جدا على هذه الملاحظة .
(20-06-19, 08:08 PM)asemshahen5 كتب : [ -> ]عملت مشروع جديد به نافذتان نافذة تسجيل دخول ونافذة أخرى النافذة الرئيسة وعند استدعاء النافذة الرئيسية بعد تسجيل دخول ناجح يغلق المشروع الكود الموضوع الذي يغلق المشروع :
PHP كود :
procedure TLoginFrm.BtnLoginClick(Sender: TObject);
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
في الاحداث تجد دائما احداث لها نفس الشئ ولكن توقيتها يسبق بعضها
مثل
FormCloseQuery يسبق الحدث Onclose
فالثاني عندما يتم اغلاق النموذج فعلا ويكون النموذج قد تم اغلاقه
اما FormCloseQuery فالنموذج لم يتم اغلاق بعد لهذا ينفع هذا الحدث في اظهار رسالة للمستخدم مثلا تسأله هل تريد الاغلاق ام لا .
يمكن مراجعة هذا المثال
https://vb4arb.com/vb/showthread.php?tid=29950