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


Автор: Vladimir_K 6.1.2007, 20:24
Подскажите, как правильно читать и записывать данные в INI-файлы.
Использую в своем модуле U_MA (имя формы F_MA) такую процедуру чтения:
Код

procedure TGraph.FormCreate(Sender: TObject);
const CNOTFOUND = -1;
var sAppPath: String;
    iniSettings: TINIFile;
    liValue: Longint;
begin
 sAppPath:= ExtractFilePath(Application.ExeName);          //Получаем путь к EXE - файлу приложения
 iniSettings:= TINIFile.Create(sAppPath + 'SET_MA.INI');  //Создаем объект TINIFile
 try
  liValue:= iniSettings.ReadInteger(Name,'Col_MA1',CNOTFOUND);//Пытаемся считать значение
  if liValue = CNOTFOUND then                                          //Проверяем, считано ли значение
   begin
                  // Свойства в  INI-файле не найдены
   end
   else
    begin
     MA_YN1:=iniSettings.ReadBool(Name,'ON_OF_MA1',MA_YN1);// Данные
    end;
 finally
  iniSettings.Free;
 end;
end;

Содержимое INI-файла:

[F_MA]
ON_OF_MA1=1
ON_OF_MA2=0
ON_OF_MA3=0
ON_OF_MA4=0
ON_OF_MA5=0
ON_OF_MA6=0
ON_OF_MA7=0
ON_OF_MA8=0
ON_OF_MA9=0
ON_OF_MA10=0

Все работает нормально. Но когда пытаюсь прочитать данные из этого INI-файла, но из другого модуля - ничего не выходит: переменная liValue = -1 и данные не читаются.
Может быть надо как-то указывать адрес или еще что... Подскажите, пожалуйста!

Автор: Guedda 6.1.2007, 21:24
http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=686471

Автор: Romikgy 6.1.2007, 22:55
Цитата(Vladimir_K @  6.1.2007,  19:24 Найти цитируемый пост)
sAppPath + 'SET_MA.INI'

что дает эта сумма?
Цитата(Vladimir_K @  6.1.2007,  19:24 Найти цитируемый пост)
iniSettings

что здесь?
Цитата(Vladimir_K @  6.1.2007,  19:24 Найти цитируемый пост)
Col_MA1

и чет этого не видно в этом
Цитата(Vladimir_K @  6.1.2007,  19:24 Найти цитируемый пост)
[F_MA]
ON_OF_MA1=1
ON_OF_MA2=0
ON_OF_MA3=0
ON_OF_MA4=0
ON_OF_MA5=0
ON_OF_MA6=0
ON_OF_MA7=0
ON_OF_MA8=0
ON_OF_MA9=0
ON_OF_MA10=0

или это не полный список?

Автор: Vladimir_K 6.1.2007, 23:38
Эта функция не читает мой INI-файл
Код

function ReadIniDataBool(Section, Ident : string; Default : boolean = false) : boolean;
begin
  IniFile := TIniFile.Create(Path + 'SET_MA.INI');
  ON_OF_MA1 := IniFile.ReadBool(Section, 'ON_OF_MA1', ON_OF_MA1);
  IniFile.Free;
end;

Как указать адрес INI-файла, откуда нужно читать данные?

Автор: Sunvas 6.1.2007, 23:44
Цитата(Vladimir_K @  6.1.2007,  23:38 Найти цитируемый пост)
Как указать адрес INI-файла, откуда нужно читать данные?

Полным путем к твоему файлу.

Добавлено @ 23:45 
Возможно в сумме
Цитата(Vladimir_K @  6.1.2007,  23:38 Найти цитируемый пост)
Path + 'SET_MA.INI'

ты пропустил "/" поэтому и не читается.

Автор: Vladimir_K 6.1.2007, 23:48
Цитата(Romikgy @  6.1.2007,  22:55 Найти цитируемый пост)
sAppPath + 'SET_MA.INI'

что дает эта сумма?

