![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение настроек в ini [D7, WinXP]
Viktop © (2005-08-02 17:27:00)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;
Джо (2005-08-03 16:06:00) [1]
> [19] Alexander Panov © (03.08.05 14:55)
Да, забыл про Позишн ;-). Впрочем, неважно.
Alexander Panov (2005-08-03 14:55:00) [2]Джо © (03.08.05 14:34) [18]
S.Seek(0,soFromBeginning);
S.Position := 0;
Джо (2005-08-03 14:34:00) [3]
> [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;
Viktop (2005-08-03 12:53:00) [4]Спасибо всем. Разобрался
Alexander Panov (2005-08-03 11:28:00) [5]Можно обйтись и без дополнительного параметра длины буфера, если в начало буфера добавить его длину.
Alexander Panov (2005-08-03 11:20:00) [6]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;
Viktop (2005-08-03 07:42:00) [7]Попробовал записать memo в ini-файл, но записались только первые 16 кб. Как можно преодолеть этот размер?
Viktop (2005-08-03 07:34:00) [8]Сохранение 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 06:20:00) [9]to Alexander Panov
А можно пример (справка go Delphi молчит)
to Джо
Спасибо, попробую
to All
Если хранить настройки в другой папке (реестре), то эти настроики скорее всего останутся и будут захламлять диск/реестр (Uninstaller не поможет, т.к. он удаляет файлы которы сам скопировал, а ini создаётся после выхода)
Да и проще будет прогу копировать/удалять (удалить/скопировать папку с прогой и всё будет работать на другой машине)
Джо (2005-08-03 03:09:00) [10]
> [10] ASDQWE (03.08.05 03:07)
> ГЫ
Не "гы", а бред.
ASDQWE (2005-08-03 03:07:00) [11]ГЫ
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 02:05:00) [12]
> Viktop (02.08.05 17:27)
По поводу 2-го вопроса. Попробуй сохранить во временный TMemoryStream, а затем - TIniFile.WriteBinaryStream (...)
TUser (2005-08-02 20:32:00) [13]По поводу реестра - имхо, лучше глобальные (для всех пользователей) и при этом изменяемые иногда настройки/параметры хранить в ini, т.к. доступ на запись в HKLM дядька-админ легко может закрыть (как деляю я), а потом долго ругаться по поводу того, что криворукие программеры туда что-то пишут. Тоже самое касается папки, где лежит exe-файл. Потому лучше пишите такие вещи в ini файле где-нибудь в D&S\AllUsers\
Джо (2005-08-02 20:28:00) [14]А почему бы не сделать так:
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;
Alexander Panov (2005-08-02 19:37:00) [15]Viktop (02.08.05 17:27)
GetPrivateProfileStruct/WritePrivateProfileStruct
Как для 1-го, так и для второго вопроса.
Fay (2005-08-02 18:50:00) [16]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, ...
Viktop (2005-08-02 18:38:00) [17]>> Строки можешь складывать в отдельную секцию.
А потом грузить их в StringList. Понятно
>> А ВаЩе, пиши в реестр.
В реестре и так много хлама :)
А второй вопрос?
Fay (2005-08-02 17:39:00) [18]2 Viktop (02.08.05 17:35) [2]
Строки можешь складывать в отдельную секцию.
З.Ы.
А ВаЩе, пиши в реестр.
Viktop (2005-08-02 17:35:00) [19]Да, использую TIniFile.
Fay (2005-08-02 17:30:00) [20]2 Viktop (02.08.05 17:27)
TIniFile ?