Форум: "KOL";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизКак корректно установить, записалась ли информация в 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 вся ветка
Форум: "KOL";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c