Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
4-52446
Vi0let
2003-10-23 03:28
2003.12.16
Отследить изменение разрешения экрана


14-52391
Brahman
2003-11-21 14:26
2003.12.16
Женщина == Web-service


1-52240
Aleksandr
2003-12-04 12:20
2003.12.16
Все время ошибка System Error. Code 1400. Недопустимый дескриптор


14-52388
MadAngel
2003-11-24 04:39
2003.12.16
Просмотрщик


14-52394
Dimedrol
2003-11-20 19:29
2003.12.16
Цифровой фотик





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский