Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как корректно установить, записалась ли информация в 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 срабатывает во всех случаях?


Наверх

Титульная страница Поиск, карта сайта Написать письмо