Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1122389458
Makhanev A.S.
2005-07-26 18:50
2005.08.21
Проблема с ЖК монитором


1-1122890294
Dust
2005-08-01 13:58
2005.08.21
народ, оцените код


1-1122394424
Logan
2005-07-26 20:13
2005.08.21
Как сделать чтобы при загрузке текста в ричидит, текст не менялся


6-1115562063
Isaev
2005-05-08 18:21
2005.08.21
Dual-up


4-1119846375
leonidus
2005-06-27 08:26
2005.08.21
Как отследить двойное нажатие клавиши Shift