Не знаю, этот код я нашел в Инете, частично работает...


Цитата(Romikgy @  6.1.2007,  22:55 Найти цитируемый пост)
iniSettings

что здесь?

iniSettings: TINIFile;

Отсюда:
[F_MA]
ON_OF_MA1=1
ON_OF_MA2=0
ON_OF_MA3=0
ON_OF_MA4=0
ON_OF_MA5=0
ON_OF_MA6=0
ON_OF_MA7=0
ON_OF_MA8=0
ON_OF_MA9=0
ON_OF_MA10=0

берутся данные, и записываются в переменные MA_YN1...MA_YN10(см. код в самом начале):

Код

MA_YN1:=iniSettings.ReadBool(Name,'ON_OF_MA1',MA_YN1);// Данные


'Col_MA1' - это тоже данные в INI-файле, я использую эту строку
Код

liValue:= iniSettings.ReadInteger(Name,'Col_MA1',CNOTFOUND);

для проверки, что INI-файл не пустой.

Автор: Sunvas 6.1.2007, 23:49
Кажется нашел ошибку, почему из другого модуля не читается:
Цитата(Vladimir_K @  6.1.2007,  20:24 Найти цитируемый пост)
liValue:= iniSettings.ReadInteger(Name,'Col_MA1',CNOTFOUND);

Ведь глобальная перемення name в разных модулях разная.

Автор: Vladimir_K 6.1.2007, 23:50
Цитата(Sunvas @  6.1.2007,  23:44 Найти цитируемый пост)
Как указать адрес INI-файла, откуда нужно читать данные?

Полным путем к твоему файлу.

Указывал и полный путь - не работает.

Добавлено @ 23:53 
Цитата(Sunvas @  6.1.2007,  23:49 Найти цитируемый пост)
liValue:= iniSettings.ReadInteger(Name,'Col_MA1',CNOTFOUND);

Ведь глобальная перемення name в разных модулях разная. 

Но эта переменная явно не объявлена. Как быть?

Автор: Sunvas 6.1.2007, 23:54
Цитата(Vladimir_K @  6.1.2007,  23:38 Найти цитируемый пост)
Эта функция не читает мой INI-файл

Это какая-то полу-функция. Ведь переменные IniFile, ON_OF_MA1 в ней не прописаны.

Добавлено @ 23:55 
Цитата(Vladimir_K @  6.1.2007,  23:50 Найти цитируемый пост)
Но эта переменная явно не объявлена

Это переменная относиться к класу формы. Т.е. чтобы она стала глобально пропиши перед ней из какого класса она берется.

Добавлено @ 23:56 
Код

TGraph.name

Автор: Vladimir_K 7.1.2007, 00:21
Вот так?
Код

MA_YN1:=iniSettings.ReadBool(TGraph.name,'ON_OF_MA1',MA_YN1);

вылетает ошибка:
Method identifier expected

Автор: VICTAR 7.1.2007, 00:28
Цитата(Sunvas @  6.1.2007,  23:44 Найти цитируемый пост)
ты пропустил "/" поэтому и не читается. 

ну уж тоды не "/", а "\"

Автор: Sunvas 7.1.2007, 00:29
Цитата(VICTAR @  7.1.2007,  00:28 Найти цитируемый пост)
ну уж тоды не "/", а "\"

Точно. Вот что делает с людьми Интернет и постоянное написание длинных ЮРЛов..

Автор: Vladimir_K 7.1.2007, 00:38
Цитата(Sunvas @  7.1.2007,  00:24 Найти цитируемый пост)
Я тебе за самый первый код говорю.

Код

liValue:= iniSettings.ReadInteger(TF_MA.Name,'Col_MA1',CNOTFOUND);

Так - ошибка при компиляции;

Код

liValue:= iniSettings.ReadInteger(F_MA.Name,'Col_MA1',CNOTFOUND);

Так - во время выполнения программы, при обработке данной строки.

