![]() |
Autostart: Wieso funktioniert der Code nicht ?!?
Hiho ...
will in mein Programm einen Autostart einbauen! Ich finde meinen Fehler aber nicht!!! (also der Compiler meckert auch nicht) :
Code:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var reg: TRegistry; begin if CheckBox1.checked = true then begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Trouble_Maker\Secure\', true); reg.WriteInteger('Autostart', 1); end else reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Trouble_Maker\Secure\', true); Reg.DeleteValue('Autostart'); end;
Code:
procedure TForm1.FormCreate(Sender: TObject);
var Reg: TRegistry; begin //Autostart try reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Trouble_Maker\Secure\', true); if reg.ValueExists('Autostart') then begin CheckBox1.checked := true; end; except free; end; end;
Code:
so ... also
procedure TForm1.CheckBox1Click(Sender: TObject);
var Reg: TRegistry; begin if CheckBox1.checked = true then begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); Reg.WriteString('Security-Tool.exe', ParamStr(0)); Reg.Destroy; end; if CheckBox1.checked = true then begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True); Reg.DeleteValue('Security-Tool.exe'); Reg.Destroy; end; end; 1. Auch wenn ich das Programm im Autostart habe, zeigt er nicht bei der Checkbox einen Haken. 2. Wenn ich den Autostart mit der Checkbox ausschalte (keinen Haken) dann startet das Programm trotzdem !!! woran liegt das ?!? danke cu Trouble_Maker |
Liegt der Fehler daran das du 2x
Code:
im letzten Code-Abschnitt geschrieben hast?
CheckBox1.checked = true then
|
hi ...
@Uncle Cracker: Stimmt! Habe aus Versehen anstatt false noch einmal true geschrieben !!! Doch leider funktioniert es trotzdem noch nicht :-( Weiss echt nich wieso. Trouble_Maker |
hmm ...
hat keiner mehr einen Lösungsvorschlag ?!? wäre cool, wenn ihr mir helfen könntet! Denn ich weiss einfach absolut nicht, wieso der Code nicht runktioniert !!! danke Trouble_Maker |
Moin Trouble Maker,
zu Deinen Code Schnipseln fällt mir 'ne ganze Menge ein: Zum einen warum es nicht funktioniert: Vermutlich befindet sich im Programmpfad ein Leerzeichen. Du müsstest nicht paramstr(0) in den Key schreiben, sondern '"'+paramstr(0)+'"'. Dann vermisse ich in den ersten beiden Abschnitten die Freigabe des Reg Objektes und überall das Schliessen des Keys. (try/finally Blöcke wären auch gut) Als nächstes prüfst Du nirgends, ob das was Du da gemacht hast auch funktioniert hat. Ob ein OpenKey den Key überhaupt geöffnet hat wird nicht geprüft, und dank Deines Try/Except Blockes würde auch nie eine Exception in diesem Bereich auffallen. Ausserdem kannst Du leicht unnötigen Code vermeiden: Der letzte Abschnitt könnte auch so aussehen:
Delphi-Quellcode:
Aufpassen solltest Du noch beim Zuweisen eines Wertes an CheckBox.Checked, denn hierdurch wird ein OnClick Ereignis ausgelöst.
procedure TForm1.CheckBox1Click(Sender: TObject);
var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True) then begin try if CheckBox1.Checked then begin Reg.WriteString('Security-Tool.exe', '"'+ParamStr(0)+'"'); end else begin Reg.DeleteValue('Security-Tool.exe'); end; finally Reg.CloseKey; end; end; finally FreeAndNil(Reg); end; end; |
hi ...
hmm ja danke erstmal ... habe jetzt leider keine Zeit. Werde das morgen mal überprüfen und schreiben ob es funktioniert. Vielen Dank :-D Trouble_Maker |
Noch eine Anmerkung, was Christian wohl übersehen hat:
In HKLM kann bei NT-basierenden Systemen nur der Admin schreiben. Desweiteren wäre dein Programm dann im Autostart von allen Bneutzer, ob sie wollen oder nicht. Besser in HLCU. Oder was ich noch besser fände, da transparenter für die Benutzer, die Autostartgruppe benutzen. |
Tachschen... so ich bins nochmal
hab jetzt den Code von Chrisitan Seehase ausprobiert. Der Compiler motzt nicht! Habe außerdem try und finally Blöcke eingebaut!!! Aber es funktioniert trotzdem nicht ... Das Progamm startet automatisch, und dann wird nichtmal in der Combobox der Haken angezeigt! Das kann doch nicht stimmen! Außerdem kann ich komischerweiße (mit meinem Code) das Programm nicht aus dem Autostart rausnehemen!!! kann mir jemand helfen ?!? danke Trouble_Maker |
Hallo,
ist jetzt vielleicht ein bisschen länger, tut aber was es soll. :D Vielleciht vom Code her etwas verständlicher, weil die langen Pfade nicht angegeben werden.
Delphi-Quellcode:
Der Aufruf bei einer CheckBox, oder einem MenüItem das geChecked ist, müsste dann so aussehen.
procedure SetAutoStart(AppTitle, AppName: string;
Register: Boolean; RunOnce: Boolean = False); var Registry: TRegistry; RegistryOpen: Boolean; begin RegistryOpen := False; Registry := TRegistry.Create; try Registry.RootKey := HKEY_CURRENT_USER; case RunOnce of True: begin RegistryOpen := Registry.OpenKey(REGSTR_PATH_RUNONCE, False); end; False: begin RegistryOpen := Registry.OpenKey(REGSTR_PATH_RUN, False) end; end; if RegistryOpen then begin if Register then begin try Registry.WriteString(AppTitle, AppName); except MessageBeep(MB_ICONASTERISK); ShowMessage('Der Autostartschlüssel konnte nicht in der ' + 'Registry angelegt werden !'); end; end else begin if Registry.ValueExists(AppTitle) then begin if not Registry.DeleteValue(AppTitle) then begin MessageBeep(MB_ICONASTERISK); ShowMessage('Der Autostartschlüssel konnte nicht aus der ' + 'Registry entfernt werden !'); end; end; end; Registry.CloseKey; end; finally Registry.Free; end; end;
Delphi-Quellcode:
Grüsse, Daniel :hi:
procedure TForm1.Autostart1Click(Sender: TObject);
begin if Autostart1.Checked then begin SetAutoStart('DBSysCon', ParamStr(0), False, False); AutoStart1.Checked := False; end else begin SetAutoStart('DBSysCon', ParamStr(0), True, False); AutoStart1.Checked := True; end; end; Nachtrag: AutoStart1 ist ein MenüPunkt mit Check-Möglichkeit. Also so ein Häckchen davor. Für ein ganz normales Menü. Oder auch PopUp-Menü. |
Hiho ...
@Daniel: Wieso findet er, wenn ich den Code von dir compiliere "REGSTR_PATH_RUNONCE" und "REGSTR_PATH_RUN" nicht ?!? muss ich irgendeine Komponente in die uses Liste noch mit aufnehmen ?!?!? danke Trouble_Maker |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz