Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Расширенные возможности INI файлов   Найти похожие ветки 

 
П7   (2004-08-03 12:45) [0]

Товарищи!
Кто-нибудь писал или может где видел модуль для полного контроля над содержимым файлов имеющих структуру как у INI.
Вот например мне нужно считать всё содержимое какой-то секции, при этом не имеет значение, правильно там описаны переменные или нет.
Просто в некоторых случаях мне удобнее писать значение чего-либо напрямую в отдельную секцию.

[section]
value_string

Обычным TIniFile этого сделать не удаётся, он, понимаете ли, корректность переменных проверяет.
Можкт кто чего подскажет дельного? Ссылочкой кинется или исходничком?


 
KSergey ©   (2004-08-03 12:48) [1]

Дык так уж он устроен...
Опять же разобрать файл вида

[section]
value_string1
value_string2
value_string3

весьма не сложно.

PS
По-моему даже быстрее, чем искать что-то на торри :)


 
TUser ©   (2004-08-03 12:54) [2]

Не очень понятно, какую корректность он там у тебя проверяет. Чтобы строка не писалась в integer? Да это так. А как же? Прочитать все значение секции через TIniFile тоже можно.


 
П7   (2004-08-03 12:55) [3]


> KSergey ©   (03.08.04 12:48) [1]

Не сложно, но с оптимизацией иметься буду очень долго, а если кто-то давно делал, то наверняка уже и оптимизировали за это время. А скорость всё же критична...


 
Anatoly Podgoretsky ©   (2004-08-03 13:00) [4]

Давай не будем это называть ИНИ файлом, у тебя получается обычный текстовый файл твоего формата. Для работы с текстовыми файлами очень много встроеных средств.


 
KSergey ©   (2004-08-03 13:06) [5]

> [3] П7   (03.08.04 12:55)
> Не сложно, но с оптимизацией иметься буду очень долго, а
> если кто-то давно делал, то наверняка уже и оптимизировали
> за это время. А скорость всё же критична...

Да что тут оптимизировать? Читать построчно - и ничего другого тут не придумаешь. Тем более, что в строке почти ничего разбирать не надо (в отличии от действително ini-файла) - только проверять, не начинается ли строка с "[" и не пуста ли она.


 
П7   (2004-08-03 13:12) [6]


> TUser ©   (03.08.04 12:54) [2]

Он проверяет корректность

[section]
key=value

Если будет как-то иначе, то DELPH"ёвый TIniFile данную строку вообще не воспримет. Это при том, что если на API передавать вместо имени ключа пустую строку, то вернётся как раз то, что нужно. Но только под C++. Под Delphi мне такое провернуть не удалось. TIniFile выдавал ошибку, что мол криво ты параметры прописал. Чё-то мол не то передал в меня из своей тупой программы. Ламер мол ты иди учись... (: А WinAPI"шными средствами просто не читается... Иначе бы так и сделал...


 
TUser ©   (2004-08-03 13:14) [7]

Хорошо. Тогда читай этот файл сам. Он у тебя не ini, значит использовать TIniFile бессмясленно. Не для того он придуман.


 
GuAV ©   (2004-08-03 13:20) [8]


> Да что тут оптимизировать? Читать построчно - и ничего другого
> тут не придумаешь.

Да, причем можно не самому, а используя TStringList.LoadFromFile.


 
raidan ©   (2004-08-03 13:28) [9]

В общеи, ini тут не при чем.
Человек хочет сделать по-деревенски.
TStringList.LoadFromFile, действительно.


 
П7   (2004-08-03 13:42) [10]


> raidan ©   (03.08.04 13:28) [9]

Ини тут очень даже при чём. Ибо как WinAPI поддерживает возможность чтения содержимого секции. По-деревенски делали те, кто писал IniFiles.pas. Ибо всех возможностей не прописали.

То, что возможно мне придётся писать свой модуль для обработки файлов я знаю и без вас, вопрос, пожалуйста прочитайте внимательно. Я прошу ссылку на имеющийся модель, а не флейм на тему, что называть INI файлом. К тому же если уж придираться к словам, то я писал "как у INI", а не INI.

Если не знаете подобных решений, нефиг тему засорять.

Извините, если был несколько резок.


 
Anatoly Podgoretsky ©   (2004-08-03 13:46) [11]

Трудно назвать этих людей деревенщиной.


 
П7   (2004-08-03 15:53) [12]


> Anatoly Podgoretsky ©   (03.08.04 13:46) [11]

Лучше бы помогли, вместо того, чтобы флеймить. Я вот написал модуль парсинга, но как-то он мне не очень нравится. Писал быстро, в торопях. Кому интересно, скачать можно здесь: http://tzlab.amillo.net/delphi/stuff/p7cfg.htm


 
KSergey ©   (2004-08-03 15:56) [13]

Выложи текст сюда
Или там прямо на страничку
А то что-то скачать не могу. Наверное рар не той версии. Да и пас - он и так небольшой...


 
П7   (2004-08-03 16:27) [14]

Лови:

unit p7_cfg;

interface
uses
 SysUtils;

type
 P7CfgIdent = record
   Name : string;
   Value : string;
 end;

 P7CfgSection = record
   Name : string;
   Text : string;
   Items : array of P7CfgIdent;
   Count : integer;
 end;

 P7Cfg = class
   FName : string;
   Items : array of P7CfgSection;
   Count : integer;

   constructor Create( FileName : string );
   destructor Destroy();

   procedure Load();
   function AddSection( Name : string ) : integer;
   function AddIdent( sid : integer; Name, Value : string ) : integer;
   function FindSection( Name : string ) : integer;
   function FindIdent( sid : integer; Name : string ) : integer;

   function ReadString( Section, Ident, Default : string ) : string;
 end;

