如果这已经在SO上访问了,请指出我,因为我似乎无法找到它。话虽如此:
使用标准的delphi应用程序事件以及Mobile app lifecycle events handling,我试图找到读取和写入INI文件的最佳位置?
在测试时,我创建了一个带有按钮的演示应用程序,该按钮增加了一个计数变量并将其显示在一条显示消息中
procedure TfrmMain.Button1Click(Sender: TObject);
begin
inc(Count);
ShowMessage(IntToStr(Count));
end;
在主要形式的OnCreate中,我阅读了inifile
procedure TfrmMain.FormCreate(Sender: TObject);
var
Ini: TIniFile;
begin
Ini := TIniFile.Create( TPath.GetDocumentsPath + PathDelim + 'fortysixtozero.ini' );
try
Count := Ini.ReadInteger( 'Main', 'Count', 0 );
finally
Ini.Free;
end;
end;
现在,知道移动应用程序可以有不同的状态,我想知道编写ini文件的最佳位置在哪里?
答案 0 :(得分:7)
保存应用程序状态或商店设置的最佳状态是" aeEnteredBackground "。我在这里使用了delphi FMX事件。您还应该检查" aeWillBecomeInactive "和" aeWillTerminate "事件,但第一个是最相关的。当另一个应用程序打开或者您的应用程序关闭时,应用程序进入后台(它们不会立即终止)。
选中article。
侦听事件的代码如下所示:
function TfMain.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
begin
case AAppEvent of
aeFinishedLaunching: ;
aeBecameActive: ;
aeWillBecomeInactive: ;
aeEnteredBackground: ;
aeWillBecomeForeground: ;
aeWillTerminate: ;
aeLowMemory: ;
aeTimeChange: ;
aeOpenURL: ;
end;
Result := True;
end;
要附加侦听器,请使用平台服务:
if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(SvcEvents)) then
SvcEvents.SetApplicationEventHandler(HandleAppEvent);
只需添加" FMX.Platform"你的使用条款。
答案 1 :(得分:4)
在Delphi XE7中,有一个" OnSaveState"表格活动。这是保存应用程序数据的首选位置,因为它将在iOS应用程序进入"背景"州。文档非常有用...搜索"保存状态"。
以下是我在主窗体的OnCreate处理程序中的代码:
procedure TMainWindow.FormCreate( Sender : TObject );
var
IniFile : TIniFile;
Metric : BOOLEAN;
IniFileName : STRING;
Reader : TBinaryReader;
begin
fInitializing := True;
SaveState.StoragePath := TPath.GetLibraryPath;
if SaveState.Stream.Size > 0 then begin
Reader := TBinaryReader.Create( SaveState.Stream );
try
Metric := Reader.ReadBoolean;
vMetricUnits.IsChecked := Metric;
SetSliderLimits( Metric );
Temperature := Reader.ReadDouble;
Dewpoint := Reader.ReadDouble;
Humidity := Reader.ReadDouble;
WindSpeed := Reader.ReadDouble;
finally
Reader.Free;
end;
end
else begin
Metric := False;
vMetricUnits.IsChecked := Metric;
SetSliderLimits( Metric );
Temperature := 70;
Dewpoint := 70;
Humidity := 100;
WindSpeed := 0;
end;
SetMetricUnits( cMetricUnits );
fInitializing := False;
WriteTrackbarCaptions;
CalculateTemperatures;
end;
以下是表单的OnSaveState处理程序中的代码:
procedure TMainWindow.FormSaveState( Sender : TObject );
var
Writer : TBinaryWriter;
begin
SaveState.Stream.Clear;
Writer := TBinaryWriter.Create( SaveState.Stream );
try
Writer.Write( cMetricUnits );
Writer.Write( Temperature );
Writer.Write( Dewpoint );
Writer.Write( Humidity );
Writer.Write( WindSpeed );
finally
Writer.Free;
end;
end;
我已经在iPad和Windows上测试了它,它可以在两个平台上运行。这样做完全避免了.ini文件的使用,但它确实在Windows版本中创建了一个奇怪的名称.tmp文件。我假设iPad上也创建了一个等效的文件。