2Pascal-新时代的Pascal

 找回密码
 立即注册
搜索
热搜: fastreport
查看: 1375|回复: 3
打印 上一主题 下一主题

XE8 安卓下如何保存程序的参数?

[复制链接]

1

主题

2

帖子

7

积分

新手上路

Rank: 1

积分
7
跳转到指定楼层
楼主
发表于 2015-6-7 01:45:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
京东购书支持本站
XE8 安卓下如何保存程序的参数?
Windows下我们可以通过ini、xml保存参数,安卓系统下如何保存参数?同时如何读写?
望高手指点。
回复

使用道具 举报

90

主题

293

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
81976
沙发
发表于 2015-6-8 09:13:20 | 只看该作者
京东数码购物支持本站
安卓下也是 INI

[mw_shl_code=delphi,true]unit UnitMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  System.IniFiles,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Objects, System.IOUtils, FMX.Layouts, FMX.Memo;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    Rectangle1: TRectangle;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    FIniFile: TIniFile;
    FIniFileName: string;
    procedure MemoAdd(AText: string);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.MemoAdd(AText: string);
begin
  Memo1.Lines.Add(AText);
  Memo1.GoToTextEnd;
  Application.ProcessMessages;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if RadioButton2.IsChecked then
    FIniFile := TIniFile.Create(FIniFileName, TEncoding.Unicode)
  else
    FIniFile := TIniFile.Create(FIniFileName, TEncoding.ANSI);
  try
    FIniFile.WriteString('test', 'test',
      FormatDateTime('YYYY-MM-DD HH:NN:SS.ZZZ', Now));
    FIniFile.WriteString('cn', 'Text','中文字符串');
    FIniFile.WriteString('中文', '日期',
      FormatDateTime('YYYY年MM月DD日 HH时NN分SS秒ZZZ毫秒', Now));
    //FIniFile.UpdateFile;
  finally
    FreeAndNil(FIniFile);
  end;
  MemoAdd('保存好了,文件名是:' + sLineBreak + FIniFileName);
  MemoAdd('注意重新安装 APK,这个文件会被删除。');
  MemoAdd('解决办法很简单,换个地方保存。');
  MemoAdd('');
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  if RadioButton2.IsChecked then
    FIniFile := TIniFile.Create(FIniFileName, TEncoding.Unicode)
  else
    FIniFile := TIniFile.Create(FIniFileName, TEncoding.ANSI);
  try
    MemoAdd('[test]test 读到的数据是:' + sLineBreak +
      FIniFile.ReadString('test', 'test', ''));
    MemoAdd('');
    MemoAdd('[cn]Text 读到的数据是:' + sLineBreak +
      FIniFile.ReadString('cn', 'Text', ''));
    MemoAdd('');
    MemoAdd('[中文]日期 读到的数据是:' + sLineBreak +
      FIniFile.ReadString('中文', '日期', ''));
    MemoAdd('');
    MemoAdd('');
  finally
    FreeAndNil(FIniFile);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if RadioButton2.IsChecked then
    Memo1.Lines.LoadFromFile(FIniFileName, TEncoding.Unicode)
  else
    Memo1.Lines.LoadFromFile(FIniFileName, TEncoding.ANSI);
  MemoAdd('文件名是:' + sLineBreak + FIniFileName);
  MemoAdd('');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  if FileExists(FIniFileName) then
  begin
    DeleteFile(FIniFileName);
    MemoAdd('文件已成功删除。');
  end
  else
  begin
    MemoAdd('文件不存在或已删除。');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FIniFile := nil;
  FIniFileName := IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetDocumentsPath) + 'my.ini';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(FIniFile) then
  begin
    FreeAndNil(FIniFile);
  end;
end;

end.
[/mw_shl_code]
(C)(P)Flying Wang
回复 支持 反对

使用道具 举报

1

主题

5

帖子

51

积分

注册会员

Rank: 2

积分
51
板凳
发表于 2015-6-8 13:58:01 | 只看该作者
京东数码购物支持本站
动状态读取
IniRec4Rtti.pas
[mw_shl_code=delphi,true]unit IniRec4Rtti;

interface
uses SysUtils,Classes, Rtti,TypInfo;

type
  IniValueAttribute = class(TCustomAttribute)
  private
    FName: string;
    FDefaultValue: string;
    FSection: string;
  published
     constructor Create(const aSection : String;const aName : string;const aDefaultValue : String = '');
     property Section : string read FSection write FSection;
     property Name : string read FName write FName;
     property DefaultValue : string read FDefaultValue write FDefaultValue;
  end;

  EIniRec4Rtti = class(Exception);

  TIniRec4Rtti = class (TObject)
  private
    class procedure SetValue(aData : String;var aValue : TValue);
    class function GetValue(var aValue : TValue) : String;
    class function GetIniAttribute(Obj : TRttiObject) : IniValueAttribute;
  public
    class procedure Load(FileName : String;RecPtr,TypPtr : Pointer);
    class procedure Save(FileName : String;RecPtr,TypPtr : Pointer);
  end;
implementation
uses IniFiles;

{ IniValueAttribute }

constructor IniValueAttribute.Create(const aSection, aName,
  aDefaultValue: String);
begin
  FSection := aSection;
  FName := aName;
  FDefaultValue := aDefaultValue;
end;

{ TIniRec4Rtti }

class function TIniRec4Rtti.GetIniAttribute(
  Obj: TRttiObject): IniValueAttribute;
