Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi registry (https://www.delphipraxis.net/5113-registry.html)

dde 24. Mai 2003 13:07


registry
 
wieso funktioniert das nicht:

Delphi-Quellcode:
uses registry...

procedure TForm1.FormCreate(Sender: TObject);
var Reg : TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey:=HKEY_CURRENT_USER;
Reg.OpenKey ('Software\Microsoft\Internet Explorer\TypedURLs', FALSE);
Reg.WriteString ('url1', '');
Reg.WriteString ('url2', '');
Reg.WriteString ('url3', '');
Reg.WriteString ('url4', '');
Reg.WriteString ('url5', '');
Reg.WriteString ('url6', '');
Reg.WriteString ('url7', '');
Reg.WriteString ('url8', '');
Reg.WriteString ('url9', '');
Reg.WriteString ('url10', '');
Reg.WriteString ('url11', '');
Reg.WriteString ('url12', '');
Reg.WriteString ('url13', '');
Reg.WriteString ('url14', '');
Reg.WriteString ('url15', '');
Reg.WriteString ('url16', '');
Reg.WriteString ('url17', '');
Reg.WriteString ('url18', '');
Reg.WriteString ('url19', '');
Reg.WriteString ('url20', '');
Reg.WriteString ('url21', '');
Reg.WriteString ('url22', '');
Reg.WriteString ('url23', '');
Reg.WriteString ('url24', '');
Reg.WriteString ('url25', '');
Reg.Destroy;
Form1.Close;
end;

Daniel B 24. Mai 2003 13:31

Hallo,

CloseKey nicht vergessen, ausserdem try..except benutzen. ;)
Könnte schief gehen. :)

Grüsse, Daniel :hi:

dde 24. Mai 2003 13:42

funktioniert auch nicht!

JoelH 24. Mai 2003 13:46

hmm,
 
vielleicht ein Rechteproblem ? Darf dein User denn überhaupt in der Registry rumfuchteln ?

PS: SpinEdit Problem gelöst ?

Daniel B 24. Mai 2003 13:48

Re: hmm,
 
Hallo,
Zitat:

Zitat von JoelH
vielleicht ein Rechteproblem ? Darf dein User denn überhaupt in der Registry rumfuchteln ?

Wenn Er sich vorher die Rechte holt, dann kann Er da drin "rumfuchteln". ;) //wäre eine möglichkeit das Er das nicht getan hat, kommt drauf an welches System

Grüsse, Daniel :hi:

dde 24. Mai 2003 14:00

Ich glaube nicht, dass es an den User-Rechten mangelt! Sind Administratorrechte nicht ausreichend??? Naja in anderen Delphiprogrammen klappt es (der gleiche source) nur bei mir nicht :-(!!

@joelH: Ja das Problem ist gelöst und abgehackt!

dde 24. Mai 2003 14:03

Habt den Source mal in einen Button gepackt: Dort klappt alles Prima!

Wie krieg ich das aber hin, wenn das Programm startet, das die Registryeinträge gelöscht werden und anschließend das Programm geschlossen wird, und wenn es geht ohne eine Programmoberfläche zu sehen!

EDIT: Mit ShowMessage('gelöscht')!! Form1.onClose??

MathiasSimmack 24. Mai 2003 14:12

Indem du den Code im DPR-Quelltext unterbringst und auf alle externen Units verzichtest. Also auch auf alle Formulare. Eine MessageBox kannst du auch mit gleichnamigen Befehl aus der Windows-Unit anzeigen lassen.
Mit Registry-Unit dürfte das Programm, das ja wohl nur die URLs des IE löschen soll, dann etwa 60k groß sein.

btw:
Delphi-Quellcode:
Reg.Destroy;
sollte besser
Delphi-Quellcode:
Reg.Free;
heißen. Den Tipp mit try/finally/end solltest du auch nicht in den Wind schlagen, denn u.U. kann es auf einem anderen Rechner (an dem du evtl. arbeitest, bzw. jemand, der dein Programm benutzt) Rechteprobleme geben. Zwar bei HKEY_CURRENT_USER eher unwahrscheinlich, aber warum die Möglichkeit riskieren wenn man es vermeiden kann?

Zu guter Letzt: würde es nicht reichen, einfache alle "url"-Einträge in dem Schlüssel zu entfernen? Die Registry-Unit bietet passende Funktionen zum Lesen aller Werte und Unterschlüssel in einem Schlüssel.
Aber selbst wenn du bei deiner Methode bleiben willst, wäre eine for-Schleife wohl günstiger, kürzer und eleganter:
Delphi-Quellcode:
for i := 1 to 25 do
  Reg.WriteString('url' + inttostr(i),'');

Daniel B 24. Mai 2003 14:15

Hallo,
Zitat:

Zitat von MathiasSimmack
Aber selbst wenn du bei deiner Methode bleiben willst, wäre eine for-Schleife wohl günstiger, kürzer und eleganter:
Delphi-Quellcode:
for i := 1 to 25 do
  Reg.WriteString('url' + inttostr(i),'');

Das wäre entwas besser für Ihn:
Delphi-Quellcode:
for i := 1 to 25 do
  Reg.WriteString('url1' + inttostr(i),'');
Grüsse, Daniel :hi:

Christian Seehase 24. Mai 2003 14:17

Moin DDE,

die Struktur sollte besser so aussehen:

Delphi-Quellcode:
Reg := TRegistry.Create;
try
  // Mach was mit dem Objekt
  if Reg.OpenKey(...) then
  begin
    try
      // Mach was mit dem geöffneten Key
    finally
      Reg.CloseKey;
    end;
  end;
finally
  FreeAndNil(Reg);
  // oder
  Reg.Free; // Nicht Destroy
end;
Warum das bei Dir im OnCreate nicht funktioniert ist mir allerdings auch nicht klar. Prüf' doch mal nach dem OpenKey, bzw. WriteString, ob das System nicht einen Fehler gemeldet hat (z.B. mit ShowErrorMessage(SysErrorMessage(GetLastError)); )

Es kann übrigens durchaus sein, dass Administratorrechte nicht genügen. Manche Keys sind auch für den Admin gesperrt. Ein Admin hat dann zwar das Recht sich die Berechtigungen zu geben, dies ist dann aber nicht die Standardeinstellung.

MathiasSimmack 24. Mai 2003 14:20

Zitat:

Zitat von Daniel B
Das wäre entwas besser für Ihn:
Delphi-Quellcode:
for i := 1 to 25 do
  Reg.WriteString('url1' + inttostr(i),'');

Warum sollte "url11" besser sein als der eigentliche Wert "url1"? Ich vermute, du hast einen Fleck auf der Brille. :wink: Durch die Schriftart des Delphi-Codes wirkt es wie eine Eins, tatsächlich steht da aber nur url gefolgt von einer Zahl im Bereich von 1 bis 25. Ich halte also meine Lösung nach wie vor für besser. :)

