Страница: 1 | 2 |
Вопрос: Работа с реестром
Добавлено: 26.02.10 09:50
Автор вопроса: Jasmin
Здравствуйте !
Такой вопрос. Работаю в VBA. Хочу создать нужную запись в реестре. Пишу вот так:
Но мне бы нужно создать еще вложенный раздел. Примерно так: раздел "VB and VBA Program Settings" (стандартный), внутри раздел MWPS(название проги), внутри раздел LoadRowNewWells(группа предприятий), внутри раздел NNP(предприятие), а вот уже внутри 2 строковых параметра, например Year (со значением 2005)и Row (со значением 3).
Возможно это или VBA может создавать только одноуровневые записи ?
Спасибо
Ответы
Всего ответов: 22
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 26.02.10 10:03
Попробуй разделить необходимые ключи и ветки через слэш "\". По идее должно сработать..
SaveSetting "Test\Test1\Test2", "Section\Subsection", "KeyValue", "Value"
Номер ответа: 2
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #2
Добавлено: 26.02.10 10:22
Спасибо большое. Все заработало, как нужно.
Хорошо, когда есть у кого спросить.
Номер ответа: 3
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #3
Добавлено: 26.02.10 10:42
Еще вопросик. Записала в реестр все данные как нужно. А как бы теперь проверить, какие подразделы (предприятия) есть в разделе (см. вопрос) ?
Пробовала через разделитель "\" и просто считать весь раздел. Но там параметров нет, только подразделы. Соответственно нечего нет после считывания.
Это нужно при повторной установке/переустановке программы. Чтобы не терять текущее состояние.
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 26.02.10 12:46
Если мне не изменяет память (сорри, давно уже не использую VB) то там было нечто похожее на GetAllSettings, которая возвращала 2-размерный массив содержимого ветки.. я думаю это как раз то что вам и нужно.. подробности,я думаю, без труда найдете в документации
Номер ответа: 5
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #5
Добавлено: 26.02.10 13:12
Все правильно. Это "нечто" я и использую. Но вот проблема в том, что, если в разделе есть параметры, они выдаются. Если есть только подразделы, то ругается и ничего не выдает. А мне бы нужно проверить, сколько и каких подразделов есть в указанном мною разделе.
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 26.02.10 13:42
В таком случае боюсь средствами VBA тут не обойтись и придется юзать API. Скорее всего вам придется использовать RegQueryInfoKey. Пример использования можете посмотреть тут: http://pva-land.jino-net.ru/codesvb/035.php
Номер ответа: 7
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #7
Добавлено: 26.02.10 14:23
Жалко. Пойду думать еще.
Номер ответа: 8
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #8
Добавлено: 26.02.10 22:22
Чем плохи нативные API? Почти все возвращают какой-то результат или код ошибки. И почему бы в твем примере на VBA не попробовать использовать обработчик ошибок On Error GoTo ### там, где ругается, чтобы заработало все верно?
Номер ответа: 9
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #9
Добавлено: 26.02.10 22:31
Напоминалка из MSDN по API:
RegCloseKey Closes a handle to the specified registry key.
RegConnectRegistry Establishes a connection to a predefined registry handle on another computer.
RegCopyTree Copies the specified registry key, along with its values and subkeys, to the specified destination key.
RegCreateKeyEx Creates the specified registry key.
RegCreateKeyTransacted Creates the specified registry key and associates it with a transaction.
RegDeleteKey Deletes a subkey and its values.
RegDeleteKeyEx Deletes a subkey and its values from the specified platform-specific view of the registry.
RegDeleteKeyTransacted Deletes a subkey and its values from the specified platform-specific view of the registry as a transacted operation.
RegDeleteKeyValue Removes the specified value from the specified registry key and subkey.
RegDeleteTree Deletes the subkeys and values of the specified key recursively.
RegDeleteValue Removes a named value from the specified registry key.
RegDisablePredefinedCache Disables handle caching for the predefined registry handle for HKEY_CURRENT_USER for the current process.
RegDisablePredefinedCacheEx Disables handle caching for all predefined registry handles for the current process.
RegDisableReflectionKey Disables registry reflection for the specified key.
RegEnableReflectionKey Enables registry reflection for the specified disabled key.
RegEnumKeyEx Enumerates the subkeys of the specified open registry key.
RegEnumValue Enumerates the values for the specified open registry key.
RegFlushKey Writes all attributes of the specified open registry key into the registry.
RegGetKeySecurity Retrieves a copy of the security descriptor protecting the specified open registry key.
RegGetValue Retrieves the type and data for the specified registry value.
RegLoadKey Creates a subkey under HKEY_USERS or HKEY_LOCAL_MACHINE and stores registration information from a specified file into that subkey.
RegLoadMUIString Loads the specified string from the specified key and subkey.
RegNotifyChangeKeyValue Notifies the caller about changes to the attributes or contents of a specified registry key.
RegOpenCurrentUser Retrieves a handle to the HKEY_CURRENT_USER key for the user the current thread is impersonating.
RegOpenKeyEx Opens the specified registry key.
RegOpenKeyTransacted Opens the specified registry key and associates it with a transaction.
RegOpenUserClassesRoot Retrieves a handle to the HKEY_CLASSES_ROOT key for the specified user.
RegOverridePredefKey Maps a predefined registry key to a specified registry key.
RegQueryInfoKey Retrieves information about the specified registry key.
RegQueryMultipleValues Retrieves the type and data for a list of value names associated with an open registry key.
RegQueryReflectionKey Determines whether reflection has been disabled or enabled for the specified key.
RegQueryValueEx Retrieves the type and data for a specified value name associated with an open registry key.
RegReplaceKey Replaces the file backing a registry key and all its subkeys with another file.
RegRestoreKey Reads the registry information in a specified file and copies it over the specified key.
RegSaveKey Saves the specified key and all of its subkeys and values to a new file.
RegSaveKeyEx Saves the specified key and all of its subkeys and values to a new file. You can specify the format for the saved key or hive.
RegSetKeyValue Sets the data for the specified value in the specified registry key and subkey.
RegSetKeySecurity Sets the security of an open registry key.
RegSetValueEx Sets the data and type of a specified value under a registry key.
RegUnLoadKey Unloads the specified registry key and its subkeys from the registry.
The following shell functions can be used with the registry:
AssocCreate
AssocQueryKey
AssocQueryString
AssocQueryStringByKey
SHCopyKey
SHDeleteEmptyKey
SHDeleteKey
SHDeleteValue
SHEnumKeyEx
SHEnumValue
SHGetValue
SHQueryInfoKey
SHQueryValueEx
SHRegCloseUSKey
SHRegCreateUSKey
SHRegDeleteEmptyUSKey
SHRegDeleteUSValue
SHRegDuplicateHKey
SHRegEnumUSKey
SHRegEnumUSValue
SHRegGetBoolUSValue
SHRegGetIntW
SHRegGetPath
SHRegGetUSValue
SHRegOpenUSKey
SHRegQueryInfoUSKey
SHRegQueryUSValue
SHRegSetPath
SHRegSetUSValue
SHRegWriteUSValue
SHSetValue
Номер ответа: 10
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #10
Добавлено: 27.02.10 08:14
Спасибо за помощь.
Ну для начала "ну плохо я перевариваю использование GOTO". Еще в ДОС-вого времени.
К тому же, что-то у меня не получается корректно использовать сей оператор. (Хотя в школьные времена (QBasic) проблем не было. ) Если пытаюсь использовать, то в том месте, где обработка, все нормально. А потом код дальше выполняется и если возникает какая-то еще ошибка (другая), то возникает переход на предыдущую обработку, что в корне не правильно. Не писать же до конца программы бесконечные переходы-корректировки. Поэтому как-то не полюбился мне этот оператор. А он похоже "платит" мне тем же.
Номер ответа: 11
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #11
Добавлено: 27.02.10 08:18
Я сделала немного по другому. При установке читаю GetAllSettings по путям из массива предприятий. Если параметров нет, то записываю пустые. Если есть, то пропуск. Может кривовато, но меня устраивает.
Номер ответа: 12
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #12
Добавлено: 27.02.10 12:01
On Error GoTo 0
должно сбросить обработку ошибок.
Номер ответа: 13
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #13
Добавлено: 27.02.10 12:16
А что и куда сбросить конкретно ? Сбросить для новой обработки (все свои метки у себя в "мозгах" или просто игнорировать ошибку ? Поясни, пожалуйста.
Если первое, то как нужно правильно писать код ?
Если второе, то мне не подходит, т. к., если нет такого раздела в реестре, мне нужно его создать.
Номер ответа: 14
Автор ответа:
Smith
ICQ: adamis@list.ru
Вопросов: 153
Ответов: 3632
Профиль | | #14
Добавлено: 27.02.10 13:36
"On Error Resume Next"
Игнорирует ошибки
"On Error GoTo МеткаОбработчикаОшибок"
устанавливает обработку, а то, что я написал в 12м посте сбрасывает эту обработку и ошибки валятся меседжбоксами, как обычно это бывает.
Если в конце обработчика ошибок есть он эрор гоуту 0, то этот обработчик никак не влияет на другие процедуры.
Я так думаю , а вообще обработка ошибок в вб6 просто никакая.
Номер ответа: 15
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #15
Добавлено: 27.02.10 14:08
"On Error Resume Next" игнорирует ошибки до конца модуля/программы. Например, написала On Error Resume Next, потом оператор с возможной ошибкой, потом дальше код. В процессе выполнения он и будет на ВСЕ ошибки просто тупо пытаться выполнить код дальше. Соответственно куча ошибок/неработающая/кривая программа.
"On Error GoTo МеткаОбработчикаОшибок"
Ситуация, описанная в 10 посте. Тоже не подходит. К тому же нужно по возможности не испугать "пугливых" пользователей "всякими окошками" , а разрулить ситуацию самим. Мои пользователи "пугливые": "А вдруг я что-нибудь напорчу, а я не умею, а пусть программа сама сделает, как я хочу"
Пишу кстати на VBA, не на VB. Но обработка на мой взгляд действительно "просто никакая". В Delphi лучше. Но приходится выкручиваться.