![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ini-file
vasIZmax © (2007-09-15 23:50:00)Подскажите как можно посчитать секции в ini-файле?
Файл выглядит таким образом:
[id1]
******
[id2]
******
.......
[id340]
****
Пробую ini.ReadSections(listBox1.Items); выводит все секции какие есть в листбокс, это хорошо. А вот количество таких секций сколько будет? Или считывать в листбокс, а потом в нем посчитать строчки?
ЗЫ. надо что бы по нажатию на кнопку появлялось случайное сообщение записанное в ини-файле, т.е. showmessage (ini.ReadString('id'+random(от_общего_количества_секций), 'task', 'default value'));
Sairex (2007-10-08 12:51:00) [1]Вроде бы в модуле INIFiles есть функция которая выводит количество секций(параметров) или я ошибаюсь...
vasIZmax (2007-09-16 13:45:00) [2]> {RASkov} © (16.09.07 11:38) [4]
спс, буду разбираться.
> Anatoly Podgoretsky © (16.09.07 11:44) [5]
Я не стал приводить полностью вид ини, а в общих чертах его описал. На самом деле в каждой секции несколько параметров (на данный момент = 7). А вот насчет 64 кб - это спс, что предупредили, мог "накосячить" по незнанию своему.
> Anatoly Podgoretsky © (16.09.07 12:24) [7]
Стратегия неважная, но проста в реализации. Первоначально хотел все делать через БД, но программа ненастолько ценная, что бы еще с БД "заморачиваться", а с ини и на другую машину-то перенести - раз плюнуть, меньше головной боли...
Anatoly Podgoretsky (2007-09-16 12:24:00) [3]> DrPass (16.09.2007 12:06:06) [6]
Cложно что ли, с дуру и лом можно сломать.
Но я то говорил не о 64К, это было просто дополнением, а о извращеной стратегии построения ини, когда параметры стали секциями.
DrPass (2007-09-16 12:06:00) [4]
> При таком подходе ты быстро споткнешься на ограничение в
> 64Кб
Это еще надо постараться в ini-файл поместить параметров на 64Кб :)
Anatoly Podgoretsky (2007-09-16 11:44:00) [5]> vasIZmax (15.09.2007 23:50:00) [0]
Странное решение, обычно делают одну секцию и множестов параметров.
При таком подходе ты быстро споткнешься на ограничение в 64Кб и половина информации не нужная, рассходуется на секции, вместо параметров.
{RASkov} (2007-09-16 11:38:00) [6]> [2] vasIZmax © (16.09.07 00:41)
> Думал другие варианты есть.
Есть... держи
function GetCountIniSections(const FFileName: TFileName): Integer;
const BufSize = 16384;
var Buffer, P: PChar;
begin
GetMem(Buffer, BufSize);
Result:=0;
try
if GetPrivateProfileString(nil, nil, nil, Buffer, BufSize, PChar(FFileName)) <> 0 then begin
P := Buffer;
try
while P^ <> #0 do begin
INC(P, StrLen(P) + 1);
INC(Result);
end;
except Result:=0; end;
end;
finally
FreeMem(Buffer, BufSize);
end;
end;
:)
Использовать так:
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists(<name.ini>) then
ShowMessage(IntToStr(GetCountIniSections(<name.ini>)))
else ShowMessage('No File');
end;
Германн (2007-09-16 01:15:00) [7]
> Думал другие варианты есть.
Есть и другие, но этот самый простой и лучший.
vasIZmax (2007-09-16 00:41:00) [8]> DrPass © (16.09.07 00:22) [1]
Сделал так
d:=tstringlist.Create;
ini := TIniFile.Create('d:\75\task2.ini');
try
ini.ReadSections(d);
finally
ini.Free;
end;
caption:=inttostr(d.Count);
d.Free;
В принципе тоже самое решение, о котором я говорил в [0].
Думал другие варианты есть.
DrPass (2007-09-16 00:22:00) [9]ListBox1.Items.Count. Или, если отображать не надо, возьми TStringList