|
Вопрос # 2 942/ вопрос открыт / |
|
Здравствуйте! Не знал в какой раздел точно писать, но всетаки. Сохраняю параметры программы в реестре, но не могу понять в чем проблема... Если нет ключа в реестре (при первом старте) вылетает. Ниже пример кода... Или же я делаю что-то не так?
Приложение: Переключить в обычный режим- procedure TMain.FormCreate(Sender: TObject);
- begin
- with TRegistry.Create do
- try
- RootKey:=HKEY_CURRENT_USER;
- if OpenKey('SOFTWAREOCorpNM', True) then
- begin
- Main.Left:=ReadInteger('MainLeft'); //
- Main.Top:=ReadInteger('MainTop'); //
- Main.Height:=ReadInteger('MainHeight'); //
- Main.Width:=ReadInteger('MainWidth'); //
- CloseKey;
- end;
- finally
- Free;
- end;
- end;
-
- procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- with TRegistry.Create do
- try
- RootKey:=HKEY_CURRENT_USER;
- if OpenKey('SOFTWAREOCorpNM', True) then
- begin
- WriteInteger('MainLeft', Main.Left); //
- WriteInteger('MainTop', Main.Top); //
- WriteInteger('MainHeight', Main.Height); //
- WriteInteger('MainWidth', Main.Width); //
- CloseKey;
- end;
- finally
- Free;
- end;
- end;
 |
