Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 942

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте! Не знал в какой раздел точно писать, но всетаки. Сохраняю параметры программы в реестре, но не могу понять в чем проблема... Если нет ключа в реестре (при первом старте) вылетает. Ниже пример кода... Или же я делаю что-то не так?

Приложение:
  1. procedure TMain.FormCreate(Sender: TObject);
  2. begin
  3. with TRegistry.Create do
  4. try
  5. RootKey:=HKEY_CURRENT_USER;
  6. if OpenKey('SOFTWAREOCorpNM', True) then
  7. begin
  8. Main.Left:=ReadInteger('MainLeft'); //
  9. Main.Top:=ReadInteger('MainTop'); //
  10. Main.Height:=ReadInteger('MainHeight'); //
  11. Main.Width:=ReadInteger('MainWidth'); //
  12. CloseKey;
  13. end;
  14. finally
  15. Free;
  16. end;
  17. end;
  18.  
  19. procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
  20. begin
  21. with TRegistry.Create do
  22. try
  23. RootKey:=HKEY_CURRENT_USER;
  24. if OpenKey('SOFTWAREOCorpNM', True) then
  25. begin
  26. WriteInteger('MainLeft', Main.Left); //
  27. WriteInteger('MainTop', Main.Top); //
  28. WriteInteger('MainHeight', Main.Height); //
  29. WriteInteger('MainWidth', Main.Width); //
  30. CloseKey;
  31. end;
  32. finally
  33. Free;
  34. end;
  35. end;


