![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как корректно установить, записалась ли информация в ini-файл.
Ал © (2003-03-31 14:17:00)Программа запускается с 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
...
Подскажите, знатоки!
SPeller (2003-04-02 14:45:00) [1]
> Boguslaw (02.04.03 12:10)
> FlushFileBuffers API needed ????
Нет, эта функция используется для файлов, открытых CreateFile и иже с ними. (Если конечно это было по моему замечанию)
Boguslaw (2003-04-02 12:10:00) [2]
FlushFileBuffers API needed ????
Ал (2003-04-02 10:31:00) [3]
To Kladov:
Некорректность в том, что, согласно справке MS API, некоторые API функции сами устанавливают SetLastError(0).
Если в KOL-функции несколько API-функций, нужно внимательно смотреть, не обнулится ли код ошибки еще до выхода из KOL-функции.
Kladov (2003-04-01 21:59:00) [4]
Использование GetLastError как раз корректно. Но тогда надо перед вызовом делать SetLastError.
Ал (2003-04-01 11:03:00) [5]
Хорошо написанная прога должна корректно сообщать пользователю о разных нештатных ситуациях.
Уважаемые авторы KOL! Я бы предложил доработать TIniFile (и не только).
Многие API-функции, работающие в KOL, возвращают коды завершения. И если KOL-функция возвращает собственное целевое значение (напр. String), то, может быть, предусмотреть в KOL глобальную переменную или отдельный объект, из которого узнать, возвратила KOL-функция пустую строку потому что так надо, или вследствие ошибки?
А пока придется использовать GetLastError, хотя это не всегда корректно.
SPeller (2003-04-01 00:28:00) [6]
Если кому интересно, я под Win9X совсем недавно напоролся на такую особенность: если у нас есть ini-файл, и мы считали с него информацию, то теперь если заменить этот файл новым, с абсолюттно другими значениями, то при последующем чтении функции GetPrivateProfileX вернут нам информацию из старого файла. Это происходит ТОЛЬКО если мы работаем с ini в цикле и замена файлов и чтение из них происходит оченьбыстро. Если шерстить отладчиком, то всё будет нормально, потому что время между обращениями во много раз увеличится.
Kladov (2003-03-31 17:57:00) [7]
> Как же сообщить пользователю, что ini не записался?
Может проще воспользоваться реестром. Я бы просто в readme прописал, что программу надо скопировать на жесткий диск, чтобы работало. Кто не прочитает, сам виноват.
Ал (2003-03-31 15:27:00) [8]
Уточню:
программа лежит в папке на сетевом диске.
Для одного пользователя - папка открыта и для чтения и для записи. Для другого - только для чтения.
ini-файл может быть, а может и не быть (при работе программа может создать его сама). Для того, кому папка открыта для записи - сможет создать. А для того, кому нет - не сможет. При этом не все функции работы с ini возвращают корректные коды ошибок. Если безуспешно записать 0, а потом сравнить с безуспешным чтением?
Вроде тоже 0. И вроде 0 = 0. Как же сообщить пользователю, что ini не записался?
Bartov (2003-03-31 15:08:00) [9]
> Программа запускается с Read Only - диска.
> ini := OpenIniFile("my_ini.ini");
По плану сначло ищет в каталоге где прога, потом в окружении path.
Хм... А куда файл "my_ini.ini" запишится если с Read Only - диска. Скорее всего в temp...
> Как корректно установить, записалась ли информация в ini-файл.
Просто прочитай измененные занчения с ini-файла.
> нет ли каких нюансов при работе с ini в Win NT, 2000, XP.
Вроде нет.
Ал (2003-03-31 14:23:00) [10]
И еще:
нет ли каких нюансов при работе с ini в Win NT, 2000, XP.
А то в справке по WritePrivateProfileString, которая используется в KOL-функциях работы с ini, такого понаписано (с реестром HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping работа ведется).
Или урок №9 срабатывает во всех случаях?