Daniel B 24. Mai 2003 14:24

Zitat:

Zitat von MathiasSimmack
Ich vermute, du hast einen Fleck auf der Brille.

:wall:
Das wirds wohl sein. Ich sollte nicht mehr mit der Sonnenbrille am PC sitzen. :cool:

Grüsse, Daniel :hi:

dde 24. Mai 2003 14:40

Habe es jetzt mal so gemacht:

Delphi-Quellcode:
program Reg;

uses
  Forms, Registry

{$R *.res};
procedure FormCreate(Sender: TObject);
var reg:Tregistry;
begin
Reg := TRegistry.Create;
Reg.OpenKey ('Software\Microsoft\Internet Explorer\', FALSE);
    try
      Reg.DeleteKey('TypedURLs')
    finally
      Reg.CloseKey;
    end;
Reg.Free;
end;
begin
  Application.Initialize;
  Application.Run;
end.
Funktioniert aber immer noch nicht^^!

MathiasSimmack 25. Mai 2003 07:51

Au weia. Ich habe eigentlich gemeint, dass du auf alle Formulare und unnötige Units verzichten sollst. Das heißt logischerweise: keine Forms-Unit. Und damit gibt es dann auch kein
Delphi-Quellcode:
Application.Initialize;
Application.Run;
Und dann scheinst du nicht zu lesen, was dir andere sagen. Du hast Christians Code unvollständig übernommen, denn zum einen fehlt der Haupt-try-finally-Block, und zum anderen ist "OpenKey" eine Funktion, deren Bool-Rückgabewert zur Prüfung (konnte der Schlüssel geöffnet werden oder nicht?) genutzt werden kann.

Du solltest die Prozedur "FormCreate" aus deinem Programm nehmen und den Registry-Code stattdessen gleich und richtig zwischen
Delphi-Quellcode:
begin
end.
schreiben. Dann sollte es auch funktionieren.

Übrigens: wenn du den Schlüssel "TypedURLs" löschen willst, dann brauchst du nicht vorher "Software\Microsoft\Internet Explorer" öffnen. Einfach
Delphi-Quellcode:
Reg.DeleteKey('Software\Microsoft\Internet Explorer\TypedURLs');
tut´s IMHO auch.

dde 25. Mai 2003 10:11

So jetzt funktioniert alles. Hier der richtige Code in der .dpr
Delphi-Quellcode:
program VerlaufLeeren;

uses
   Registry, Forms, Dialogs
{$R *.res};

var R:Tregistry;
begin
 R:=TRegistry.Create;
 R.DeleteKey('Software\Microsoft\Internet Explorer\TypedURLs');
 R.Free;
 ShowMessage('Verlauf erfolgreich geleert!');
end.
Leider ist die Exe-Datei 373 KB groß, weil "Forms" und "Dialogs" geladen werden, um "ShowMessage" anzuzeigen. Und ohne "Forms" und "Dialogs" ist die Datei nur 117 KB groß? Wie kann ich auf "Forms" und "Dialogs" verzichten und gleichzeitig eine Message erhalten??

Luckie 25. Mai 2003 10:58

Dann nimm:
Delphi-Quellcode:
Messagebox(0, 'Verlauf erfolgreich geleert.' 'Verlauf lleren', MB_ICONINFORMATION);
Eventuell wäre eine Meldung, wenn es nicht geklappt hat auch ganz witzig.

dde 25. Mai 2003 11:10

Thx @Luckie

So siehts dann als Entfassung aus (endlich :!: ):
(alles in der .dpr)
Delphi-Quellcode:
program VerlaufLeeren;

uses
   Registry, Windows
   {$R *.res};

var R:Tregistry;
begin
 R:=TRegistry.Create;
 R.DeleteKey('Software\Microsoft\Internet Explorer\TypedURLs');
 R.Free;
 MessageBox(0, 'Verlauf erfolgreich geleert.','Verlauf leeren', MB_ICONINFORMATION);
end.
Und die Datei ist jetzt nur 114 KB groß. Mit UPX gepackt nur 52 KB^^.

Luckie 25. Mai 2003 11:23

Zitat:

Zitat von dde
ist jetzt nur 114 KB groß.

Und geht so nicht. Oder wo gibts du die Root an?
Delphi-Quellcode:
program Project1;

uses
  Registry,
  Windows;

var
  R:Tregistry;
begin
  R:=TRegistry.Create;
  try
    R.RootKey:=HKEY_CURRENT_USER;
    if R.DeleteKey('Software\Microsoft\Internet Explorer\TypedURLs') then
      MessageBox(0, 'Verlauf erfolgreich geleert.','Verlauf leeren', MB_ICONINFORMATION)
    else
      MessageBox(0, 'Verlauf konnte nicht geleert werden.','Verlauf leeren', MB_ICONSTOP);
  finally
    R.Free;
  end;
end.

Chewie 25. Mai 2003 11:30

Zitat:

Zitat von Luckie
Zitat:

Zitat von dde
ist jetzt nur 114 KB groß.

Und geht so nicht. Oder wo gibts du die Root an?

Laut Delphi-Hilfe wird doch standardmäßig HKEY_CURRENT_USER eingestellt.

Zitat:

Zitat von Delphi-Hilfe
Mit Create wird ein TRegistry-Objekt erstellt. Dabei erhält die Eigenschaft RootKey den Wert HKEY_CURRENT_USER und die Eigenschaft LazyWrite den Wert True.


dde 25. Mai 2003 11:31

Zitat:

Und geht so nicht. Oder wo gibts du die Root an?
Funktionieren tut es!

Luckie 25. Mai 2003 11:32

Hm, das wußte ich noch nicht. Aber ich habe mir angewöhnt, so was explizit immer trotzdem anzugeben, man weiß ja nie.

MathiasSimmack 25. Mai 2003 19:26

Zitat:

Zitat von dde
Thx @Luckie

Soll nicht heißen, dass ich jetzt beleidigt bin, aber auf die MessageBox aus der Windows-Unit hatte ich dich bereits in meinem ersten Beitrag hingewiesen. :)

