Delphi7 Wyjątek przy odczytywaniu wartości rejestru.

Odpowiedz Nowy wątek
2011-08-12 09:54
0

Witam.

W moim programie chcę aby najpierw była ustawiana "skórka", która była ostatnio wybrana przez użytkownika. W tym celu stworzyłem zmienną globalną

kolorek:Integer;

której odpowiednio przy zmianie skórki będą nadawane wartości 1-4. Przy wyłączaniu programu informacja o wartości tej zmiennej byłaby zapisywana do rejestru. Wszystko mogłoby być pięknie, ale trzeba wziąć pod uwagę, że przy pierwszym uruchomieniu programu w rejestrze jeszcze nic nie będzie. Pomyślałem, że można by skorzystać z wyjątku i gdy odczyt z rejestru nie powiedzie się ustawić jakąś domyślną wartość zmiennej "kolorek". Niestety poniższy kod (fragment zdarzenia OnCreate formularza) nie chce działać:

  try
  try
  Reg:=TRegistry.Create;
  Reg.RootKey:=HKEY_CURRENT_CONFIG;
  Reg.OpenKey('MOJPROGRAM\kolor',True);
 
  kolorek:=Reg.ReadInteger('barwa');
  finally
  Reg.Free;
  end;
  Except
  kolorek:=1;
  Form1.Color:=clLime;
  end;
 

Po włączeniu programu od razu wyskakuje błąd informujący, że nie można odczytać 'barwa' z rejestru (to oczywiste, jeszcze nie istnieje!), jakby program "nie widział" dodanego wyjątku.

edytowany 1x, ostatnio: kolejorz, 2011-08-12 10:04

Pozostało 580 znaków

2011-08-12 10:07
Janusz
0

Rozumiem że chodzi o to że wywala błąd, a nie chcesz żeby wywalał.
No więc jeżeli uruchamiasz program przez Delphi (czyli F9 albo klikasz zielony trójkąt) to zawsze wyskoczy błąd.
Zminimalizuj delphi i uruchom Projekt1.exe. Wtedy nie wyskoczy błąd.

Pozostało 580 znaków

2011-08-12 10:10
Jarek
0

Kod jest "poprawny".

A zamiast wyjątku polecam metodę Reg.KeyExists()

Pozostało 580 znaków

2011-08-12 10:11
0

Ach to takie buty! Faktycznie, masz rację. A czy wyjątek except jest brany pod uwagę i przy niemożności odczytania wartości rejestru ustawi wartość zmiennej na 1?

Dobra. Spróbuję "Reg.KeyExists" jak radzi Jarek :)

edytowany 1x, ostatnio: kolejorz, 2011-08-12 10:12

Pozostało 580 znaków

2011-08-12 10:17
Jarek
0

"Ach to takie buty! Faktycznie, masz rację. A czy wyjątek except jest brany pod uwagę i przy niemożności odczytania wartości rejestru ustawi wartość zmiennej na 1?"

A forma zmieniła kolor na zielonkawy? ;)

ps. Zacznij już dziś poprawnie stosować wcięcia w kodzie.

Pozostało 580 znaków

2011-08-12 10:47
Opi
0

Skąd ty żeś wziął ten root ?

Reg.RootKey := HKEY_CURRENT_CONFIG;

Wykonuj w ten sposób:

Reg:=TRegistry.Create;
try
  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey('MOJPROGRAM\kolor', True);
  if (Reg.ValueExists('Barwa')) and (Reg.GetDataType('Barwa') = rdInteger) then Kolorek := Reg.ReadInteger('WiekKopii')
  else Reg.WriteInteger('Barwa', 1);
  Reg.CloseKey;
finally
  Reg.Free;
 end;
OpenKey też zwraca wartość (boolean) która oznacza czy udało się otworzyć klucz, więc to też może się przydać :P . - payl 2011-08-12 15:41

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0