Текущий архив: 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.056 c