Merhaba Arkadaşlar bir proje için Regeditte işlem yapmaya ihtiyacım var.
Kodlarım bu şekilde,
OpenKeyReadOnly ile açıp okuduğumda problem yok okuyorum,
OpenKey ile açıp okumak istediğimde bu hatayı fırlatıyor.
yapma istediğim şey key kontrol edip yoksa açmak, varsa değerine bakmak değeri farklı ise değiştirmek... bu kadar basit işte neden çuvalladım anlamadım
var
Reg:TRegistry;
begin
try
Reg:=TRegistry.Create(KEY_READ or KEY_WRITE);
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE; Reg.Access := KEY_ALL_ACCESS;
if KeyExists('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') then
begin
//OpenKeyReadOnly('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') ;
OpenKey('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION',true);
ShowMessage(inttostr( ReadInteger('PoWMSEditor.exe')));
//ReadCurrency();
//ReadBinaryData();
//ReadBool();
//ReadDate();
//ReadDateTime();
//ReadFloat();
//ReadString();
//ReadTime();
end;
Reg.CloseKey;
Reg.Free;
end;
except on E: Exception do ShowMessage(e.Message);
end;
end;
Yanlış anlamadı isem "FEATURE_BROWSER_EMULATION" altında "PoWMSEditor.exe" var mı diye kontrol etmiyorsun kodunda. ReadInteger için yardım kısmında şöyle bir ifade var: "If the Registry entry does not contain an integer, an exception is raised."
Bu anlamda belki aşağıdaki gibi bir yöntem deneyebilirsin.
procedure TfrmMain.Button2Click(Sender: TObject);
var
Reg: TRegistry;
TestString: String;
Value: Integer;
begin
// Create kısmı try bloğunun dışında yazman daha doğru olur.
Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
try
// Böyle kısa isimli bir değişken için "with" kullanmana gerek yok diye düşünüyorum. Yinede senin kodunu bu noktada değiştirmedim.
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE; Reg.Access := KEY_ALL_ACCESS;
if KeyExists('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') then
begin
OpenKey('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION',true);
// Değeri string değişken içine okumaya çalış.
try
TestString := ReadString('PoWMSEditor.exe');
except
// String değer okunurken hata oluşması demek kayıtlı bilgi string değil demektir. Yardım içinde ara: TRegistry.ReadString
ShowMessage('Registry key içeriği hatalı');
end;
// Değer okundu. Okunan değeri Integer değişken içine aktar.
Value := 0;
if not TryStrToInt(TestString, Value) then
ShowMessage('Registry key içeriği boş olabilir. Okunan değer: ' + QuotedStr(TestString))
else
ShowMessage('Okunan değer: ' + IntToStr(Value));
end;
end;
// try..except bloğunda özel birşey yapmayıp sadece ekranda hata mesajı gösteriyorsan kullanmana gerek yok.
finally
Reg.CloseKey; // Bu iki satır try..finally bloğu içinde olduğu için yukarıdaki kodda hata oluşsa dahi hafıza kaçağı ("memory leak") olmasını engeller.
Reg.Free;
end;
end;
Edit: Pardon İngilizce yazdığınız kısmı şimdi anladım bu arada aynı kodları arkadaşımda sorunsuz çalıştı onda win7 bende win10 var sanırım yetkisel bir problem var..
Erkan Bey anlamadığım kısım integer bir alanı (REG_DWORD) alanı neden direk ReadInteger ile okumadınız da String okuyup integere çevirdiniz ?
finally kısmında haklısınız biliyorum öyle olduğunu ama henüz okumayı beceremediğim için oraya gelemedim ama ilk başta create ederken hemen o bloğu hazırlamak en sağlıklısıdır senin koda gelince çalışmadı.
bu blok çalıştı.
ShowMessage('Registry key içeriği boş olabilir. Okunan değer: ' + QuotedStr(TestString))
bu blok çalıştı.
ShowMessage('Registry key içeriği boş olabilir. Okunan değer: ' + QuotedStr(TestString))
Yukarıdan anladığım kod çalışıyor. Senin Registry içinde o değer kayıtlı değil. Ya da senin programının o değeri okuma yetkisi yok. Kodu aşağıdaki şekilde çevirelim. Belki o zaman daha anlaşılır hale gelir.
Programı derledikten sonra normal çalıştırarak dene. Bir de "Run as Administrator" şeklinde çalıştırarak dene. Bakalım sonuç değişecek mi...
procedure TfrmMain.Button2Click(Sender: TObject);
var
Reg: TRegistry;
Value: Integer;
begin
// Create kısmı try bloğunun dışında yazman daha doğru olur.
Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
try
// Böyle kısa isimli bir değişken için "with" kullanmana gerek yok diye düşünüyorum. Yinede senin kodunu bu noktada değiştirmedim.
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE; Reg.Access := KEY_ALL_ACCESS;
if KeyExists('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION') then
begin
OpenKey('SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION',true);
// Değeri mevcut mu kontrol et
if ValueExists('PoWMSEditor.exe') then // Değer mevcut mu?
begin
Value := ReadInteger('PoWMSEditor.exe'); // Değeri oku
ShowMessage('Registry key okundu. Okunan değer: ' + QuotedStr(IntToStr(Value)));
end else
ShowMessage('"PoWMSEditor.exe" değeri kayıtlı değil veya okunamıyor'); // Değer mevcut değil
end;
end;
// try..except bloğunda özel birşey yapmayıp sadece ekranda hata mesajı gösteriyorsan kullanmana gerek yok.
finally
Reg.CloseKey; // Bu iki satır try..finally bloğu içinde olduğu için yukarıdaki kodda hata oluşsa dahi hafıza kaçağı ("memory leak") olmasını engeller.
Reg.Free;
end;
Bu oldu Ertan bey, Teşekkürler yeniyim bu işlerde öğrenmeye çalışıyorum.
yukarıda ki çalışmadıdan kastım okumadı olacaktı. kusuruma bakmayın.
Benim Hatam sadece Valueyi kontrol etmememden mi kaynaklanıyor o halde OpenKey olarak açıyorsam kesinlikle olup olmadığını denetlemem gerekiyor olarak algıladım.
OpenKey ile açmadan önce Key mevcut mu (KeyExists) kontrol etmek gerekiyor.
ReadInteger, ReadString vb ile okumadan önce Değer mevcut mu (ValueExists) kontrol etmek gerekiyor.