H1 --我编写了一个小进程,在使用Application.Terminate之前使用OnCloseQuery保存数据。我想知道,在发生停电或计算机崩溃的情况下,这是否足够。
type
TForm1 = class(TForm)
abs: TABSDatabase;
ABSTable1: TABSTable;
....
ABSTable6: TABSTable;
....
var
Form1: TForm1;
isBusy : Boolean;
....
procedure TForm1.CloseTables;
var
x : Integer;
dummy : TABSTable;
begin
for x:=0 to ComponentCount-1 do
begin
if Components[x] is TABSDataSet then
begin
if Components[x] is TABSTable then
begin
dummy := (Components[x] as TABSTable);
if ((dummy.Active = True) and ((dummy.state = dsEdit) or (dummy.State = dsInsert))) then
begin
dummy.Post;
dummy.Active := False;
end
else
if dummy. Active = True then dummy.Close;
end;
end;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
if abs.Connected = True then isBusy := True else isBusy := False;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if isBusy = True then
begin
CanClose := False;
CloseTables;
abs.Connected := False;
isBusy := False;
Application.Terminate;
end
else CanClose := True;
end;提前谢谢你。
编辑
我按照的建议修改了代码。
procedure TForm1.CloseTables;
var
x : Integer;
dummy : TABSTable;
begin
for x:=0 to ComponentCount-1 do
begin
if Components[x] is TABSDataSet then
begin
if Components[x] is TABSTable then
begin
dummy := (Components[x] as TABSTable);
if ((dummy.Active) and ((dummy.state = dsEdit) or (dummy.State = dsInsert))) then
begin
dummy.Post;
dummy.Active := False;
end
else
if dummy.Active then dummy.Close;
end;
end;
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if abs.Connected then
begin
CanClose := False;
CloseTables;
abs.Connected := False;
Application.Terminate;
end
else CanClose := True;
end;发布于 2022-11-17 17:08:05
这在发生电源故障或计算机崩溃时就足够了。
没关系,您请。
在回答了这个问题之后,让我们看看OnCloseQuery是在哪里触发的,这样您就可以感觉到您可能错过了什么:
WM_QUERYENDSESSION消息。如果任何应用程序返回零,则会话不会结束。.Close()时--关闭一个窗口(窗体)的典型调用。.CloseModal()时。请记住,像TerminateProcess()这样简单的东西会杀死正在运行的程序,而不会让它仍然执行指令。此外,在主程序线程上使用SuspendThread()也可以无限地挂起它,因此您的代码也不会被执行。
发布于 2022-11-19 04:41:54
有人评论说,如果你失去电源或电脑崩溃,什么也帮不上忙。这不是完全正确的。但在这种情况下,唯一有帮助的是:
在后一种情况下,有两个潜在的问题:
数据库通常支持事务(通常称为COMMIT和ROLLBACK,参见酸),因此,当在保存数据期间发生停电时,它“只是”丢失,但从未覆盖或使以前的保存无效。
https://stackoverflow.com/questions/74471946
复制相似问题