在Delphi Firemonkey移动应用程序中读写一个inifile?

时间:2014-04-09 15:40:05

标签: android ios delphi firemonkey delphi-xe5

如果这已经在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文件的最佳位置在哪里?

2 个答案:

答案 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上也创建了一个等效的文件。