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


Автор: KlanB 6.3.2005, 18:58
Даже делая по примеру не могу понять в чем загвоздка smile

Код
//Загрузка файла инициализации
function ReadIni(ASection, AString : String): String;
var
//sPath: string;
sIni: TIniFile;   <---- Ошибка тут

 begin
//    GetDir(0,sPath);
//    sIniFile := TIniFile.Create(sPath + '\LogAn.ini');
//  end;
end;


И выдает ошибку:
[Error] Parser.pas(68): Undeclared identifier: 'TIniFile'

Автор: SPrograMMer 6.3.2005, 19:15
Подключи модуль INIFiles в секции Uses.

Автор: KlanB 6.3.2005, 20:34
Спасибо! smile
Все пошло
Но на счет модулей нигде не нашел инфу: как с ними работать, как определять, что к чему относитья... вобщем пишу, а что непонямаю smile

Автор: Dr.No_xXx 6.3.2005, 20:50
1)
Код

.....
public
Ini:TIniFiles;
...... //процедура(oncreate или какая тебе там нужна)
Ini:=Tinifile.create(название);

2)не забудь описать в uses
3)вводятся данные так:
Код

Ini.writeinteger('раздел в ини файле(то что в квадратных скобках)','параметр(не ставь знак =)',значение)
ini.writestring('раздел в ини файле(то что в квадратных скобках)','параметр(не ставь знак =)',текст)
ini.writebool('раздел в ини файле(то что в квадратных скобках)','параметр(не ставь знак =)',True или false)

выводится так:
Код

ini.readinteger('название раздела','параметр',значение по умолчанию(то есть если оно не указано в ини файле то берется это значение));
ini.readstring('название раздела','параметр',значение по умолчанию(то есть если оно не указано в ини файле то берется это значение));
ini.readbool('название раздела','параметр',значение по умолчанию(то есть если оно не указано в ини файле то берется это значение));

вроде все smile

Автор: Pakshin A. S. 6.3.2005, 21:46
Если компилятор говорит, что неизвестный идентификатор находится в коде программы, то
1) Проверь правильность написания, если все правильно переходи ко второму пунтку, иначе исправь ошибку и еще раз компилируй.
2) Зайди в Help и посмотри тип переменной (если ошибка именно в нем)... обычно в справке написано то, к какому модулю относится данный тип (класс)... иначе переходим к третьему пунтку
3) зайди на форум и спроси

Автор: Sentynel 6.3.2005, 23:07
Сверху окна имеется ссылка на:
DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
скачай и найди внём пункт "Работа с INI файлами". И все проблемы по INI файлам отпадут. smile

Автор: Pakshin A. S. 6.3.2005, 23:09
Ну, может и не все... smile Может иногда и придется немного подумать... smile smile smile и обратиться на форум за помощью в реализации... smile

Автор: KlanB 7.3.2005, 01:22
Это точно smile
Пока перелопатишь хелпы и доки, найдешь там все, что нужно... а все равно что-то не получается smile (было 3 примера реализации чтения/записи INI)

Вот кстати, не слишком ли накладно каждый раз работать через

Код

Ini.writeinteger('раздел в ини файле(то что в квадратных скобках)','параметр(не ставь знак =)',значение)
ini.writestring('раздел в ини файле(то что в квадратных скобках)','параметр(не ставь знак =)',текст)
ini.writebool('раздел в ини файле(то что в квадратных скобках)','параметр(не ставь знак =)',True или false)

Или я недопонял smile

Попробовал вот так:
Код

//Функция загрузки настроек (INTEGER)
function ReadIniI(ASector, AIdent : String): integer;
{Функция чтения INI ([Сектор, Параметр]}

const
ADef = 200; //Значение, которое будет стоять по умолчанию
var
sIni: TIniFile;
begin
 sIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
 Result := sIni.ReadInteger(ASector, AIdent, ADef); //Результат выполнения
 sIni.Free;
end;

//Процедура записи настроек (INTEGER)
procedure WriteIniI(ASector, AIdent: string; AItem: Integer);
var
sIni: TIniFile;
begin
 sIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
 sIni.WriteInteger(ASector, AIdent, AItem);
 sIni.Free;
end;

И так для String'ов и Boolean'ов

Тогда для чтения/записи нужно всего лишь вызвать функцию и процедуру:
Код

//Загрузка параметров при запуске программы
procedure TForm1.FormActivate(Sender: TObject);
begin
  Form1.Height := ReadIniI('Size', 'Height');
  Form1.Width := ReadIniI('Size', 'Width');
end;

//Сохранение настроек при закрытии программы
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 WriteIniI('Size', 'Height', Height);
 WriteIniI('Size', 'Width', Width);
end;


Правда не понятно можно ли сделать "наследование" типа переменной с помощью некоторых переменных, что за тип используется (Integer, String, Boolean). Т. е. пишем всего лишь функцию Read и процедуру Write а они там уже разбираются с какими переменными они имеют дело.
Еще не очень хорошо получается что по умолчанию стоит одно и то же значение (в данном случае 200).

зы
У меня в проге (моя первая прога smile ) много параметров и вот хочу спросить мнения у вас, как более опытных.

Автор: Pakshin A. S. 7.3.2005, 09:49
Если уже очень хочется разбить всю работу, то лучше сделать так:
Код

type
TMyIni = class
 private
  FIni: TIniFile;
 public
  constuctor Create(filename: string);
  function ReadIntA( section: string; param: string): integer;
  ...
  destructor Free;
 end;

...

constructor TMyIni.Create(filename: string);
begin
FIni:=TIniFile.Create(FileName);
end;

function TMyIni.ReadIntA(section: string; param: string): integer;
begin
Result:=FIniFile.ReadInteger(section, param, -MaxInt);
end;

...

destructor TMtIni.Free;
begin
FIni.Free;
end;

...

{Работа:}
var
MyIni: TMyIni;
integer;
begin
MyIni:=TMyIni.Create('MyIniFile.ini');
with MyIni do
  begin
   i:=ReadIntA('sec', 'par');
   if i = -MaxInt
    then
     ShowMEssage('Error')
    else
     ShowMEssage(IntToStr(i));
   Free;
  end;
end;

Но это можно даже сказать тоже лишнее, т. к. идет полный дубль стандартных процедур и функций... Если подробнее опишете свою задачу, то может что-нить и придумаю.. smile

Автор: KlanB 9.3.2005, 19:05
До такого мне по идее еще рановато smile
Хитрого ничего нет, просто нужно сохранять параметры наиболее оптимальным путем. Иногда не все сразу а, например по кнопке "применить". Поэтому и решил попробовать разные варианты.

Автор: Vit 9.3.2005, 20:54
Я пользуюсь чем-то типа:

Код

Procedure WriteValue(Section, Key, Value:string);
begin
  with TiniFile.create(ChangeFileExt(Paramstr(0),'.ini')) do
    try
      WriteString(Section, Key, Value);
    finally
      Free;
    end;
end;

Function ReadValue(Section, Key, default:string):string;
begin
  with TiniFile.create(ChangeFileExt(Paramstr(0),'.ini')) do
    try
      Result:=ReadString(Section, Key, default);
    finally
      Free;
    end;
end;



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