2016-12-22 18 views
2

у меня есть этот блок, сохранить настройки в iniFileсохранить данные INIFILE в FireMonkey

/////////////////////////////////////// 
// IniSettings.pas 
// 
// A class for saving settings (or whatever) in an .ini file. 
// 
// This is made in FireMonkey, but should be usable in Delphi too. 
// Example of use in the bottum of the doc. 

unit IniSettings; 

interface 

uses Inifiles; 

type 
    TSettings = class(TMemIniFile) 
    private 
    function GetSomeData: String; 
    procedure SetSomeData(const Value: String); 
    function GetFormTop: Integer; 
    procedure SetFormTop(const Value: Integer); 
    function GetFormLeft: Integer; 
    procedure SetFormLeft(const Value: Integer); 
    function GetFormHeight: Integer; 
    function GetFormWidth: Integer; 
    procedure SetFormHeight(const Value: Integer); 
    procedure SetFormWidth(const Value: Integer); 

    public 
    procedure Save(); 
    property SomeData: String read GetSomeData write SetSomeData; 
    property FormTop: Integer read GetFormTop write SetFormTop; 
    property FormLeft: Integer read GetFormLeft write SetFormLeft; 
    property FormWidth: Integer read GetFormWidth write SetFormWidth; 
    property FormHeight: Integer read GetFormHeight write SetFormHeight; 

    end; 

var 
    Settings: TSettings; 

implementation 

uses 
    FMX.Forms, System.SysUtils; 

{ TSettings } 

// Save to the file 
procedure TSettings.Save; 
begin 
    UpdateFile; 
end; 

// SomeData 
function TSettings.GetSomeData: String; 
begin 
    result := ReadString('Settings', 'SomeData', 'default'); 
end; 

procedure TSettings.SetSomeData(const Value: String); 
begin 
    WriteString('Settings', 'SomeData', Value); 
end; 

// FormTop 
function TSettings.GetFormTop: Integer; 
begin 
    result := ReadInteger('Settings', 'FormTop', 10); 
end; 

procedure TSettings.SetFormTop(const Value: Integer); 
begin 
    WriteInteger('Settings', 'FormTop', Value); 
end; 

// FormLeft 
function TSettings.GetFormLeft: Integer; 
begin 
    result := ReadInteger('Settings', 'FormLeft', 10); 
end; 

procedure TSettings.SetFormLeft(const Value: Integer); 
begin 
    WriteInteger('Settings', 'FormLeft', Value); 
end; 

// FormWidth 
function TSettings.GetFormWidth: Integer; 
begin 
    result := ReadInteger('Settings', 'FormWidth', 640); 
end; 

procedure TSettings.SetFormWidth(const Value: Integer); 
begin 
    WriteInteger('Settings', 'FormWidth', Value); 
end; 

// FormHeight 
function TSettings.GetFormHeight: Integer; 
begin 
    result := ReadInteger('Settings', 'FormHeight', 480); 
end; 

procedure TSettings.SetFormHeight(const Value: Integer); 
begin 
    WriteInteger('Settings', 'FormHeight', Value); 
end; 

initialization 
    // Load/Create the 'settings.ini' file in the app folder 
    Settings := TSettings.Create(ExtractFilePath(ParamStr(0)) + '/settings.ini'); 

finalization 
    // Free the ini before closing 
    FreeAndNil(Settings); 

end. 






/////////////////////////////////////// 
// Example 
// 
// Be sure to include the IniSettings in uses 
// 
// Put an TEdit(Edit1) and 3 TButton(btnLoad, btnSave and btnSaveFile) to the form 
// The edit is for the 'SomeData' we're gonna save in the settings. 
// One button for loading the settings from the MemIniFile, one for saving to MemIniFile 
// and the last for saving the MemIniFile to the physical .ini file on the drive 

uses 
    IniSettings; 

procedure TForm1.btnLoadClick(Sender: TObject); 
begin 
    Edit1.Text := Settings.SomeData; 
    Form1.Top := Settings.FormTop; 
    Form1.Left := Settings.FormLeft; 
    Form1.Width := Settings.FormWidth; 
    Form1.Height := Settings.FormHeight; 
end; 

procedure TForm1.btnSaveClick(Sender: TObject); 
begin 
    Settings.SomeData := Edit1.Text; 
    Settings.FormTop := Form1.Top; 
    Settings.FormLeft := Form1.Left; 
    Settings.FormWidth := Form1.Width; 
    Settings.FormHeight := Form1.Height; 
end; 

procedure TForm1.btnSaveFileClick(Sender: TObject); 
begin 
    Settings.Save; 
end; 

Когда я называю Settings.Save; в приложение силы закрывает и я не могу найти iniFile на устройстве, любая идея, почему я не могу спасти inifile на устройстве? is TSettings.Create(ExtractFilePath(ParamStr(0)) Не применимо на Android? также настройки сохранения, вызывающие UpdateFile Процедура в System.IniFiles единицах это правильный способ сделать?

+2

Вы не можете писать в папку приложений на большинстве современных ОС и особенно на мобильных устройствах. См. Функции в IOUtils, особенно в TPath. –

ответ

6

Неправильная практика сохранения настроек в той же папке, где приложение установлено на любой платформе, скорее всего, эта папка будет защищена от записи для обычного пользователя (например, «файлы программы» на Windows). Правильный способ - использовать папку TPath.GetHomePath из модуля System.IOUtils. Чтобы создать объект Settings, вы должны использовать следующую строку.

Settings := TSettings.Create(TPath.Combine(TPath.GetHomePath, 'YourAppSettings.ini')); 
+0

TPath.GetHomePath возвращает папку, в которую мы можем писать, но это не лучшая папка для хранения .ini-файлов на каждой ОС (даже если она работает). В macOS он возвращает папку '/ Users/MyUserName', и я не хотел бы иметь там все файлы ini-приложений. –

+0

@SebastianZ в UNIX - это обычная практика, чтобы эти файлы были скрыты (текстовые файлы AKA) или помещены в скрытые папки (... dot-directories)? Дело не в том, что мне нравится эта привычка, но так обычно это делается, нет? –

+0

У меня есть несколько точечных файлов и папок в домашнем каталоге OSX. Но большинство приложений используют папки '~/Library/Application Support' и' ~/Library/Preferences'. Пожалуйста, не переустанавливайте эти пути. –

1

Если вы хотите сохранить файл в приложениях, работающих каталог данных (и вы должны, кроме делать это на подножку каталога приложений), вы должны использовать GetHomePath + '/settings.ini';. Для получения дополнительной информации о GetHomePath и TMemIniFile. С наилучшими пожеланиями и надеюсь, что это поможет !!!

+0

Нет, параметр ParamStr (0) не может быть неопределенным. Это всегда полный путь к расположению самого приложения. –

+0

Я вижу, ParamStr (0) является фактическим параметром главного вызова/вызова процесса. В этом случае вы правы @KenWhite !! –