Zitat:

Und die Datei ist jetzt nur 114 KB groß. Mit UPX gepackt nur 52 KB^^.
Keine Ahnung was du da machst. Wenn ich das Programm selbst schreibe (etwa so im Stil von Luckies Code), dann ist es unkomprimiert gerade mal 59k groß (Delphi 5 Pro). Es kann aber sein, dass das an deiner RES-Datei liegt
Delphi-Quellcode:
{$R *.res}
Was ist da drin? Ein Multicolor-Icon mit mehreren Auflösungen? Das würde begründen, warum die EXE so groß ist. Allerdings ist dann das Packen mit UPX Blödsinn, weil standardmäßig nur das 1. Bild des ersten Icons nicht gepackt wird. Alle anderen schon.

Gruß.

Luckie 25. Mai 2003 20:54

Es liegt nicht an der res-Datei. Meine Version (D6) ist auch 138 MB groß - ohne res-Datei. Es liegt an der Unit Registry.pas.

Stanlay Hanks 25. Mai 2003 21:10

[Of Topic] Sorry aber MB? Du meinst schon KB, oder? :shock: :wink:
[/Of Topic]

Aber im ernst, macht diese Registy Unit wirklich so viel aus? Warum is die denn so groß?

Luckie 25. Mai 2003 21:15

KB natürlich.

MathiasSimmack 26. Mai 2003 06:33

Da würde mich mal interessieren, was Borland ab Version 6 alles in die Unit geschmissen hat. Ich finde den Overhead von ~30k (im Vergleich zum minimalsten Kompilat mit ~20k) von Delphi 5 schon schlimm. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 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