![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
И ещё о нескольких устаревших (по мнению MSDN, где ими не советуют пользоваться) функциях.
Часто программе нужно где-то хранить настройки. Вариантов хранения два: 1) В файле. 2) В реестре. Microsoft настоятельно рекомендует пункт 2 и пользоваться для этих целей веткой реестра HKEY_CURRENT_USER \ Software, чтобы у каждого пользователя были свои настройки - т.е. каждый вошедший в систему пользователь мог настроить программу "под себя" (так как ему нравится). Как известно HKEY_CURRENT_USER загружается автоматически вместе с текущим профилем пользователя при входе в систему и у каждого пользователя эта ветка реестра будет своя (разумеется, кроме тех одинаковых вещей, которые по умолчанию добавляет туда сама система при создании профиля для нового пользователя). К слову, HKEY_LOCAL_MACHINE - это глобальная ветка, настройки в которой доступны всем пользователям (вернее будет сказать, что это настройки для всего компьютера), посему и писать туда не имея прав администратора вообще нельзя. Хранение же настроек в файле чревато тем, что у всех пользователей будут одни и те же настройки, а если каждый захочет менять под себя... будет мало хорошего. В принципе, можно хранить настройки в каталоге пользователя C:\Documents and Settings\USERNAME\Application Data\<ИМЯ ПРОГРАММЫ> (т.н. каталог %APPDATA% - который, как и ветка реестра, у каждого пользователя свой). Однако, и реестр и каталог пользователя "болеют" одной проблемой: при удалении программы, все эти вещи остаются. Т.е. система получается загажена неиспользуемыми данными - "мусором". Можно, конечно, сделать установщик, который будет все эти вещи чистить при удалении программы. Однако же: 1) Надо писать установщик. 2) Надо писать логику и обработку удаления программы. 3) Программа перестаёт быть portable (портативной - переносной, ей обязательно нужен будет доступ для записи либо в реестр, либо на жёсткий диск). Самый серьёзный пункт - это пункт 3. Но даже не в этом дело, а в том, что многие пользователи до сих пор, "по привычке", удаляют программу через SHIFT+DELETE, вместо "Установки и удаления", что сводит все старания из п.п. 1 и 2 на нет. Наконец, для программ, которые являются каким-то разовыми утилитами и которыми не пользуешься каждый день, все эти вещи просто лишние. И вот тут нас выручают настройки сохранённые в файл в каталоге программы - по завершении работы весь каталог с программой можно безболезненно удалить. И всё вернётся на круги своя. Настройки можно хранить и в своём формате, но гораздо удобнее, на тот случай, если программа навернётся при запуске из-за кривого файла настроек, делать это в .INI формате, который очень просто и быстро в таких ситуациях можно подправить ручками, а не писать для этого специальную программу-редактор. Уф, ладно, со вступлением закончил. (*улыбается*) Теперь переходим к практике. Для работы с .INI файлами есть в WinAPI следующие функции: GetPrivateProfile* - для чтения WritePrivateProfile* - для записи * - означает, что есть несколько функций, которые начинаются на эту строку, но имеют разные окончания. Для примера рассмотрим вот такой тестовый "test.ini" файл: CODE [Main] Param1=123 StrVal=String! Для того, чтобы прочитать оттуда нужно сделать следующее: CODE Var S: String; X: Integer; Begin ... // максимальный размер строки - 100 символов SetLength(S, 100); // меняем на тот, сколько реально было прочитано SetLength(S, GetPrivateProfileString('Main', 'StrVal', '', @S[1], Length(S), '.\test.ini')); X:=GetPrivateProfileInt('Main', 'Param1', 0, '.\test.ini'); Ну и писать, точно также, только через WritePrivateProfile*. Кстати, чтобы удалить из .INI достаточно написать (Nil - в качестве значения параметра, чтобы удалить): CODE WritePrivateProfileString('Main', 'StrVal', Nil, '.\test.ini'); И StrVal вообще исчезнет из .INI файла. Важные замечания: 1) Не путайте (Get/Write)PrivateProfile* и просто (Get/Write)Profile* - последние функции (без Private в названии) пишут в системный файл "WIN.INI"! А его лучше не трогать, к тому же доступа на запись в системный каталог может не быть. 2) Не забывайте писать '.\' в начале имени файла. Это важно - если написать просто 'test.ini', то этот файл будет сохранён в "C:\Windows\test.ini" - а прав записи туда может не быть. 3) Функций гораздо больше (не только *String и *Int) - см. справку по MSDN. Я, кстати, здесь не объяснил некоторые параметры (значения по умолчанию, например, если параметра в файле нет) - за всем этим, а также другими удобными вещами и прочими тонкостями - см. MSDN. 4) Как я уже говорил, MSDN настоятельно рекомендует не пользоваться этими функциями и посылает всех в реестр, однако же, они вполне себе спокойно работают и под Windows 7. P.S. В Delphi есть IniFiles при подключении которого через uses появится класс TIniFile работающий с .INI файлами и независящий от перечисленных WinAPI функций, однако же, как я уже писал в сообщении выше, для небольших программ на WinAPI подключение этого модуля чудовищно раздувает размер кода. |
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 21:09 |