Добавлено @ 00:40 
Да у меня вообще без слэша, и работает, но только в одном модуле...

Автор: VICTAR 7.1.2007, 00:42
А что непонятного? Для твоего IniFile
 
Код

MA_YN1:=iniSettings.ReadBool('F_MA','ON_OF_MA1',MA_YN1);

Или я что-то не понял?

Автор: Sunvas 7.1.2007, 00:50
Цитата(Vladimir_K @  7.1.2007,  00:38 Найти цитируемый пост)
liValue:= iniSettings.ReadInteger(F_MA.Name,'Col_MA1',CNOTFOUND);

А ты так сделай:
Код

liValue:= iniSettings.ReadInteger(TGraph.name,'Col_MA1',CNOTFOUND);

Автор: Vladimir_K 7.1.2007, 00:51
Прописал так (в том модуле (Graph), в котором не читалось):
Код

liValue:= iniSettings.ReadInteger('F_MA','Col_MA1',CNOTFOUND);

кажись заработало! Завтра уже буду подробнее разбираться. Спасибо огромное!

Автор: Vladimir_K 7.1.2007, 00:57
Цитата(Sunvas @  7.1.2007,  00:50 Найти цитируемый пост)
А ты так сделай:

код Pascal/Delphi
1:

liValue:= iniSettings.ReadInteger(TGraph.name,'Col_MA1',CNOTFOUND);

Так - ошибка при компиляции.

Автор: VICTAR 7.1.2007, 01:02
Vladimir_K, если все-таки не получиться, выложи целиком содержимое IniFile`a. Посмотрим. 

Автор: Sunvas 7.1.2007, 01:05
Цитата(Vladimir_K @  7.1.2007,  00:57 Найти цитируемый пост)
Так - ошибка при компиляции.

Мыслим дальше. Убери "T"
Т.е.
Код

liValue:= iniSettings.ReadInteger(Graph.name,'Col_MA1',CNOTFOUND);

Автор: aktuba 7.1.2007, 09:54
Цитата

Код

...
liValue:= iniSettings.ReadInteger(Name,'Col_MA1',CNOTFOUND)
...



Ошибка в этой строке и очень простая. Функция ReadInteger выглядит примерно так:

Код

function ReadInteger(Section, Param: string; DefValue: Integer);

Т.е., в функции указывается секция модуля данных, считываемый параметр и значение по умолчанию (если такого параметра нет).
НО, у тебя на месте секции стоит Name. Delphi под ним подразумевает Self.Name - имя формы! А т.к. в Ini-файле секция у тебя называется также, как имя формы - в первом случае работает. Но, во втором модуле, где форма называется иначе, не работает, т.к. в Ini-файле нет секции с названием другой формы. 

Чтобы работало и там и там сделай так:

Код

liValue:= iniSettings.ReadInteger('F_MA','Col_MA1',CNOTFOUND)

Автор: Sunvas 7.1.2007, 12:45
Цитата(aktuba @  7.1.2007,  09:54 Найти цитируемый пост)
НО, у тебя на месте секции стоит Name. Delphi под ним подразумевает Self.Name - имя формы! А т.к. в Ini-файле секция у тебя называется также, как имя формы - в первом случае работает. Но, во втором модуле, где форма называется иначе, не работает, т.к. в Ini-файле нет секции с названием другой формы. 

Тоже самое говорил я. Поэтому предлагал перед name прописать имя самой формы.

Автор: Vladimir_K 7.1.2007, 19:19
Друзья мои, прописывал я имя формы перед Name - если, например TGraph.Name - появляется ошибка при компилляции программы, если Graph.Name - ошибка при выполнении программы!
Сделал так:
Код

liValue:= iniSettings.ReadInteger('F_MA','Col_MA1',CNOTFOUND);

и заработало великолепно! Уже проверил. 
Все дело было в правильном указании имени модуля: 'F_MA'  smile 
Теперь данные можно читать и из модуля Graph.
Еще раз спасибо за помощь и участие! 

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