Вопрос задал: Ozz (статус: Посетитель)
Вопрос отправлен: 23 июня 2009, 15:17
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Цитата (Delphi):
Retrieves an integer value from a specified data value associated with the current key.
Delphi syntax:
function ReadInteger(const Name: String): Integer;
C++ syntax:
int __fastcall ReadInteger(const AnsiString Name);
Description
Call ReadInteger to read an integer value from a specified data value associated with the current key. Name is the name of the data value to read.
If the Registry entry does not contain an integer, an exception is raised.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 23 июня 2009, 15:32
Оценка за ответ: 3
Комментарий к оценке: Думаю каждый перед тем как задать вопрос смотрит справку... но думаю не каждый ее понимает!
|
Мини-форум вопроса
Всего сообщений: 17; последнее сообщение — 24 июня 2009, 11:15; участников в обсуждении: 5.
|
Ozz (статус: Посетитель), 23 июня 2009, 15:18 [#1]:
В коде от чего-то слеши не вставились!
|
|
Пупкин В В (статус: 2-ой класс), 23 июня 2009, 15:38 [#2]:
при создании формы надо проверить сушествование ключа
функция KeyExists
если его нет, то пропустить выполнение чтения данных.
|
|
Amidamaru (статус: 4-ый класс), 23 июня 2009, 15:47 [#3]:
А можно ещё проще. При чтении в OpenKey во втором параметре указть false.
|
|
Ozz (статус: Посетитель), 23 июня 2009, 16:57 [#4]:
А может лучше все в ini файл писать? А то как-то не охото реестр засорять!
Еще вопрос, как сохранить свойство, развернуто окно или нет?
|
|
Вадим К (статус: Академик), 23 июня 2009, 17:30 [#5]:
Когда то давно (во времена 3.11) МС рекомендовала, что бы каждое приложение хранило в ини файле в папке Windows. Но когда они поняли, что всё это разрастается и засоряется - создали реестр. Но потом поняли, что реестр засорить ещё проще.
На данный момент рекомендация выглядит так. Хранить надо в папке Documents and Setting\свой пользователь (для висты она чуточку по другому называется, но есть специальные функции, которые выдают её название.)
Также следует помнить, что к примеру на немецкой хр эта папка своеобразно называется, поэтому не стоит закладываться на явные пути.
На сайте есть моя статья с описанием,как эти папки получить, и что туда можно писать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ozz (статус: Посетитель), 23 июня 2009, 17:36 [#6]:
А может проще в папке с программой хранить? И ходить далеко не надо, и при копировании сразу всяк конфигурация остается! Да и после удаления не придется искать остатки программы (что меня вечно бесит)!
|
|
Вадим К (статус: Академик), 23 июня 2009, 17:57 [#7]:
Можно. Но надо помнить о двух моментах.
Папка может быть доступна только на чтение.
Программа может не иметь доступа на запись (потому что не админ ). В целом, если программа запускается с произвольного каталога - то пусть лежит рядом, если будет работать с Program Files, то лучше в Documents and Settints - это имеет три больших приимущества.
- не проблем с правами (всегда запишеться)
- легко делются многопользовательские конфигурации
- мухи отдельно, контлеты отдельно (то есть конфиги в одном месте, код в другом)
ну и это пока рекомендуется МС...
По поводу проверки на возможность записи. Это мое самое любимое место, когда программа в FormClose пытается сохраниться. Но не может (прав нет, с СД запущена) и выдает ошибку. Но форма то не закрылась! и пользователь снова пытается закрыть форму...
Второй, более изощерённый способ - это сохранение конфига по таймеру... красота неописуемая
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ozz (статус: Посетитель), 23 июня 2009, 18:46 [#8]:
Это все понятно, но чтоже всетаки насчет свойства развернуто окно или нет? Со свойством формы WindowState не особо получается...
|
|
Вадим К (статус: Академик), 23 июня 2009, 18:55 [#9]:
а в чем проблема? всё хорошо сохраняется. Более того, множеством способов.
Наиболее простой и жесткий (но всё таки рабочий) - это в наглую
Ini.WriteInteger('sec','pole',integer(form1.windowstate));
где то так...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ozz (статус: Посетитель), 23 июня 2009, 19:04 [#10]:
Как так через Integer? Этоже не целое поле, ругается на несовместимость типов, думал уже через переменную какую...
Хотя нет. Сохраняет нормально, а вот при загрузке ругается, смысл понятен, но надо что-то с типами делать!
|
|
Вадим К (статус: Академик), 23 июня 2009, 19:13 [#11]:
Через насильное приведение типов. На самом деле оно для компилятора целого типа, более того, компилятр может однозначно конвертировать.
Рекомендую почитать о том, что такое перечисления (они же enum в сишной классификации).
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 23 июня 2009, 20:38 [#12]:
Когда я учился, интернета не было. Вообще не было! И как я научился, а? Наверно, просто писал и писал программы одну за другой и экспериментировал, экспериментировал... И книжку читал. Она у меня была всего одна, в мягком переплёте, вся заляпанная, рваная такая, как щас помню. Это было так давно...
А приведение типов и в турбопаскале было, и в С++. Было, есть и будет. Если понять, как оно работает, то считай передвинулся на ступень выше.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Ozz (статус: Посетитель), 23 июня 2009, 23:51 [#13]:
Вадим К, благодарю...
min@y™, в этом и проблема интернета, не дает спокойно экспериментировать... Но мысль твою понял!
|
|
min@y™ (статус: Доктор наук), 24 июня 2009, 08:19 [#14]:
Цитата (Ozz):
Оценка за ответ: 3
Комментарий: Думаю каждый перед тем как задать вопрос смотрит справку... но думаю не каждый ее понимает!
Я уже начинаю привыкать получать за свои правильные ответы от тебя плохие оценки.
В этот раз я тебя просто ткнул носом в нужный раздел справочной системы, где всё написано. И я ни за что не поверю, что ты этот раздел читал до того, как задать вопрос.
А те, до кого смысл раздела не доходит, пусть перечитают его дважды.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 24 июня 2009, 10:12 [#15]:
to min@y™.
Некоторые люди знают три языка, некоторые два с половиной (как я к примеру). А некоторые с трудом свой родной понимают, не говоря о английском. И даже десять раз перечитает - не поможет. Электронные переводчики тут тоже не помогут - они часто так искажают смысл, что оригинальный и переведённый текст перпендикулярны по смыслу...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 24 июня 2009, 10:32 [#16]:
Цитата (Вадим К):
Некоторые люди знают три языка, некоторые два с половиной (как я к примеру). А некоторые с трудом свой родной понимают, не говоря о английском. И даже десять раз перечитает - не поможет.
Не спорю. Но если не знаешь хотя бы базового технического английского, то в программировании делать нечего.
Всё равно, меня умиляют люди, которые, вывалив на форум свой код, просят найти в нём ошибку. При этом копипастят этот код с чужих исходников и ни разу не прогоняют его под дебаггером. А тыкнешь их носом в раздел справки, где всё написано - ставят тебе 3 балла за то, что это ОНИ не знают английского языка.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 24 июня 2009, 11:15 [#17]:
Знания английского - хорошее качество, но понимание программирования и анлийский язык весьма перпенидикулярные понятия.
Некоторые не знают, что такое дебаггер.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|