Autor Beitrag
MILÖ
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Mo 03.01.05 21:16 
Hallo
Ich habe ein Problem mit dieser Funktion.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function SetKeyOnReg(RootKey: HKEY; Key, Name, Value: string): Boolean;

var
  Reg: TRegIniFile;  //Möchte sie auf TRegistry ändern


begin
  Result := False;
  Reg := TRegIniFile.Create('');
  Reg.RootKey := RootKey;
  with TRegistry(Reg) do
    begin
      if OpenKey(Key, True) then 
        begin
          WriteString(Name, Value);
          if ValueExists(Name) then
            Result := True;
          CloseKey;
        end;
    end;
  Reg.Free;
end;

Unter Windows 98 setzt sie die Einträge in die Regstry. Leider gibt es unter Windows 2000 Probleme. Leider weiß ich nicht wie man die Klasse TRegistry benutzt. Kann mir jemand helfen und die Funktion abändern?
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Mo 03.01.05 21:57 
Das Problem ist wohl, dass der Benutzer unter Win2000 keine Rechte hat, HKEY_LOCAL_MACHINE zu schreiben, was passiert, wenn kein anderer Start-Key angegeben wird. Also entweder gibts du dem Benutzer Admin-Rechte oder (besser) du öffnest HKEY_CURRENT_USER.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 03.01.05 22:03 
Wenn man das Programm mit Adminnistratorenrechten startet, dann geht es. Das ist also nicht das Problem. Und die Delphi Hilfe ist sehr gut und umfangreich und fast zu jeder Funktion, Prozedur, Methode gibt es ein Beispiel in der Hilfe.
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Mo 03.01.05 22:32 
@ Luckie
Komisch in Deiner e-Mail an mich, hast Du geschrieben, dass es nicht funktioniert.
Zitat:
Ich habe versucht dein Programm unter Windows2000 sowohl als Benutzer mit eingeschränkten Rechten zu benutzen sowie als Administrator

und jetzt schreibst Du hier:
Zitat:
Wenn man das Programm mit Adminnistratorenrechten startet, dann geht es

Was denn nun? :roll:
Und wenn ich ein Beispiel hätte, dann hätte ich hier bestimmt nicht gepostet. Über die Delphi Hilfe hatten wir es ja schon:
Zitat:
Create instantiates a TRegistry object and sets the RootKey property to
HKEY_CURRENT_USER and the LazyWrite property to True. If an AAccess
parameter is supplied, this value is used to initialize the Access property.
Otherwise, Access is initialized to KEY_ALL_ACCESS."

Hattest Du mir geschrieben, war aber nicht wirklich eine Hilfe. Ich frage mich sowieso, warum Du hier noch schreibst. Ich wollte einfach nur eine kleine Änderung am Code.
Ich hatte Dir ja gesagt, dass ich kein Experte bin.

An alle Andern. Falls mir jemand helfen will, einfach nur den Quellcode ändern.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 03.01.05 23:14 
MILÖ hat folgendes geschrieben:
An alle Andern. Falls mir jemand helfen will, einfach nur den Quellcode ändern.

Du willst also mit TRegistry arbeiten. Dazu sollte man wissen, das es sich dabei um eine Klasse handelt die erstmal erstellt werden muss. Und natürlich wieder freigegeben werden sollte, wenn sie nicht mehr benötitgt wird.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyReg: TRegistry;
begin

  MyReg := TRegistry.Create;

  with MyReg do
  begin
    try

    finally
      Free;
    end;
  end;

end;


Das wäre schon mal der Grundaufbau. Nun setzt du mit RootKey den Hive. z.B. HKEY_CURRENT_USER

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyReg: TRegistry;
begin

  MyReg := TRegistry.Create;

  with MyReg do
  begin
    try
      RootKey := HKEY_CURRENT_USER;
    finally
      Free;
    end;
  end;

end;


Als nächstes öffnest du den Schlüssel in dem du Daten lesen bzw. schreiben willst. Zum Lesen eignet sich OpenKeyReadOnly und zum Schreiben OpenKey. Beide Funktionen geben dir einen Wert zurück, womit du ermitteln kannst ob der Zugriff erfolgreich war.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyReg: TRegistry;
begin

  MyReg := TRegistry.Create;

  with MyReg do
  begin
    try
      RootKey := HKEY_CURRENT_USER;
      if OpenKey('Software\Mein Firmenname\Mein Produkt', True) then
      begin

      end;
    finally
      Free;
    end;
  end;

