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

Вниз

Как корректно установить, записалась ли информация в ini-файл.   Найти похожие ветки 

 
Ал   (2003-03-31 14:17) [0]

Программа запускается с Read Only - диска.
Функции работы с ini-файлами по разному формируют выходные значения.

Например,
function TIniFile.ValueData(const Key: String; Value: Pointer;
Count: Integer): Boolean;
begin
if fMode = ifmRead then
Result := GetPrivateProfileStruct( PChar( fSection ), PChar( Key ),
Value, Count, PChar( fFileName ) )
else
Result := WritePrivateProfileStruct( PChar( fSection ), PChar( Key ),
Value, Count, PChar( fFileName ) );
end;
- по Result можно определить, не было ли ошибки при записи.

А вот
function TIniFile.ValueInteger(const Key: String; Value: Integer): Integer;
begin
if fMode = ifmRead then
Result := GetPrivateProfileInt( PChar( fSection ), PChar( Key ),
Integer( Value ), PChar( fFileName ) )
else
begin
Result := Value;
WritePrivateProfileString( PChar( fSection ), PChar( Key ),
( Int2Str( Value ) Программа запускается с Read Only - диска.
Функции работы с ini-файлами по разному формируют выходные значения.

Например,
function TIniFile.ValueData(const Key: String; Value: Pointer;
Count: Integer): Boolean;
begin
if fMode = ifmRead then
Result := GetPrivateProfileStruct( PChar( fSection ), PChar( Key ),
Value, Count, PChar( fFileName ) )
else
Result := WritePrivateProfileStruct( PChar( fSection ), PChar( Key ),
Value, Count, PChar( fFileName ) );
end;
- по Result можно определить, не было ли ошибки при записи.

А вот
function TIniFile.ValueInteger(const Key: String; Value: Integer): Integer;
begin
if fMode = ifmRead then
Result := GetPrivateProfileInt( PChar( fSection ), PChar( Key ),
Integer( Value ), PChar( fFileName ) )
else
begin
Result := Value;
WritePrivateProfileString( PChar( fSection ), PChar( Key ),
PChar( Int2Str( Value ) ), PChar( fFileName ) );
end;
end;
- не очень-то понятно!

Может быть, так:
ini := OpenIniFile("my_ini.ini");
if ini.fFileName <> "my_ini.ini" then
...

Подскажите, знатоки!


 
Ал   (2003-03-31 14:23) [1]

И еще:

нет ли каких нюансов при работе с ini в Win NT, 2000, XP.
А то в справке по WritePrivateProfileString, которая используется в KOL-функциях работы с ini, такого понаписано (с реестром HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping работа ведется).

Или урок №9 срабатывает во всех случаях?


 
Bartov   (2003-03-31 15:08) [2]

> Программа запускается с Read Only - диска.
> ini := OpenIniFile("my_ini.ini");
По плану сначло ищет в каталоге где прога, потом в окружении path.
Хм... А куда файл "my_ini.ini" запишится если с Read Only - диска. Скорее всего в temp...

> Как корректно установить, записалась ли информация в ini-файл.
Просто прочитай измененные занчения с ini-файла.

> нет ли каких нюансов при работе с ini в Win NT, 2000, XP.
Вроде нет.


 
Ал   (2003-03-31 15:27) [3]

Уточню:

программа лежит в папке на сетевом диске.
Для одного пользователя - папка открыта и для чтения и для записи. Для другого - только для чтения.
ini-файл может быть, а может и не быть (при работе программа может создать его сама). Для того, кому папка открыта для записи - сможет создать. А для того, кому нет - не сможет. При этом не все функции работы с ini возвращают корректные коды ошибок. Если безуспешно записать 0, а потом сравнить с безуспешным чтением?
Вроде тоже 0. И вроде 0 = 0. Как же сообщить пользователю, что ini не записался?


 
Kladov   (2003-03-31 17:57) [4]


> Как же сообщить пользователю, что ini не записался?

Может проще воспользоваться реестром. Я бы просто в readme прописал, что программу надо скопировать на жесткий диск, чтобы работало. Кто не прочитает, сам виноват.


 
SPeller ©   (2003-04-01 00:28) [5]

Если кому интересно, я под Win9X совсем недавно напоролся на такую особенность: если у нас есть ini-файл, и мы считали с него информацию, то теперь если заменить этот файл новым, с абсолюттно другими значениями, то при последующем чтении функции GetPrivateProfileX вернут нам информацию из старого файла. Это происходит ТОЛЬКО если мы работаем с ini в цикле и замена файлов и чтение из них происходит очень быстро. Если шерстить отладчиком, то всё будет нормально, потому что время между обращениями во много раз увеличится.


 
Ал   (2003-04-01 11:03) [6]

Хорошо написанная прога должна корректно сообщать пользователю о разных нештатных ситуациях.

Уважаемые авторы KOL! Я бы предложил доработать TIniFile (и не только).

Многие API-функции, работающие в KOL, возвращают коды завершения. И если KOL-функция возвращает собственное целевое значение (напр. String), то, может быть, предусмотреть в KOL глобальную переменную или отдельный объект, из которого узнать, возвратила KOL-функция пустую строку потому что так надо, или вследствие ошибки?

А пока придется использовать GetLastError, хотя это не всегда корректно.


 
Kladov   (2003-04-01 21:59) [7]

Использование GetLastError как раз корректно. Но тогда надо перед вызовом делать SetLastError.


 
Ал   (2003-04-02 10:31) [8]

To Kladov:

Некорректность в том, что, согласно справке MS API, некоторые API функции сами устанавливают SetLastError(0).
Если в KOL-функции несколько API-функций, нужно внимательно смотреть, не обнулится ли код ошибки еще до выхода из KOL-функции.


 
Boguslaw   (2003-04-02 12:10) [9]

FlushFileBuffers API needed ????


 
SPeller ©   (2003-04-02 14:45) [10]


> Boguslaw (02.04.03 12:10)
> FlushFileBuffers API needed ????

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



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

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

Наверх




Память: 0.49 MB
Время: 0.018 c
3-52106
Vanek
2003-11-24 10:30
2003.12.16
По интерфейсу


1-52226
Mishenka
2003-12-04 22:24
2003.12.16
Как в Memo показывать текст с опредённого места?


1-52270
Артем К.
2003-12-04 11:50
2003.12.16
Координаты курсора над TChartoм


14-52354
RealRascal
2003-11-19 16:44
2003.12.16
Задача о ложном предложении. Проверим логику?


6-52323
Ellika
2003-09-12 08:17
2003.12.16
Компонент IdSMTP