Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с INI файлами


Автор: Lonley 23.6.2004, 23:01
Здравствуйте smile.gif

Код

 Ini   : TIniFile;
.....

  INI.ReadSections(....);

в частности интересует как работает процедура ReadSection или ReadSections
для чего они нужны sad.gif если можно то с примером
---------------------

и существует ли возможность считать НАЗВАНИЕ ключей, узнать количество незная ИХ

Автор: NiJazz 23.6.2004, 23:12
Lonley
Кажется, встроенную справку в Delphi еще никто не отменял. smile.gif

procedure ReadSection (const Section: String; Strings: TStrings); override;
Считывает названия ключей из определенной секции INI-файла в список строк Strings.

procedure ReadSections(Strings: TStrings); override;
Считывает названия ключей из всех секций INI-файла в список строк Strings.

Вот пример из справки:
Код
uses IniFiles;
procedure TForm1.FormActivate(Sender: TObject);

var
 AppIni: TIniFile;
begin
 AppIni := TIniFile.Create('WIN.INI');
 AppIni.ReadSections(ListBox1.Items);
 AppIni.ReadSection('Ports',Listbox2.Items);
 AppIni.ReadSectionValues('Ports',ListBox3.Items);
 AppIni.Free;
end;



Автор: Lonley 24.6.2004, 00:47
NiJazz СПАСИБО
впредь буду смотреть smile.gif
--------------------------------------
Неполучается использовать переменную класса TStrings
у нее должны быть свойства Names и Values как раз для работы с ИНИШКАМИ
, но не получается что ли ее инициализировать
Код

Var
  SKP  : TSes_Key_Par;
  SPar : TStrings;
begin
{}
  Ini  := TIniFile.Create('c:\wert.ini');
  SPar := TStrings.Create;
  SPar.Capacity := 20;
  Ini.ReadSection('w1',SPar);  

выдает ошибку ABstract ERRROR sad.gif что еще нужно не пойму

Автор: stab 24.6.2004, 01:34
Lonley, используй TStringList.

Автор: Lonley 24.6.2004, 01:46
СПАСИБО ВСЕМ Я УЖЕ пронял только почему в книгах не пишут что этот класс не для работы

Автор: Albinos_x 24.6.2004, 01:48
cully был прав

Автор: Medved 24.6.2004, 05:36
Прежде чем работать с экземпляром объекта TStrings, надо устанавливить его размер с помощью функии SetLength.

Автор: Lonley 24.6.2004, 13:59
Цитата(Pegas @ 24.6.2004, 05:36)
Прежде чем работать с экземпляром объекта TStrings, надо устанавливить его размер с помощью функии SetLength.

это получается установка размера массива точно также как в динамических массивах
Я прав thumbs-up.gif

Автор: Lonley 24.6.2004, 14:37
Pegas

У меня куча книг, но там сказано только про динамические массивы а установка функцией
SetLength переменной класса TStrings не удается из-за несовместимости типов
Код

Var
  //SKP  : TSes_Key_Par;
  SPar  : TStringList;
  gg    : Integer;
----------------------------
  SPr2  : TStrings;
----------------------------
begin
{}
 SetLength (SPr2,....) - выдает ошибку

пожалуйста подскажите как сделать правильно

Автор: stab 24.6.2004, 16:07
через TStringList...

Код

uses IniFiles;

procedure TForm1.Button1Click(Sender: TObject);
var
 ini: TIniFile;
 strs: TStringList;
 i: Integer;
begin
 ini := TIniFile.Create('c:\test.ini');
 strs := TStringList.Create;
 ini.ReadSection('section name', strs);
 for i := 0 to strs.Count - 1 do
   ShowMessage(strs[i]);
 strs.Free;
 ini.Free;
end;

Автор: Lonley 24.6.2004, 21:57
Цитата(cully @ 24.6.2004, 16:07)
через TStringList...

Код

uses IniFiles;

procedure TForm1.Button1Click(Sender: TObject);
var
 ini: TIniFile;
 strs: TStringList;
 i: Integer;
begin
 ini := TIniFile.Create('c:\test.ini');
 strs := TStringList.Create;
 ini.ReadSection('section name', strs);
 for i := 0 to strs.Count - 1 do
   ShowMessage(strs[i]);
 strs.Free;
 ini.Free;
end;


Гм.... но это я сделал как только мне сказали про StringList, но Pegas cазал
Цитата

Прежде чем работать с экземпляром объекта TStrings, надо устанавливить его размер с помощью функии SetLength.

так сначит всетаки можно butbut.gif

Автор: StayAtHome 25.6.2004, 00:38
Цитата
так сначит всетаки можно

