Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизЧтение параметра из реестра. Найти похожие ветки
← →
Exploited (2002-06-12 15:03) [0]Здравствуйте!
Мне нужно всего лишь прочитать параметр ключа. И, если есть таковой - отметить 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;
И еще - посоветуйте где лучше вызывать данную функцию. Мне нужно, чтобы считывание происходило во время загрузки программы.
← →
VID (2002-06-12 15:26) [1]В коде ошибок нету. Думается, что ты вызываешь эту функцию в TForm1.FormCreate. Если так, то твой "Access violation" вполне понятен, т.к. на момент onCreate объекта Form1, CheckBox1 ещё не существует... не родился ещё :)
Корче вызывай функцию при событии TForm1.OnShow:
Procedure TForm1.Formshow (...);
begin
IF Form1.tag = 0 then
begin //Гарантируется однократный вызов функции, только при первом отображении(show) формы
Form1.Tag := 1;
CheckAutoRunKey;
end;
end;
Главное, что бы при создании формы Form1.Tag был равен 0, и вообще не использовать это свойство (tag) во всей программе.
← →
Exploited (2002-06-12 16:47) [2]Спасибочки! Я действительно вызывал функцию по событию OnCreate и по OnShow тоже. В последнем случае была какая-то другая ошибка.
Возможно, вопрос тупой, но все-таки: что такое Form1.Tag?
Если собираешься отправить меня... к файлу справки, то лучше ничего не пиши.
← →
Song (2002-06-12 16:53) [3]:)))
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, где можно хранить любое целое число для каких-либо Ваших нужд.
← →
Polevi (2002-06-12 16:57) [4]в OnShow такие вещи делать плохой стиль, IMHO
и не надо никаких Form1.Tag
← →
Exploited (2002-06-12 17:05) [5]2Song :
Понятно, спасибо!
2Polevi :
>в OnShow такие вещи делать плохой стиль
Тогда где, если нужно прочитать параметр при загрузке программы?
← →
Song (2002-06-12 17:11) [6]Vid, Вы не правы.
Событие TForm.onCreate возникает при создании объекта, но тогда когда он уже существует.
А ошибка возникает не от того, что не создан экземпляр TForm, а из-за того, что назначение на свойство Checked объекта TCheckBox влечёт его визуальное изменение, а вот это уже делать нельля т.к. форма ещё не видна.
← →
Song (2002-06-12 17:48) [7]Походу дела сам наврал. Не знаю почему AV. Не Form1 ни CheckBox5 в onCreate не могут вызвать AV, если только не перепутан порядок автоматического создания форм т.е. если Form1 ещё не создана, а в onCreate другой формы этот код вставлен.
← →
Exploited (2002-06-12 18:02) [8]Если не ошибаюсь, onShow создается раньше, чем onCreate. Значит об использовании моей функции в onShow тоже речи быть не может. Тогда как быть?
← →
Anatoly Podgoretsky (2002-06-12 19:11) [9]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;
← →
Song (2002-06-12 19:27) [10]>>Если не ошибаюсь, onShow создается раньше, чем onCreate.
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988621800&n=16
Даже по логике вещей, как может форма показываться (show) перед тем как вообще появится на свет (create)
← →
Exploited (2002-06-12 19:27) [11]Я не очень понимаю, что это мне даёт и куда делось самое важное:
if reg.ValueExists("Reminder about...") then
Form1.Checkbox5.Checked:=true
else
Form1.Checkbox5.Checked:=false;
Имеено ради этого и создавалась данная функция.
← →
Song (2002-06-12 19:30) [12]>>Я не очень понимаю, что это мне даёт и куда делось самое важное:
CheckBox5.Checked:=CheckAutoRunKey;
Даёт много всего и прежде всего стабильность.
← →
Exploited (2002-06-12 19:36) [13]>Даже по логике вещей, как может форма показываться
(show) перед тем как вообще появится на свет (create)
Меня тоже одолевали сомнения, но я слепо поверил инфе с какого-то сайта. Такие вот дела.
CheckBox5.Checked:=CheckAutoRunKey;
Теперь всё ясно и яснее не бывает.
← →
VID (2002-06-12 20:24) [14]TO All: Так всё же ? Почему в самом первом приведённом коде (в событии TFORM1.onCreate), выдавалась AV ?
Объясните, плиз...
← →
Song (2002-06-12 22:42) [15]>>Объясните, плиз...
Я попробовал этот код, всё запустилось без проблем..
← →
VID (2002-06-13 00:02) [16]To Song: нифига себе ! Тогда почему же возник сабж ? :)))
← →
Anatoly Podgoretsky (2002-06-13 00:18) [17]А какая разница, если в него изначально заложена возможность ошибок
← →
VID (2002-06-13 01:18) [18]TO Anatoly Podgoretsky: Чего-то я совсем запутался... Какая возможность ошибки ? Ведь код безошибочный был... Спору нет, он не был оптимальным, но был рабочим. И вообще-то если этот код вызывать на onCreate или onshow, то никаких ошибок не должно быть. А вот сабж возник... в чём же проблема-то ?
← →
Song (2002-06-13 08:20) [19]Вероятно реест у автора вопроса защищён в плане доступа только админом... да много всего может быть.. может создание форм было перепутано, я уже говорил об этом, в этом случае AV точно будет.
← →
Внук (2002-06-13 09:20) [20]>>VID © (12.06.02 20:24) "TO All: Так всё же ? Почему в самом первом приведённом коде (в событии TFORM1.onCreate), выдавалась AV ?"
Потому что OnCreate вызывается действительно после того, как создан объект VCL, но !!!
Объект Windows "окно" может быть еще не создан/инициализирован - зависит от скорости машины и загруженности ОС. В этом случае любые изменения, затрагивающие объект окна (визуальные изменения) приводят к AV. Сам ловился много раз :)))
Поэтому Ваш самый первый пост содержит достаточный ответ на вопрос автора, IMHO :)
← →
Игорь Шевченко (2002-06-13 10:37) [21]Если Form1 содержит мусор, то AV гарантировано. На событии OnCreate этой формы переменная, скорее всего, содержит мусор.
Вообще это наиболее частая ошибка - ссылаться на конкретную переменную с указателем на объект в методах этого объекта.
VID © (12.06.02 15:26)
> т.к. на момент onCreate объекта Form1, CheckBox1 ещё не
> существует... не родился ещё :)
В D3 может быть. В D4 и выше утвеждение неверно, если только принудительно не установлено в true свойство OldCreateOrder (а нафига? :-)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c