![]() |
Probleme mit Regedit und Form öffnen!!
Hallo Leute, hab folgendes Problem: Ich habe für mein Programm eine Registrierung eingebaut, die der User beim 1. Start des Programmes eigeben muß. Diese wird in der Regedit gespeichert. Wenn der User aber ein weiteres mal in das Programm einsteigt, dann soll die Registrierunsform (Keyform) nicht mehr erscheinen, aber dass Programm soll trotzdem bei jedem Start die Registrierung überprüfen.
Soweit sogut. Ich habe es bis jetzt soweit, dass die Registrierung in der Regedit steht. Das funktioniert super. Mein problem ist nur, dass, wenn ich das Programm starte, immer die Keyform erscheint, wo ich den Code eingeben muß, obwohl in der Regedit eh schon das richtige drinn steht. Wenn ich dann auf OK klicke (in der Keyform), dann wird das ganze Programm geschlossen. Ich soll aber auf die Hauptform kommen, bzw. das Keyform soll erst gar nicht erscheinen. Der Code sieht so aus:
Code:
Könnt Ihr mir da behilflich sein???
procedure TKundendaten.FormCreate(Sender: TObject);
var OK: Boolean; begin REG := TRegistry.Create; try try REG.RootKey := HKEY_CURRENT_USER; if REG.OpenKey('\Software\SELF', True) then begin if REG.ValueExists('CODE??') then a:=StrToInt(REG.ReadString('CODE??')) else a := 0; REG.CloseKey; end; except a := 0; end; finally REG.Free; end; if (a = 0) or (not CheckCode(IntToStr(a), 25, 7)) then { RegKey nicht vorhanden oder ungültige Seriennummer } begin Keyform := TKeyform.Create(nil); try OK := Keyform.ShowModal = mrOK; if OK then OK := CheckCode(IntToStr(a),25, 7); if not OK then begin Application.ShowMainForm := False; Application.Terminate; Exit; end; finally Keyform.Free; end; end; end; |
Lade doch erst dein Hauptform und frage dann ab !!
|
Also bei mir klappts mit dem Code :D
Code:
Wenn noch kein Wert exsistiert dann öffnet sich eine Inputbox sonst eine Messagebox mit dem vorher eingegebenen Wert.
procedure TForm1.FormCreate(Sender: TObject);
var OK: Boolean; reg:tregistry; a:integer; begin REG := TRegistry.Create; try try REG.RootKey := HKEY_CURRENT_USER; if REG.OpenKey('\Software\SELF', True) then begin if REG.ValueExists('CODE??') then a:=StrToInt(REG.ReadString('CODE??')) else a := 0; REG.CloseKey; end; except a := 0; end; finally REG.Free; if a=0 then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',inputbox('IN','pp','1234')); end; end else showmessage(inttostr(a)); end; end; Du kannst ja einfach dein Fenster anstelle der Inputbox zu öffnen :) Und anstelle der Messagebox kannst du ja die Seriennummer prüfen :D MFG Thomas |
Moin m-werk,
ich würd's so machen: In der Projektdatei prüfen, ob das Programm gestartet werden darf:
Code:
wobei dann, in einer Unit, noch folgendes steht:
begin
Application.Initialize; if CheckRegistry then begin Application.CreateForm(TForm1, Form1); Application.Run; end; end.
Code:
Das ist jetzt nur stilisiert. RegOk liefert true zurück, wenn ein gültiger Eintrag in der Registry besteht. Ist das nicht der Fall, wird das Abfrageformular geöffnet. Im Erfolgsfalle, gibt das dann das ModalResult mrOK zurück, ansonsten mrCancel.
function CheckRegistry : Boolean;
function RegOK : Boolean; implementation uses unit2; {$R *.DFM} function CheckRegistry : Boolean; var RegForm : TRegForm; iResult : integer; begin Result := RegOK; if Result then begin // Registrierung erfolgt, dann kann das Programm starten exit; end; RegForm := TRegForm.Create(nil); // aus Unit2 try iResult := RegForm.ShowModal; Result := iResult = mrOK; finally FreeAndNil(RegForm); end; end; function RegOK : Boolean; begin Result := false; end; Ach ja, das TRegForm darf natürlich nicht in der Projektdatei erzeugt werden. |
Hallo, ich habe nun folgendes probiert (siehe code unten). Dies würde ja super funktionieren, aber ich möchte bei der Inputbox eine überprüfung einbauen. Kann man das überhaupt machen? Die überprüfung soll so sein wie sie zum schluß meines Codes auch ist. Ich meine so eine IF then else abfrage. Geht dass überhaupt mit inputbox?
Grund ist folgender. Ich kann in die Inputbox einen beliebigen wert eingeben. Der wird in der Registry auch gespeichert. Aber bei der Überprüfung, (siehe letzten zeilen im code) wird dann das programm nicht mehr gestartet. Das möchte ich verhindern. ODER: Nach der überprüfung (letzten Zeilen im code) soll entweder das Programm gestartet werden, wenn die überprüfung in Ordnung ist, sonst soll eben wieder das Login (inputbox) kommen.
Code:
Kann man das irgendwie anstellen?
procedure TKundendaten.FormCreate(Sender: TObject);
//var OK: Boolean; begin REG := TRegistry.Create; try try REG.RootKey := HKEY_CURRENT_USER; if REG.OpenKey('\Software\SELF', True) then begin if REG.ValueExists('CODE??') then a:=StrToInt(REG.Readstring('CODE??')) else a := 0; REG.CloseKey; end; except a := 0; end; finally REG.Free; if a=0 then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF', True) then begin reg.WriteString('CODE??',inputbox('Programm freischalten','Code','')); end; end else if CheckCode(IntToStr(a),25, 7) then Application.ShowMainForm := True; end; end; |
Die Funktion Inputbox liefert als result einen String, du kanns also:
Code:
If inputbox = 'was solls sein??' then
|
Hi, kann ich das so machen:
if inputbox = CheckCode(IntToStr(a),25, 7) then Application.ShowMainForm := True; |
Zitat:
Habe mich schon gefragt, wann du hier erscheinst. Also Gruß, erst mal! :D Generell würde ich die Variante von Christian nehmen, die klappt nämlich prima. Allerdings hat er es wirklich stark stilisiert, das dürfte dir - m-werk - nicht unbedingt helfen. Deswegen meine Tipps dazu: In der Funktion "RegOK" schreibst du nur den Registry-Code, der deine Seriennummer ausliest und ggf. vergleicht. Rückgabewert ist true wenn die Seriennummer gefunden wurde UND dem Muster entspricht. Die andere Funktion "CheckRegistry" benutzt die gerade erwähnte Funktion und zeigt dir das Eingabeformular für die Seriennummer an, wenn es nicht gefunden wurde. Ich habe gerade mal ein Fake-Programm geschrieben, und es geht ohne Probleme. Du musst "RegOK" nur vor "CheckRegistry" in der Unit definieren, sonst findet letztere die erstere nicht. Hat Christian wahrscheinlich nicht erwähnt, weil er´s für zu offensichtlich hielt. :wink: Zum Rest: wie und wo du´s einbindest, hat Kollege Seehase ja auch gezeigt. |
Zitat:
|
Fast halt noch die parameter!!
Code:
Allerdings wird mit jedem Inputbox der dialog aufgerufen,also würde ich den wert in nen String/integer zwischenspeichern.
a:=strtoint(inputbox('Programm freischalten','Code',''));
if CheckCode(IntToStr(a),25, 7)) then Warum schreibst du einen String rein anstatt eines Integer? Und du hast noch vergessen den eingetragen wert danach noch in die Reg zu schreiben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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-2025 by Thomas Breitkreuz