Ozz Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Ozz (статус: Посетитель), 23 июня 2009, 15:18 [#1]:

В коде от чего-то слеши не вставились!
Пупкин В В

Пупкин В В (статус: 2-ой класс), 23 июня 2009, 15:38 [#2]:

при создании формы надо проверить сушествование ключа
функция KeyExists
если его нет, то пропустить выполнение чтения данных.
Amidamaru

Amidamaru (статус: 4-ый класс), 23 июня 2009, 15:47 [#3]:

А можно ещё проще. При чтении в OpenKey во втором параметре указть false.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
Ozz

Ozz (статус: Посетитель), 23 июня 2009, 16:57 [#4]:

А может лучше все в ini файл писать? А то как-то не охото реестр засорять!

Еще вопрос, как сохранить свойство, развернуто окно или нет?
Вадим К

Вадим К (статус: Академик), 23 июня 2009, 17:30 [#5]:

Когда то давно (во времена 3.11) МС рекомендовала, что бы каждое приложение хранило в ини файле в папке Windows. Но когда они поняли, что всё это разрастается и засоряется - создали реестр. Но потом поняли, что реестр засорить ещё проще.
На данный момент рекомендация выглядит так. Хранить надо в папке Documents and Setting\свой пользователь (для висты она чуточку по другому называется, но есть специальные функции, которые выдают её название.)
Также следует помнить, что к примеру на немецкой хр эта папка своеобразно называется, поэтому не стоит закладываться на явные пути.
На сайте есть моя статья с описанием,как эти папки получить, и что туда можно писать.
Галочка "подтверждения прочтения" - вселенское зло.
Ozz

Ozz (статус: Посетитель), 23 июня 2009, 17:36 [#6]:

А может проще в папке с программой хранить? И ходить далеко не надо, и при копировании сразу всяк конфигурация остается! Да и после удаления не придется искать остатки программы (что меня вечно бесит)!
Вадим К

Вадим К (статус: Академик), 23 июня 2009, 17:57 [#7]:

Можно. Но надо помнить о двух моментах.
Папка может быть доступна только на чтение.
Программа может не иметь доступа на запись (потому что не админ:) ). В целом, если программа запускается с произвольного каталога - то пусть лежит рядом, если будет работать с Program Files, то лучше в Documents and Settints - это имеет три больших приимущества.
- не проблем с правами (всегда запишеться)
- легко делются многопользовательские конфигурации
- мухи отдельно, контлеты отдельно (то есть конфиги в одном месте, код в другом)
ну и это пока рекомендуется МС...

По поводу проверки на возможность записи. Это мое самое любимое место, когда программа в FormClose пытается сохраниться. Но не может (прав нет, с СД запущена) и выдает ошибку. Но форма то не закрылась! и пользователь снова пытается закрыть форму...
Второй, более изощерённый способ - это сохранение конфига по таймеру... красота неописуемая:)
Галочка "подтверждения прочтения" - вселенское зло.
Ozz

Ozz (статус: Посетитель), 23 июня 2009, 18:46 [#8]:

Это все понятно, но чтоже всетаки насчет свойства развернуто окно или нет? Со свойством формы WindowState не особо получается...
Вадим К

Вадим К (статус: Академик), 23 июня 2009, 18:55 [#9]:

а в чем проблема? всё хорошо сохраняется. Более того, множеством способов.
Наиболее простой и жесткий (но всё таки рабочий) - это в наглую
Ini.WriteInteger('sec','pole',integer(form1.windowstate));
где то так...
Галочка "подтверждения прочтения" - вселенское зло.
Ozz

Ozz (статус: Посетитель), 23 июня 2009, 19:04 [#10]:

Как так через Integer? Этоже не целое поле, ругается на несовместимость типов, думал уже через переменную какую...

Хотя нет. Сохраняет нормально, а вот при загрузке ругается, смысл понятен, но надо что-то с типами делать!
Вадим К

Вадим К (статус: Академик), 23 июня 2009, 19:13 [#11]:

Через насильное приведение типов. На самом деле оно для компилятора целого типа, более того, компилятр может однозначно конвертировать.
Рекомендую почитать о том, что такое перечисления (они же enum в сишной классификации).
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 23 июня 2009, 20:38 [#12]:

Когда я учился, интернета не было. Вообще не было! И как я научился, а? Наверно, просто писал и писал программы одну за другой и экспериментировал, экспериментировал... И книжку читал. Она у меня была всего одна, в мягком переплёте, вся заляпанная, рваная такая, как щас помню. Это было так давно...
А приведение типов и в турбопаскале было, и в С++. Было, есть и будет. Если понять, как оно работает, то считай передвинулся на ступень выше.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ozz

Ozz (статус: Посетитель), 23 июня 2009, 23:51 [#13]:

Вадим К, благодарю...
min@y™, в этом и проблема интернета, не дает спокойно экспериментировать... Но мысль твою понял!
min@y™

min@y™ (статус: Доктор наук), 24 июня 2009, 08:19 [#14]:

Цитата (Ozz):

Оценка за ответ: 3
Комментарий: Думаю каждый перед тем как задать вопрос смотрит справку... но думаю не каждый ее понимает!

Я уже начинаю привыкать получать за свои правильные ответы от тебя плохие оценки.
В этот раз я тебя просто ткнул носом в нужный раздел справочной системы, где всё написано. И я ни за что не поверю, что ты этот раздел читал до того, как задать вопрос.
А те, до кого смысл раздела не доходит, пусть перечитают его дважды.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 24 июня 2009, 10:12 [#15]:

to min@y™.
Некоторые люди знают три языка, некоторые два с половиной (как я к примеру). А некоторые с трудом свой родной понимают, не говоря о английском. И даже десять раз перечитает - не поможет. Электронные переводчики тут тоже не помогут - они часто так искажают смысл, что оригинальный и переведённый текст перпендикулярны по смыслу...
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 24 июня 2009, 10:32 [#16]:

Цитата (Вадим К):


Некоторые люди знают три языка, некоторые два с половиной (как я к примеру). А некоторые с трудом свой родной понимают, не говоря о английском. И даже десять раз перечитает - не поможет.


Не спорю. Но если не знаешь хотя бы базового технического английского, то в программировании делать нечего.
Всё равно, меня умиляют люди, которые, вывалив на форум свой код, просят найти в нём ошибку. При этом копипастят этот код с чужих исходников и ни разу не прогоняют его под дебаггером. А тыкнешь их носом в раздел справки, где всё написано - ставят тебе 3 балла за то, что это ОНИ не знают английского языка.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 24 июня 2009, 11:15 [#17]:

Знания английского - хорошее качество, но понимание программирования и анлийский язык весьма перпенидикулярные понятия.
Некоторые не знают, что такое дебаггер.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.04 сек.