Delphi: запись в реестр не работает на 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 , но не тогда, когда приложение закрыто (т. е. ничего не сохраняется в реестре). Чего мне не хватает?



The '...- расшифровывается как имя ключа реестра. Поскольку это работает для FormCreate, я не думаю, что это проблема.



Если я добавлю MainForm.Уничтожить в коде программы:



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


Ничего не меняется. Если я также установлю FormDestroy в качестве события OnDestroy MainForm, я получу ошибку "нарушение доступа" при закрытии приложение.

565   6  

6 ответов:

Попробуйте TMainForm.OnCloseQuery вместо:

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

Вы действительно когда-нибудь уничтожаете форму?

По умолчанию формы создаются автоматически, и "закрытие" их не уничтожает, а просто скрывает.

Если вы на самом деле не вызываете "MyForm.Free " или установка действия caFree в событии OnClose, форма никогда не будет уничтожена, и, следовательно, событие OnDestroy никогда не будет уволено, а ваш код никогда не будет вызван.

OnDestroy прекрасно подходит для записи в реестр. происходит что-то еще. Что делает"...- представлять в вашем кодексе?

Поскольку то, что вы описываете, звучит так, будто где-то есть ошибка, Можете ли вы воспроизвести проблему в тестовом приложении?

Следующий код работает как ожидалось (запустите приложение, нажмите кнопку 5-10 раз, чтобы переместить основную форму вправо, закройте приложение, затем запустите его снова, и основная форма будет там, где вы ее оставили).

Создайте приложение VCL forms, поместите на него 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: P.S. И P. P. S.

Что-то еще не так в вашем приложении. Напишите небольшую программу Delphi, которая будет обращаться к реестру в FormDestroy, и вы увидите, что все работает нормально (если нет, у вас будет небольшая программа, которую вы можете опубликовать здесь в качестве примера).

OnCreate и OnDestroy-неподходящие места для загрузки / сохранения значений реестра, влияющих на расположение окна. Вместо этого переопределите методы CreateWnd() и DestroyWnd (). Кроме того, вместо загрузки/сохранения отдельных свойств, таких как Left, используйте функции Win32 API SetWindowPlacement() и GetWindowPlacement (), которые также позволяют точно загружать/сохранять развернутые/свернутые состояния.

Comments

    Ничего не найдено.