НЕТ! IMHO, Pegas ошибся. TStrings -- абстрактный класс, который невозможно напрямую создавать. Исользуй только TStringList. Хотя, можно попробовать так:
Код

var
 Strings: TStrings;
.....
Strings:=TStringList.Create;



Такой финт может потребоваться для обратной совместимости с родительскими свойствами, но обычно -- не требуется.

Если я в чем-то не прав, -- пишите.

Автор: Lonley 25.6.2004, 01:39
Всем спасибо.... thumbs-up.gif

Автор: Medved 25.6.2004, 06:09
Цитата(StayAtHome @ 25.6.2004, 03:38)
Цитата
так сначит всетаки можно

НЕТ! IMHO, Pegas ошибся. TStrings -- абстрактный класс, который невозможно напрямую создавать. Исользуй только TStringList.

Если я не ошибаюсь, с ним можно работать (по крайней мере в 5-ке я с ним работал) Только прежде необходимо задать его размерность. Если честно, то я забыл, как я это делал.

А вообще, согласен, необходимо использовать TStringList.

Автор: _hunter 25.6.2004, 16:11
может после 5-й компонент поменялся, но это дейсвительно абстрактный класс

Автор: RA 26.6.2004, 23:20
Вообще есть очень хороший компонент для работы с ini, замена стандартному IniFiles (Работать с ним также);



Автор: StayAtHome 27.6.2004, 01:51
RAdmin
А стоит ли для такой небольшой задачи, как работа с ини файлами юзать еще один сторонний компонент? ИМХО, возможностей TIniFile, а лучше TMemIniFile должно хватать в большинстве случаев. А не хватает -- дык наследование еще никто не отменял wink.gif

Автор: RA 27.6.2004, 12:36
Цитата(StayAtHome @ 26.6.2004, 22:51)
RAdmin
А стоит ли для такой небольшой задачи, как работа с ини файлами юзать еще один сторонний компонент? ИМХО, возможностей TIniFile, а лучше TMemIniFile должно хватать в большинстве случаев. А не хватает -- дык наследование еще никто не отменял wink.gif

Ну незнаю , помойму этот компонент очень сильно упрощает жизнь.
сам компонент, ничё супер сложного, но зато время экономит

Вот это новые процедуры:
Код


- function ReadData(): Integer;
- function ReadStream(): Integer;
- function ReadDouble(): Double;
- function ReadDateTime(): TDateTime;
- procedure ReadStrings(Section, Ident: string; List: TStrings);
- procedure ReadFont(Section, Ident: string; Font: TFont);
- function WriteData(): Integer;
- function WriteStream(): Integer;
- procedure WriteDouble();
- procedure WriteDateTime();
- procedure WriteStrings();
- procedure WriteFont();



Все данные записанные в INI шифруются (Если порыться в сорсах компонента то можно это отменить)

Размер ини файла неограничен стандартом в 64kb.

Автор: StayAtHome 27.6.2004, 14:22
biggrin.gif
Код
TCustomIniFile = class(TObject)
.......
   function ReadString(const Section, Ident, Default: string): string; virtual; abstract;
   procedure WriteString(const Section, Ident, Value: String); virtual; abstract;
   function ReadInteger(const Section, Ident: string; Default: Longint): Longint; virtual;
   procedure WriteInteger(const Section, Ident: string; Value: Longint); virtual;
   function ReadBool(const Section, Ident: string; Default: Boolean): Boolean; virtual;
   procedure WriteBool(const Section, Ident: string; Value: Boolean); virtual;
   function ReadBinaryStream(const Section, Name: string; Value: TStream): Integer; virtual;
   function ReadDate(const Section, Name: string; Default: TDateTime): TDateTime; virtual;
   function ReadDateTime(const Section, Name: string; Default: TDateTime): TDateTime; virtual;
   function ReadFloat(const Section, Name: string; Default: Double): Double; virtual;
   function ReadTime(const Section, Name: string; Default: TDateTime): TDateTime; virtual;
   procedure WriteBinaryStream(const Section, Name: string; Value: TStream); virtual;
   procedure WriteDate(const Section, Name: string; Value: TDateTime); virtual;
   procedure WriteDateTime(const Section, Name: string; Value: TDateTime); virtual;
   procedure WriteFloat(const Section, Name: string; Value: Double); virtual;
   procedure WriteTime(const Section, Name: string; Value: TDateTime); virtual;
.............
 end;

Это из IniFiles.pas идущего с Delphi wink.gif
Данные не шифруются, но нужно ли это? Хочешь скрыть свои настройки -- пиши в типизированный файл.
TMemIniFile (потомок TCustomIniFile) не имеет ограничения в 64 KB :-)
И ничего стороннего ставить не надо. wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)