var
Attr: TCustomAttribute;
begin
for Attr in Obj.GetAttributes do
begin
    if Attr is IniValueAttribute then
    begin
      exit(IniValueAttribute(Attr));
    end;
end;
result := nil;
end;

class function TIniRec4Rtti.GetValue(var aValue: TValue): String;
begin
   if aValue.Kind in [tkWChar, tkLString, tkWString, tkString, tkChar,
                    tkUString, tkInteger, tkInt64, tkFloat, tkEnumeration,
                    tkSet]  then
   result := aValue.ToString
   else raise EIniRec4Rtti.Create('Type not Supported');
end;

class procedure TIniRec4Rtti.Load(FileName: String;RecPtr, TypPtr: Pointer);
var
ctx : TRttiContext;
RT : TRttiType;
RF  : TRttiField;
Value : TValue;
IniValue : IniValueAttribute;
Ini : TIniFile;
Data : String;
begin
   ctx := TRttiContext.Create;
   try
     Ini := TIniFile.Create(FileName);
     try
       RT := ctx.GetType( TypPtr );
       if not  Assigned(RT) or
         (Assigned(RT) and not RT.IsRecord ) then
         Exit;

       for RF in RT.AsRecord.GetFields do
       begin
         IniValue := GetIniAttribute(RF);
         if Assigned(IniValue) then
         begin
            Data := Ini.ReadString(IniValue.Section,IniValue.Name,IniValue.DefaultValue);
            Value := RF.GetValue(RecPtr);
            SetValue(Data,Value);
            RF.SetValue(RecPtr,Value);
         end;
       end;
     finally
       Ini.Free;
     end;
   finally
     ctx.Free;
   end;
end;


class procedure TIniRec4Rtti.Save(FileName : String;RecPtr,TypPtr : Pointer);
var
ctx : TRttiContext;
RT : TRttiType;
RF : TRttiField;
Value : TValue;
IniValue : IniValueAttribute;
Ini : TIniFile;
Data : String;
begin
ctx := TRttiContext.Create;
try
   Ini := TIniFile.Create(FileName);
   try
     RT := ctx.GetType(TypPtr);
     if not  Assigned(RT) or
         (Assigned(RT) and not RT.IsRecord ) then
         Exit;

     for RF in RT.AsRecord.GetFields do
     begin
       IniValue := GetIniAttribute(RF);
       if Assigned(IniValue) then
       begin
          Value := RF.GetValue(RecPtr);
          Data := GetValue(Value);
          Ini.WriteString(IniValue.Section,IniValue.Name,Data);
       end;
     end;
   finally
     Ini.Free;
   end;
finally
   ctx.Free;
end;
end;

class procedure TIniRec4Rtti.SetValue(aData: String; var aValue: TValue);
var
I : Integer;
begin
case aValue.Kind of
   tkWChar,
   tkLString,
   tkWString,
   tkString,
   tkChar,
   tkUString : aValue := aData;
   tkInteger,
   tkInt64  : aValue := StrToInt64Def(aData,0);
   tkFloat  : aValue := StrToFloatDef(aData,0.00);
   tkEnumeration:  aValue := TValue.FromOrdinal(aValue.TypeInfo,GetEnumValue(aValue.TypeInfo,aData));
   tkSet: begin
             i :=  StringToSet(aValue.TypeInfo,aData);
             TValue.Make(@i, aValue.TypeInfo, aValue);
          end;
   else raise EIniRec4Rtti.Create('Type not Supported');
end;
end;

end.[/mw_shl_code]

参数文件
[mw_shl_code=delphi,true]unit uConfigClass;

interface
uses
   IniRec4Rtti, SysUtils,Classes,System.Variants,System.IOUtils, System.IniFiles;
type

  TSetupInfo = record
    [IniValue('User','Username','')]
    Username:string;
    [IniValue('User','Password','')]
    Password:string;

   procedure Load;
   procedure Save;
  end;

implementation

{ TRemoteInfo }

procedure TSetupInfo.Load;
var
  IniFile:TIniFile;
  FilePath:string;
begin
  FilePath:=IncludeTrailingPathDelimiter(TPath.GetDocumentsPath)+'Config.ini';

  if not FileExists(FilePath) then
  begin
    try
      IniFile := TIniFile.Create(FilePath);
    finally
      IniFile.Free;
    end;
  end;

  TIniRec4Rtti.Load(IncludeTrailingPathDelimiter(TPath.GetDocumentsPath)+'Config.ini',@Self,TypeInfo(TSetupInfo));
end;

procedure TSetupInfo.Save;
begin
  TIniRec4Rtti.Save(IncludeTrailingPathDelimiter(TPath.GetDocumentsPath)+'Config.ini',@Self,TypeInfo(TSetupInfo));
end;

end.[/mw_shl_code]

然后可以这么调用
SetupInfo: TSetupInfo;

读SetupInfo.UserName
写时赋值给SetupInfo.UserName,然后SetupInfo.Save;
回复 支持 反对

使用道具 举报

2

主题

9

帖子

58

积分

版主

Rank: 7Rank: 7Rank: 7

积分
58
地板
发表于 2015-6-12 09:48:48 | 只看该作者
京东数码购物支持本站
我用sqlite数据库保存和读取。强大无比,还可以缓存表等等。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|新时代Pascal论坛

GMT+8, 2024-5-10 06:09 , Processed in 0.078195 second(s), 23 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表