Текущий архив: 2005.08.21;
Скачать: CL | DM;
Вниз
Сохранение настроек в ini Найти похожие ветки
← →
Viktop (2005-08-02 17:27) [0]1. Как можно в ini-файл записать StringList?
Я делаю так: S:=S+StringList.Strings[i]+"#" (#-разделитель строк). Полученную строку S сохраняю в ini-файл, а при загрузке программы разбиваю на строки. Может есть более удобный вариант?
2. Как сохранить TreeView в ini файл со всеми значками?
Пока сохраняю TreeView в поток, а потом поток сохраняю на диск.procedure TForm1.Button1Click(Sender: TObject);
var
F: TFileStream;
begin
F := TFileStream.Create("c:\TreeView.txt", fmCreate or fmShareCompat);
try
F.WriteComponent(TreeView1);
finally
F.Free;
end;
end;
← →
Fay © (2005-08-02 17:30) [1]2 Viktop (02.08.05 17:27)
TIniFile ?
← →
Viktop (2005-08-02 17:35) [2]Да, использую TIniFile.
← →
Fay © (2005-08-02 17:39) [3]2 Viktop (02.08.05 17:35) [2]
Строки можешь складывать в отдельную секцию.
З.Ы.
А ВаЩе, пиши в реестр.
← →
Viktop (2005-08-02 18:38) [4]>> Строки можешь складывать в отдельную секцию.
А потом грузить их в StringList. Понятно
>> А ВаЩе, пиши в реестр.
В реестре и так много хлама :)
А второй вопрос?
← →
Fay © (2005-08-02 18:50) [5]2 Viktop (02.08.05 18:38) [4]
1) В реестре и так много хлама :)
Так положи что-нибудь полезное!
2) Можно по-разному. Хоть так
[TreeView1]
Node1=Parent 0, Image -1, BlahBlahBlah 1231231, ...
Node2=Parent 1, Image -1, BlahBlahBlah 9348093, ...
← →
Alexander Panov © (2005-08-02 19:37) [6]Viktop (02.08.05 17:27)
GetPrivateProfileStruct/WritePrivateProfileStruct
Как для 1-го, так и для второго вопроса.
← →
Джо © (2005-08-02 20:28) [7]А почему бы не сделать так:
unit IniFilesEx;
interface
uses SysUtils, Classes, IniFiles;
type
TIniFileEx = class (TIniFile)
public
procedure WriteStrings (const AStrings: TStrings; const ASection, AName: string);
procedure ReadStrings (const AStrings: TStrings; const ASection, AName: string);
end;
implementation
{ TIniFileEx }
procedure TIniFileEx.ReadStrings(const AStrings: TStrings; const ASection,
AName: string);
var
AStream: TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
ReadBinaryStream(ASection,AName,AStream);
AStream.Seek(0,soFromBeginning);
AStrings.LoadFromStream(AStream);
finally
AStream.Free
end;
end;
procedure TIniFileEx.WriteStrings(const AStrings: TStrings; const ASection, AName: string);
var
AStream: TMemoryStream;
begin
AStream := TMemoryStream.Create;
try
AStrings.SaveToStream(AStream);
AStream.Seek(0,soFromBeginning);
WriteBinaryStream(ASection,AName,AStream);
finally
AStream.Free
end;
end;
end.
Пример:
uses ...,IniFilesEx;
...
procedure TForm1.Button1Click(Sender: TObject);
var
IniEx: TIniFileEx;
begin
IniEx := TIniFileEx.Create("d:\test");
try
IniEx.WriteStrings(Memo1.Lines,"Strings","Item");
IniEx.ReadStrings(Memo2.Lines,"Strings","Item");
finally
IniEx.Free
end;
end;
← →
TUser © (2005-08-02 20:32) [8]По поводу реестра - имхо, лучше глобальные (для всех пользователей) и при этом изменяемые иногда настройки/параметры хранить в ini, т.к. доступ на запись в HKLM дядька-админ легко может закрыть (как деляю я), а потом долго ругаться по поводу того, что криворукие программеры туда что-то пишут. Тоже самое касается папки, где лежит exe-файл. Потому лучше пишите такие вещи в ini файле где-нибудь в D&S\AllUsers\
← →
Джо © (2005-08-03 02:05) [9]
> Viktop (02.08.05 17:27)
По поводу 2-го вопроса. Попробуй сохранить во временный TMemoryStream, а затем - TIniFile.WriteBinaryStream (...)
← →
ASDQWE (2005-08-03 03:07) [10]ГЫ
Ini: TIniFile;
begin
ini := TIniFile.Create("cfg.ini");
with GameIni do
begin
for I:=0 to StringlistCount-1 do begin
WriteString("Options", "Sound", StringlistCount[i]);
end;
Free;
end;
end;
← →
Джо © (2005-08-03 03:09) [11]
> [10] ASDQWE (03.08.05 03:07)
> ГЫ
Не "гы", а бред.
← →
Viktop (2005-08-03 06:20) [12]to Alexander Panov
А можно пример (справка go Delphi молчит)
to Джо
Спасибо, попробую
to All
Если хранить настройки в другой папке (реестре), то эти настроики скорее всего останутся и будут захламлять диск/реестр (Uninstaller не поможет, т.к. он удаляет файлы которы сам скопировал, а ini создаётся после выхода)
Да и проще будет прогу копировать/удалять (удалить/скопировать папку с прогой и всё будет работать на другой машине)
← →
Viktop (2005-08-03 07:34) [13]Сохранение StringList в ini-файл получилось (спасибо Джо). А второйвопрос - нет. Попробовал так:
procedure TForm1.Button1Click(Sender: TObject);
var
ini:TIniFile;
s: TMemoryStream;
begin
ini:=TIniFile.Create("c:\1.ini");
S := TMemoryStream.Create;
S.WriteComponent(TreeView);
ini.WriteBinaryStream("Settings","tree",s);
ini.Free;
S.Free;
end;
И получается пустой ini-файл:[Settings]
tree=
← →
Viktop (2005-08-03 07:42) [14]Попробовал записать memo в ini-файл, но записались только первые 16 кб. Как можно преодолеть этот размер?
← →
Alexander Panov © (2005-08-03 11:20) [15]Viktop (03.08.05 6:20) [12]
function GetParmList(const IniName,aSec,aParm:String;List: TStrings): Boolean;
var
Len: Integer;
s: String;
begin
Result := False;
Len := GetPrivateProfileInt(PChar(aSec),PChar(aParm+"_Len"),0,PChar(IniName));
if Len=0 then Exit;
SetLength(s,Len);
Result := Boolean(GetPrivateProfileStruct(PChar(aSec),PChar(aParm),@s[1],Len,PChar(IniName)));
if Result then List.Text := s;
end;
function WriteParmList(const IniName,aSec,aParm:String;List: TStrings):Boolean;
var
Len: Integer;
s: String;
begin
Result := False;
Len := Length(List.Text);
if Len=0 then Exit;
s := List.Text;
if WritePrivateProfileString(
PChar(aSec),
PChar(aParm+"_Len"),PChar(IntToStr(len)),PChar(IniName)) then
Result := Boolean(WritePrivateProfileStruct(PChar(aSec),PChar(aParm),@s[1],Len,PChar(IniName)));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WriteParmList("d:\test.ini","Main","List",Memo1.Lines);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
GetParmList("d:\test.ini","Main","List",Memo1.Lines);
end;
← →
Alexander Panov © (2005-08-03 11:28) [16]Можно обйтись и без дополнительного параметра длины буфера, если в начало буфера добавить его длину.
← →
Viktop (2005-08-03 12:53) [17]Спасибо всем. Разобрался
← →
Джо © (2005-08-03 14:34) [18]
> [13] Viktop (03.08.05 07:34)
> А второйвопрос - нет. Попробовал так:
> ...
> И получается пустой ini-файл:
> [Settings]
> tree=
Забыл Стрим переместить в начальную позицию. Сделай так:
procedure TForm1.Button1Click(Sender: TObject);
var
ini:TIniFile;
s: TMemoryStream;
begin
ini:=TIniFile.Create("c:\1.ini");
S := TMemoryStream.Create;
S.WriteComponent(TreeView1);
S.Seek(0,soFromBeginning);
ini.WriteBinaryStream("Settings","tree",s);
ini.Free;
S.Free;
end;
← →
Alexander Panov © (2005-08-03 14:55) [19]Джо © (03.08.05 14:34) [18]
S.Seek(0,soFromBeginning);
S.Position := 0;
← →
Джо © (2005-08-03 16:06) [20]
> [19] Alexander Panov © (03.08.05 14:55)
Да, забыл про Позишн ;-). Впрочем, неважно.
Страницы: 1 вся ветка
Текущий архив: 2005.08.21;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.042 c