繁体   English   中英

Delphi:写入注册表不能在FormDestroy上工作

[英]Delphi: Writing to Registry Not Working on FormDestroy

procedure TMainForm.FormDestroy(Sender: TObject);
var
  Registry: TRegistry;
begin
  Registry := TRegistry.Create;
  try
    Registry.RootKey := HKEY_CURRENT_USER;
    if Registry.OpenKey('...', True) then
    begin
      Registry.WriteInteger('MainLeft', Self.Left);
      Registry.CloseKey;
    end;
  finally
    Registry.Free;
  end;
end;

类似的代码适用于FormCreate ,但不适用于应用程序关闭时(即没有任何内容保存到注册表)。 我错过了什么?

'...'代表注册表项名称。 由于它适用于FormCreate,我不认为这是一个问题。

如果我将MainForm.Destroy添加到程序代码:

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
  MainForm.Destroy;
end.

没有什么变化。 如果我还将FormDestroy设置为MainForm的OnDestroy事件,则在关闭应用程序时会出现“访问冲突”错误。

你真的在破坏这种形式吗?

默认情况下,表单是自动创建的,“关闭”它们不会破坏它们,它只是隐藏它们。

如果您实际上没有在OnClose事件中调用“MyForm.Free”或将Action设置为caFree,则表单永远不会被破坏,因此OnDestroy事件永远不会被触发,并且您的代码永远不会被调用。

OnDestroy可以写入注册表。 还有其他事情正在发生。 你的代码中有'...'代表什么?

因为您所描述的内容听起来像某个地方有错误, 您能否在测试应用程序中重现问题?

以下代码按预期工作(运行应用程序,单击按钮5-10次以将主窗体移动到右侧,关闭应用程序,然后再次运行它,主窗体位置就在您离开的位置)。

创建一个VCL表单应用程序,在其上放置一个tbutton,调整表单的大小,使其足够大以容纳按钮,并粘贴以下内容以替换unit1:

unit Unit1;

interface

uses
  Windows, Forms, StdCtrls, Classes, Controls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    procedure InitializeVariables;
    procedure FinalizeVariables;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  registry;

procedure TForm1.Button1Click(Sender: TObject);
begin
  self.Left := self.Left + 10;
end;

procedure TForm1.InitializeVariables;
var
  TheReg : tregistry;
begin
  TheReg := tregistry.Create;
  try
    TheReg.RootKey := HKEY_CURRENT_USER;
    if TheReg.OpenKey('\Software\killme', false) then
    begin
      if TheReg.ValueExists('MainLeft') then
        self.Left := TheReg.ReadInteger('MainLeft');
    end;
  finally
    TheReg.Free;
  end;
end;

procedure TForm1.FinalizeVariables;
var
  TheReg : tregistry;
begin
  TheReg := tregistry.Create;
  try
    TheReg.RootKey := HKEY_CURRENT_USER;
    if TheReg.OpenKey('\Software\killme', true) then
      TheReg.WriteInteger('MainLeft', self.Left);
  finally
    TheReg.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  InitializeVariables;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FinalizeVariables;
end;

end.

你的FormDestroy是否完全执行?

RE:PS和PPS

您的应用中出现了其他问题。 编写一个小的Delphi程序,它将访问FormDestroy中的注册表,你会发现一切正常(如果没有,你会有一个小程序,你可以在这里发布作为例子)。

请尝试使用TMainForm.OnCloseQuery:

http://delphi.about.com/od/formsdialogs/a/delphiformlife.htm

OnCreate和OnDestroy不是加载/保存影响窗口定位的注册表值的好地方。 改为覆盖CreateWnd()和DestroyWnd()方法。 此外,不是加载/保存单个属性,如Left,而是使用Win32 API SetWindowPlacement()和GetWindowPlacement()函数,这也允许您准确地加载/保存最大化/最小化状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM