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, я получу ошибку "нарушение доступа" при закрытии приложение.
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