implementation

constructor P7Cfg.Create( FileName : string );
begin
 FName := FileName;
 Load();
end;

destructor P7Cfg.Destroy();
begin
end;

procedure P7Cfg.Load();
var
 tf : TextFile;
 buf : string;
 csID : integer;
 num : integer;
begin
 csID := -1;

 AssignFile( tf, FName );
 Reset( tf );

 while not EOF( tf ) do
 begin
   ReadLn( tf, buf );
   if buf <> "" then
   begin
     if buf[1] = ";" then
     begin
     end
     else if buf[1] = "[" then
     begin
       csID := AddSection( Copy( buf, 2, Length( buf )-2 ) );
     end
     else if csID > -1 then
     begin
       if Items[csID].Text <> "" then
         Items[csID].Text := Items[csID].Text+#10#13;
       Items[csID].Text := Items[csID].Text+buf;
       num := Pos( "=", buf );
       if num > 0 then
       begin
         AddIdent( csID, Copy( buf, 1, num-1 ), Copy( buf, num+1, Length( buf )-num ) );
       end;
     end;
   end;
 end;

 CloseFile( tf );
end;

function P7Cfg.AddSection( Name : string ) : integer;
begin
 Result := Count;
 inc( Count );
 SetLength( Items, Count );
 Items[Result].Name := Name;
end;

function P7Cfg.AddIdent( sid : integer; Name, Value : string ) : integer;
begin
 Result := Items[sid].Count;
 inc( Items[sid].Count );
 SetLength( Items[sid].Items, Items[sid].Count );
 Items[sid].Items[Result].Name := Name;
 Items[sid].Items[Result].Value := Value;
end;

function P7Cfg.FindSection( Name : string ) : integer;
var
 i : integer;
begin
 Result := -1;
 for i := 0 to Count do
   if Items[i].Name = Name then
   begin
     Result := i;
     break;
   end;
end;

function P7Cfg.FindIdent( sid : integer; Name : string ) : integer;
var
 i : integer;
begin
 Result := -1;
 for i := 0 to Items[sid].Count do
   if Items[sid].Items[i].Name = Name then
   begin
     Result := i;
     break;
   end;
end;

function P7Cfg.ReadString( Section, Ident, Default : string ) : string;
var
 sid, iid : integer;
begin
 Result := Default;
 if Ident <> "" then
 begin
   sid := FindSection( Section );
   if sid > -1 then
   begin
     iid := FindIdent( sid, Ident );
     if iid > -1 then
       Result := Items[sid].Items[iid].Value;
   end;
 end
 else
 begin
   sid := FindSection( Section );
   if sid > -1 then
     Result := Items[sid].Text;
 end;
end;

end.


 
GuAV ©   (2004-08-04 19:30) [15]


> function P7Cfg.AddSection( Name : string ) : integer;
> begin
>  Result := Count;
>  inc( Count );
>  SetLength( Items, Count );
>  Items[Result].Name := Name;
> end;

И Вы, делаете такое, когда время критично?

Имхо нужно юзать наследника tstrings из секций (с внутреним списком tcsection), их содержимое наследник tstrings. данные в списке хранить, а не в дин массиве.


 
П7   (2004-08-05 13:59) [16]


> GuAV ©   (04.08.04 19:30) [15]

Дык вот и просил какой-нибудь юнит мне подсказать, а то у меня всё через "терни к звёздам".


 
GuAV ©   (2004-08-05 15:51) [17]


> Дык вот и просил какой-нибудь юнит мне подсказать, а то
> у меня всё через "терни к звёздам".

Имхо в [1] верная мысль.

я бы делал так
type
 TP7IniFile = class
 private
   FSections: TStringList;
   function GetSection(const Name: string): TStringList;
   function GetSectionByIndex(Index: integer): TStringList;
   function AddSection( Name : string ) : TStrings;
 public
   constructor Create(const FileName: string);
   procedure Load(const FileName: string);
   property Section[const Name: string]: TStringList read GetSection;
   property SectionByIndex[Index: integer]: TStringList read GetSectionByIndex;
 end;

implementation

{ TP7IniFile }

function TP7IniFile.AddSection(Name: string): TStrings;
var S: TStringList;
begin
 Result:=TStringList.Create;
 try
   FSections.AddObject(Name, Result)
 except
   Result.Free;
   raise;
 end;
end;

constructor TP7IniFile.Create(const FileName: string);
begin
 inherited Create;
 Load(FileName);
end;

function TP7IniFile.GetSection(const Name: string): TStringList;
begin
 Result:=TStringList(FSections.Objects[FSections.IndexOf(Name)]);
end;

function TP7IniFile.GetSectionByIndex(Index: integer): TStringList;
begin
 Result:=TStringList(FSections.Objects[Index]);
end;

procedure TP7IniFile.Load(const FileName: string);
begin
 // Твой код тут
end;

{содержимое секций - обычный StringList.
у него есть свойства Names, Values, ValueFromIndex и Text.}



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.042 c
1-1091701953
Anton777
2004-08-05 14:32
2004.08.22
Удаление файлов


9-1083671803
alless
2004-05-04 15:56
2004.08.22
Sprite &amp; Button


1-1092041930
Andy BitOff
2004-08-09 12:58
2004.08.22
Объявления типа. (типа объявление :)))


14-1091519680
DSKalugin
2004-08-03 11:54
2004.08.22
ВАКАНСИЯ!!!


14-1091094948
Nelud
2004-07-29 13:55
2004.08.22
Хоумпейдж сделал.