![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
есть кусок кода:
Код:
procedure TConnectToServerForm.FormShow(Sender: TObject);
var
Registry: TRegistry;
begin
Registry := TRegistry.Create;
// Set position in list server
Registry.RootKey := HKEY_CURRENT_USER;
Registry.OpenKey('Software\Configurator', true);
try
SQLServerCombobox.ItemIndex := Registry.ReadInteger('LastIndexServerList');
except
SQLServerCombobox.ItemIndex := 0;
end;
Registry.CloseKey;
// Set login in list server
Registry.RootKey := HKEY_CURRENT_USER;
Registry.OpenKey('Software\Configurator', true);
try
SQLLoginEdit.Text := Registry.ReadString('LastLoginServerList');
except
SQLLoginEdit.Text := '';
end;
Registry.CloseKey;
Registry.Free;
end;Exeption c текстом: First chance exception at $75F59617. Exception class ERegistryException with message 'Failed to get data for 'LastIndexServerList''. Process configurator.exe (3932) Выскакивает только один раз при чтении именно этого Int значения. При чтении строкового параметра exception не выскакивает. Почему при чтении строкового параметра exception не выскакиевает? Ни одного из параметров в реестре нет. Ни строкового ни интового. --- win7, d2010 |
|
#2
|
|||
|
|||
|
программу запускаешь с правами админа?
|
|
#3
|
||||
|
||||
|
Не в провах админа дело. Просто он читаетзначение, а его нету. там где у тебя SQLServerCombobox.ItemIndex := 0; добав ище одну строку
WriteInteger('Value',0); У тебя созастца отдельная ячейка в реестре и при следующем запуске ошибку выбивать не будет. |
|
#4
|
|||
|
|||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Rat, при чтении строкового параметра ошибки и не будет т.к. значение отсутствие значения это уже есть какая-то строка, а для числа это недопустимое значение, вот он и ругается.
Я делал так: Код:
function IntKeyIsPresent(rKey:HKEY; Path, Name:string; var KeyValue:integer):boolean;
begin
Result:=False;
try
R:=TRegistry.Create;
R.RootKey:=rKey;
R.OpenKey(Path,True);
if R.KeyExists(Name)=True
then
begin
KeyValue:=R.ReadInteger(Name);
Result:=True;
end
else KeyValue:=0;
R.CloseKey;
Except R.Free;
end;
end; |
|
#6
|
||||
|
||||
|
потому что в писании написано:
Цитата:
Последний раз редактировалось NumLock, 08.09.2010 в 16:09. |
|
#7
|
|||
|
|||
|
NumLock, Вы правы. Проглядел это в хелпе.
Всё теперь понятно. Еще вопросик в догонку. Я так понял что Registry.RootKey := HKEY_CURRENT_USER; необходимо вызывать каждый раз перед открытием ключа, иначе после Registry.CloseKey; у меня Registry.RootKey становиться равным последнему открытому ключу. Это заметно при записи. Код:
procedure TConnectToServerForm.FormClose(Sender: TObject;
var Action: TCloseAction);
var
i : Integer;
Registry: TRegistry;
begin
// Save list servers
Registry := TRegistry.Create;
Registry.RootKey := HKEY_CURRENT_USER;
Registry.OpenKey('Software\Configurator\ListServer', true);
for i := 0 to SQLServerComboBox.Items.Count - 1 do
begin
Registry.WriteString('server' + IntToStr(i), SQLServerCombobox.items.Strings[i]);
end;
Registry.CloseKey;
Registry.RootKey := HKEY_CURRENT_USER;
// Save position from server list to registry
Registry.OpenKey('Software\Configurator', true);
Registry.WriteInteger('LastIndexServerList', SQLServerCombobox.ItemIndex);
Registry.CloseKey;
Registry.RootKey := HKEY_CURRENT_USER;
// Save login servers to registry
Registry.OpenKey('Software\Configurator', true);
Registry.WriteString('LastLoginServerList', SQLLoginEdit.Text);
Registry.CloseKey;
Registry.Free;
end;Если не указывать Registry.RootKey := HKEY_CURRENT_USER; то у меня создаются ключи Software\Configurator\Software\Configurator Я прав? Последний раз редактировалось Rat, 08.09.2010 в 17:29. |
|
#8
|
||||
|
||||
|
TRegistry создается с RootKey = HKEY_CURRENT_USER. RootKey сам не меняется, что, имхо, правильно.
|