Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prism Registry und Typen (https://www.delphipraxis.net/24123-registry-und-typen.html)

MathiasSimmack 15. Jun 2004 21:12


Registry und Typen
 
Quasi das Gegenstück zu Registry und DWORDs -

Mit "GetValue" kann man einen Wert aus der Registry lesen, der als Objekt zurückgegeben und entsprechend gecastet werden muss. Bei Strings kein Problem:
Delphi-Quellcode:
reg := Registry.LocalMachine.OpenSubKey('Schlüsselname');
if(reg <> nil) then
try
  ListView1.Items.Add(string(reg.GetValue('Name des Wertes')));
finally
  reg.Close;
end;
Das Casten in andere Typen ist, IMHO, auch nicht das Problem. Aber wie kann ich ermitteln, welcher Typ vorliegt? Sprich: Ob der Wert ein String, ein DWord oder bspw. ein Binärwert ist?

Bernhard Geyer 16. Jun 2004 07:07

Re: Registry und Typen
 
In der WinAPI gibt es die Funktion RegQueryInfoKey. Ich denke diese liefert die gewünschten Infos.

MathiasSimmack 16. Jun 2004 07:49

Re: Registry und Typen
 
Das heißt mit anderen Worten: Ich muss die Win32-API-Funktion benutzen, weil .NET von sich aus nichts in der Art zur Verfügung stellt. Okay, ich wollte ohnehin mal ausprobieren, wie so was funktioniert. ;)

Danke, Bernhard.

NicoDE 16. Jun 2004 08:00

Re: Registry und Typen
 
Zitat:

Zitat von MathiasSimmack
Mit "GetValue" kann man einen Wert aus der Registry lesen, der als Objekt zurückgegeben und entsprechend gecastet werden muss.

Warum dann nicht GetType() benutzen (oder den is-Operator um 'kompatibel' zu bleiben) um den Typen zu ermitteln?

MathiasSimmack 16. Jun 2004 08:46

Re: Registry und Typen
 
Es ist sogar noch einfacher. ;) Ich habe ja vergessen, dass .NET durchaus auch Vorteile hat. Folgendes Beispiel löst mein Problem und zeigt zusätzlich auch noch den Typnamen (wenn auch im .NET-Format) an.
Delphi-Quellcode:
const
  szUninst  = 'Software\Microsoft\Windows\CurrentVersion\Uninstall';

procedure TMainForm.LoadRegValues(const szName: string);
var
  reg       : RegistryKey;
  vals      : array of string;
  i         : integer;
  li        : ListViewItem;
  obj       : TObject;
begin
  lv.BeginUpdate;
  lv.Items.Clear;

  // Schlüssel öffnen, ...
  reg := Registry.LocalMachine.OpenSubKey(szUninst + '\' + szName);
  if(reg <> nil) then
  try
    vals   := reg.GetValueNames;
    if(length(vals) > 0) then
    begin
      for i := low(vals) to high(vals) do
      begin
        // Name, ...
        li := lv.Items.Add(vals[i]);
        obj := reg.GetValue(vals[i],nil);

        // ... & Typ, ...
        li.SubItems.Add(obj.GetType.ToString);

        // ... & Wert
        li.SubItems.Add(obj.ToString);
      end;

      SetLength(vals,0);
    end;
  finally
    reg.Close;
  end;

  lv.EndUpdate;
end;
Hintergedanke ist natürlich ein Programm, das die Liste der installierten Software in einem Tree-View anzeigt, und bei Auswahl eines Schlüssels (= Eintrag im TV) werden alle Einträge ermittelt und in einer List-View angezeigt.

Danke für die Denkanregung, Nico.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz