![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение параметра из реестра. [D3, D4, Win95/98, WinME]
Exploited © (2002-06-12 15:03:00)Здравствуйте!
Мне нужно всего лишь прочитать параметр ключа. И, если есть таковой - отметить Checkbox5, если нет - снять отметку. Я пытаюсь это сделать таким образом, но получаю ошибку "Access......". Что я делаю неправильно?
procedure CheckAutoRunKey;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey("Software\Microsoft\Windows\CurrentVersion\Run",false);
if reg.ValueExists("Reminder about...") then
Form1.Checkbox5.Checked:=true
else
Form1.Checkbox5.Checked:=false;
reg.CloseKey;
reg.free;
end;
И еще - посоветуйте где лучше вызывать данную функцию. Мне нужно, чтобы считывание происходило во время загрузки программы.
Игорь Шевченко (2002-06-13 10:37:00) [1]Если Form1 содержит мусор, то AV гарантировано. На событии OnCreate этой формы переменная, скорее всего, содержит мусор.
Вообще это наиболее частая ошибка - ссылаться на конкретную переменную с указателем на объект в методах этого объекта.
VID © (12.06.02 15:26)
> т.к. на момент onCreate объекта Form1, CheckBox1 ещё не
> существует... не родился ещё :)
В D3 может быть. В D4 и выше утвеждение неверно, если только принудительно не установлено в true свойство OldCreateOrder (а нафига? :-)))
Внук (2002-06-13 09:20:00) [2]>>VID © (12.06.02 20:24) "TO All: Так всё же ? Почему в самом первом приведённом коде (в событии TFORM1.onCreate), выдавалась AV ?"
Потому что OnCreate вызывается действительно после того, как создан объект VCL, но !!!
Объект Windows "окно" может быть еще не создан/инициализирован - зависит от скорости машины и загруженности ОС. В этом случае любые изменения, затрагивающие объект окна (визуальные изменения) приводят к AV. Сам ловился много раз :)))
Поэтому Ваш самый первый пост содержит достаточный ответ на вопрос автора, IMHO :)
Song (2002-06-13 08:20:00) [3]Вероятно реест у автора вопроса защищён в плане доступа только админом... да много всего может быть.. может создание форм было перепутано, я уже говорил об этом, в этом случае AV точно будет.
VID (2002-06-13 01:18:00) [4]TO Anatoly Podgoretsky: Чего-то я совсем запутался... Какая возможность ошибки ? Ведь код безошибочный был... Спору нет, он не был оптимальным, но был рабочим. И вообще-то если этот код вызывать на onCreate или onshow, то никаких ошибок не должно быть. А вот сабж возник... в чём же проблема-то ?
Anatoly Podgoretsky (2002-06-13 00:18:00) [5]А какая разница, если в него изначально заложена возможность ошибок
VID (2002-06-13 00:02:00) [6]To Song: нифига себе ! Тогда почему же возник сабж ? :)))
Song (2002-06-12 22:42:00) [7]>>Объясните, плиз...
Я попробовал этот код, всё запустилось без проблем..
VID (2002-06-12 20:24:00) [8]TO All: Так всё же ? Почему в самом первом приведённом коде (в событии TFORM1.onCreate), выдавалась AV ?
Объясните, плиз...
Exploited (2002-06-12 19:36:00) [9]>Даже по логике вещей, как может форма показываться
(show) перед тем как вообще появится на свет (create)
Меня тоже одолевали сомнения, но я слепо поверил инфе с какого-то сайта. Такие вот дела.
CheckBox5.Checked:=CheckAutoRunKey;
Теперь всё ясно и яснее не бывает.
Song (2002-06-12 19:30:00) [10]>>Я не очень понимаю, что это мне даёт и куда делось самое важное:
CheckBox5.Checked:=CheckAutoRunKey;
Даёт много всего и прежде всего стабильность.
Exploited (2002-06-12 19:27:00) [11]Я не очень понимаю, что это мне даёт и куда делось самое важное:
if reg.ValueExists("Reminder about...") then
Form1.Checkbox5.Checked:=true
else
Form1.Checkbox5.Checked:=false;
Имеено ради этого и создавалась данная функция.
Song (2002-06-12 19:27:00) [12]>>Если не ошибаюсь, onShow создается раньше, чем onCreate.
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988621800&n=16
Даже по логике вещей, как может форма показываться (show) перед тем как вообще появится на свет (create)
Anatoly Podgoretsky (2002-06-12 19:11:00) [13]Exploited (12.06.02 15:03)
Программы надо так писать, что бы небыло нужды искать ошибки, заниматься отладкой, у тебя же потенциальное количество опасных мест. Использование глобальных переменных с неопределенными значениями.
Первое что надо сделать, это превратить их процедуры в функцию и тогда не возникнет вопрос где и как вызывать.
function CheckAutoRunKey: Boolean;
begin
with TRegistry.Create do
try
{$ifdef VER130}
Access := KEY_READ;
{$endif}
RootKey := HKEY_LOCAL_MACHINE;
OpenKey("Software\Microsoft\Windows\CurrentVersion\Run",FALSE);
Result := ValueExists("Reminder about...");
finally
Free;
end;
end;
Exploited (2002-06-12 18:02:00) [14]Если не ошибаюсь, onShowсоздается раньше, чем onCreate. Значит об использовании моей функции в onShowтоже речи быть не может. Тогда как быть?
Song (2002-06-12 17:48:00) [15]Походу дела сам наврал. Не знаю почему AV. Не Form1 ни CheckBox5 в onCreate не могут вызвать AV, если только не перепутан порядок автоматического создания форм т.е. если Form1 ещё не создана, а в onCreate другой формы этот код вставлен.
Song (2002-06-12 17:11:00) [16]Vid, Вы не правы.
Событие TForm.onCreate возникает при создании объекта, но тогда когда он уже существует.
А ошибка возникает не от того, что не создан экземпляр TForm, а из-за того, что назначение на свойство Checked объекта TCheckBox влечёт его визуальное изменение, а вот это уже делать нельля т.к. форма ещё не видна.
Exploited (2002-06-12 17:05:00) [17]2Song :
Понятно, спасибо!
2Polevi :
>в OnShow такие вещи делать плохой стиль
Тогда где, если нужно прочитать параметр при загрузкепрограммы?
Polevi (2002-06-12 16:57:00) [18]в OnShow такие вещи делать плохой стиль, IMHO
и не надо никаких Form1.Tag
Song (2002-06-12 16:53:00) [19]:)))
if reg.ValueExists("Reminder about...") then
Form1.Checkbox5.Checked:=true
else
Form1.Checkbox5.Checked:=false;
Вот так не легче: Form1.CheckBox5.Checked:=reg.ValueExists("Reminder about..."); :))
Желательно указать TRegistry.Access.
TForm.Tag - это свойство формы типа Integer, где можно хранить любое целое число для каких-либо Ваших нужд.
Exploited (2002-06-12 16:47:00) [20]Спасибочки!Я действительно вызывал функцию по событию OnCreate и по OnShow тоже. В последнем случае была какая-то другая ошибка.
Возможно, вопрос тупой, но все-таки: что такое Form1.Tag?
Если собираешься отправить меня... к файлу справки, то лучше ничего не пиши.