end;


Nun ist der Schlüssel geöffnet und du kannst deine Daten z.B. mit WriteString in die Registry schreiben.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyReg: TRegistry;
begin

  MyReg := TRegistry.Create;

  with MyReg do
  begin
    try
      RootKey := HKEY_CURRENT_USER;
      if OpenKey('Software\Mein Firmenname\Mein Produkt', True) then
      begin
        WriteString('Mein Wertename', 'Mein Wert');
      end;
    finally
      Free;
    end;
  end;

end;


So wie es aussieht, läuft alles so wie du dir es vorstellst. Nun kannst du deine eigene Funktion schreiben, um einfacher auf die Registry zu zugreifen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function SetKeyOnReg(ARootKey: HKEY; const AKey, AName, AValue: String): Boolean;
begin

  Result := False;

  with TRegistry.Create do
    try
      RootKey := ARootKey;
      if OpenKey(AKey, True) then
      begin
        WriteString(AName, AValue);
        Result := True;
      end;
    finally
      Free;
    end;

end;

_________________
Ciao, Sprint.
MILÖ Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

WIN 98 SE
Delphi 3.0
BeitragVerfasst: Mo 03.01.05 23:30 
@ Sprint
:lol: Danke damit kann ich arbeiten und vor allem lernen.... :wink:
Ich habe erstmal in meiner Funktion HKEY_LOCAL_MACHINE durch HKEY_CURRENT_USER ersetzt.
Hatte UC-Chewie geschrieben. Ich hoffe das funktioniert auch.
Werde mich wohl mal schlau machen müssen, was jetzt genau der Unterschied ist zwischem TRegistry und TRegIniFile. Beide scheinen ja auf HKEY_CURRENT_USER zuzugreifen.

Trotz allem nochmal Danke für die tolle Beschreibung.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 03.01.05 23:42 
MILÖ hat folgendes geschrieben:
@ Luckie
Komisch in Deiner e-Mail an mich, hast Du geschrieben, dass es nicht funktioniert.
Zitat:
Ich habe versucht dein Programm unter Windows2000 sowohl als Benutzer mit eingeschränkten Rechten zu benutzen sowie als Administrator

und jetzt schreibst Du hier:
Zitat:
Wenn man das Programm mit Adminnistratorenrechten startet, dann geht es

Was denn nun? :roll:

Nach dem ich es noch mal als Admin gestartet hatte ging es.

Zitat:

Und wenn ich ein Beispiel hätte, dann hätte ich hier bestimmt nicht gepostet. Über die Delphi Hilfe hatten wir es ja schon:
Zitat:
Create instantiates a TRegistry object and sets the RootKey property to
HKEY_CURRENT_USER and the LazyWrite property to True. If an AAccess
parameter is supplied, this value is used to initialize the Access property.
Otherwise, Access is initialized to KEY_ALL_ACCESS."

Ist es denn so schwer mal in der Hilfe TRegistry einzugeben, auf eine Methode zu klicken(create zum Beispiel) und sich dann mal das Beispiel anzugucken?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\RunOnce', True) then
   begin
      Reg.WriteString('MyApp','"' + ParamStr(0) + '"');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
    inherited;
  end;


Zitat:

Hattest Du mir geschrieben, war aber nicht wirklich eine Hilfe. Ich frage mich sowieso, warum Du hier noch schreibst. Ich wollte einfach nur eine kleine Änderung am Code.
Ich hatte Dir ja gesagt, dass ich kein Experte bin.

Ich habe die Hoffnung noch nicht aufgeben, dass du mal etwas Eigeninitiative zeigst und dir mal die Hilfe anguckst. Dazu mus sman kein Experte sein, wird aber eventuell einer, wenn man das mal tut.

Im übrigen war es das für mich gewesen. Ich versuche zu helfen und werde hier nur von dir angeblöckt, warum ich denn noch hier schreiben würde. Das muss ich mir nicht antun.