![]() |
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 |
Hallo m-werk,
im finally Teil deines Codes willst du ja, falls a den Wert 0 hat einen Freischaltcode einlesen und nur, wenn er korrekt ist, diesen speichern und das Programm starten. :
Code:
Es geht bestimmt auch einfacher, aber dieser Code basiert auf deinem Grundgerüst.
finally
REG.Free; if a=0 then begin { Neuen Code einlesen } fCode := ''; { Maximal drei Versuche } versuch := 0; gefunden := False; repeat try fCode := inputbox('Programm freischalten','Code',''); gefunden := CheckCode(IntToStr(fCode), 25, 7); Inc(versuch); except { hat der User möglicherweise gar keine Zahl eingegeben? } on exception do Inc(versuch); until gefunden or versuch =3; end else gefunden := CheckCode(IntToStr(a),25, 7); if gefunden then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF', True) then begin reg.WriteString('CODE??',IntToStr(a)); end; Application.ShowMainForm := True; end; Du musst noch fCode als String, V versuch als Integer und gefunden als Boolean deklarieren. |
Moin Zusammen,
dann will ich noch mal :mrgreen: Diesmal weniger stilisiert. Eine Unit mit allgemeinen Funktionen:
Code:
und die mit dem Registrierungsformular.
unit Unit3; // Allgemeine Funktionen
interface uses windows,registry,sysutils,controls; function RegOK : Boolean; function IsValidValue(const p_sValue : string) : Boolean; function CheckRegistry : Boolean; implementation uses unit2; // Hier ist das TRegForm deklariert function IsValidValue(const p_sValue : string) : Boolean; begin // hier muss noch die Prüfung rein, oder der // ausgelesene Wert auch erlaubt ist. // In Abhängigkeit davon dann Result setzen Result := true; end; function RegOK : Boolean; var REG : TRegistry; sValue : string; begin // Be pessimistic :)) Result := false; REG := TRegistry.Create; try REG.RootKey := HKEY_CURRENT_USER; if REG.OpenKey('\Software\SELF', True) then begin try if REG.ValueExists('CODE??') then begin try sValue := REG.ReadString('CODE??'); except exit; end; Result := IsValidValue(sValue); end; finally REG.CloseKey; end; end; finally FreeAndNil(REG); end; end; 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; end.
Code:
Die Projektdatei dann so wie oben schon angegeben
unit Unit2;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Registry; type TRegForm = class(TForm) // Hier kann der der Registrierungscode eingegeben werden. Edit1: TEdit; // btOK ist das ModalResult mrOK zugeordnet // btCancel dann mrCancel btOK: TButton; btCancel: TButton; procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private { Private-Deklarationen } public { Public-Deklarationen } end; var RegForm: TRegForm; implementation uses Unit3; // wegen IsValidValue {$R *.DFM} procedure TRegForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var REG : TRegistry; begin if ModalResult = mrCancel then begin // Wenn Abbruch, dann fertig CanClose := true; exit; end; If not IsValidValue(Edit1.Text) then begin // Ungültig, dann meckern CanClose := false; MessageBox(self.Handle,'Registrierungscode ungültig','FEHLER',MB_ICONERROR or MB_OK); exit; end; CanClose := true; REG := TRegistry.Create; try REG.RootKey := HKEY_CURRENT_USER; if REG.OpenKey('\Software\SELF', True) then begin try try REG.WriteString('CODE??',Edit1.Text); except CanClose := false; // Fehlermeldung end; finally REG.CloseKey; end; end else begin CanClose := false; // Fehlermeldung, dass Registrierung nicht geschrieben werden konnte. end; finally FreeAndNil(REG); end; end; end. @Mathias: Zitat:
|
Ich hab die Überprüfung auch noch eingebaut:
Code:
Ich hoffe es funtz :D
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('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234')); reg:=tregistry.Create; 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; if CheckCode(IntToStr(a),25, 7)= false then application.Terminate; end; end else begin if CheckCode(IntToStr(a),25, 7)= false then application.Terminate; end; end; end; MFG Thomas |
Zitat:
Beweisstück A, Euer Ehren:
Code:
:D
function CheckRegistry : Boolean;
function RegOK : Boolean; implementation ... Abgesehen davon bräuchte man IMHO "RegOk" und "IsValidValue" gar nicht exportieren. "CheckRegistry" als einzige Funktion im interface-Teil würde reichen, denke ich. Und da du ja nun in deiner zweiten Variante die Reihenfolge der Funktionen geändert hast, gibt es auch keine Probleme beim Aufrufen mehr. |
Vielen Dank, mein lieber Delphi-Compiler.
Ich führe hier ein Plädoyer und was machst du? Kompilierst jetzt alles ohne Probleme. Egal, an welcher Stelle die "RegOk" im Interface steht. Herzlichen Dank. :twisted: Also, die Anklage zieht ihr Beweisstück zurück. :wink: Mein Compiler hatte gestern wohl einen schlechten Tag. Da wollte er um´s Verrecken nicht arbeiten, wenn "RegOk" nach "CheckRegistry" steht. Heute macht er´s. Hm, ist ja auch Wochenende. |
So, nun habe ich den code von 'thomasdrewermann' verwendet, (dieser erscheint mir einleuchtend).
Leider hab ich dazu noch ein problem. Also, wenn ich die richtige Seriennummer eingegeben habe, dann wird diese auch richtig in der Registry gespeichert und das Programm funktioniert einwandfrei. Auch dann wenn ich es nochmals starte. Aber wenn ich jetzt den falschen Code eingebe, dann wird dieser auch in der Registry gespeichert. Das Programm wird jetzt zwar nicht mehr gestartet, aber wenn ich es noch mal starten möchte, geht es auch nicht. Da fehlt mir noch eine sache. Auch wenn der Code falsch ist, dann soll beim nächsten start wieder die inputbox erscheinen. Weiters, hab ich das mal probiert, aber der Regkey lässt sich nicht überschreiben. Kann man das denn auch so machen? Wenn der User einen Falschen Code eingibt, soll einfach nichts in die Registrierung gespeichert werden. Oder Wenn der User einen Falschen code eingibt, dann soll beim nächsten start, dieser aus der Registrierung gelöscht werden, damit wieder die Inputbox kommt. Eines von den 2 vorschlägen möchte ich noch einbauen. Mir wäre der Vorschlag, dass wenn der Code in der Inputbox falsch ist, dass erst gar nicht dieser in die Registrierung gespeichert wird. Wie kann ich dass noch machen? |
Na dann überprüf ihn doch vorher und wenn er nicht stimmt, dann rufst du die Prozedur zum Schreiben gar nicht erst auf.
|
Wie die überprüfung geht, weiß ich ja, aber ich weiß nicht wo ich diese genau hinsetzen soll?
Überprüfung If CheckCode(IntToStr(a), 25, 7)) = False then Das muß meines wissens nach die überprüfung sein. Nur wo setze ich diese hin:
Code:
Noch etwas ist mir aufgefallen:
procedure TKundendaten.FormCreate(Sender: TObject);
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('Seriennummer','Bitte geben sie ihre Seriennummer ein:','')); reg:=tregistry.Create; 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; if CheckCode(IntToStr(a),25, 7)= false then Application.Terminate; end; end else begin if CheckCode(IntToStr(a),25, 7)= false then Application.Terminate; end; end; end; Wenn ich in der Inputbox nichts eingebe, und auf OK oder Abbrechen klicke, dann kommt zwar eine Meldung: 'ist kein gültiger Integerwert' aber das programm läßt sich trotzdem starten. Das muß auch noch weg. |
Pack mal alles, was du in Craete hast in eine eigene Prozedur (RegisterApp, oder so).
Und in OnCreate machst du dann so was:
Code:
Die Überprüfung nimmst du dann natürlich aus der Schreiben-Prozedur raus.
if CheckCode) = TRUE then
RegisterApp(..); else Application.Terminate; |
Code:
Ich hoffe es sind keine Bugs mehr drin :D
procedure TForm1.FormCreate(Sender: TObject);
var OK: Boolean; reg:tregistry; a:integer; serial:string; 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 serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(strtoint(serial),25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end; end; end else begin if CheckCode(a,25, 7)= false then begin serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(strtoint(serial),25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end else application.Terminate; end; end; end; end; end; |
Hi, ich hab in die procedure von oncreate folgenden Code jetzt drinn:
Code:
Weiters:
procedure TKundendaten.FormCreate(Sender: TObject);
begin if (not CheckCode(IntToStr(a), 25, 7)) then RegisterApp(..) else Application.Terminate; end; procedure RegisterApp; begin.... ..... end; Ist das richtig so? Ich bekomme jetzt bei dem FormCreate folgende Fehlermeldung: [Fehler] Hauptmenue.pas(365): Undefinierter Bezeichner: 'RegisterApp' und bei Procedure RegisterApp bekomme ich jetzt auch einige fehlermeldungen |
Na ja. Nicht sehr übersichtlich. Ich würde wie gesagt in OnCraete überprüfen und dann die In-die-Regsitry-schreib-Prozedur aufrufen.
|
Code:
private
{blablabla} procedure RegisterAPP; ... ... ... procedure TForm1.RegisterApp; begin ...; ...; end; |
Hi, ich habe deinen Code von 'thomasdrewermann' jetzt drinn. Nun kommen folgende Fehlermeldungen:
if CheckCode(StrToInt(serial), 25, 7)=true then [Fehler] Hauptmenue.pas(387): Inkompatible Typen: 'String' und 'Integer' if CheckCode(a,25, 7)= false then [Fehler] Hauptmenue.pas(400): Inkompatible Typen: 'String' und 'Integer' if CheckCode(strtoint(serial),25, 7)=true then [Fehler] Hauptmenue.pas(406): Inkompatible Typen: 'String' und 'Integer' Was muß ich da noch beachten? |
Da passen irgendwo die Datentypen nicht zusammen. Mehr kann ich im Moment auch nicht sagen.
|
Hallo m-werk,
ich habe die Procedure CheckCode zwar damals geschrieben, bin aber nicht mehr ganz sicher, wie der erste Parameter deklariert war. Ich glaube aber er ist ein String. Deshalb kannst du "serial" einfach pübergeben, ohne ihn in ein Integer umzuwandeln. Das gleiche gibt für a. In beiden Fällen kannst du StrToInt einfach weglassen. |
Hier noch mal ein konkreter Code:
Code:
procedure TForm1.FormCreate(Sender: TObject);
var OK: Boolean; reg:tregistry; a:integer; serial:string; 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 serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(serial,25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end; end; end else begin if CheckCode(inttostr(a),25, 7)= false then begin serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(serial,25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end else application.Terminate; end; end; end; end; end; |
@Thomas: Nur mal so eine Frage am Rande: Warum hörst du auf hinter finally deinen Code zu formatieren?
|
Ein formatierter Code für Luckie :wink: :
Code:
Ich weiss ja nocht wie gross dein Monitor ist auf meinen passt der Code manchmal garnicht in eine Zeile :D
procedure TForm1.FormCreate(Sender: TObject);
var OK: Boolean; reg:tregistry; a:integer; serial:string; 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 serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(serial,25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end; end; end else begin if CheckCode(inttostr(a),25, 7)= false then begin serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(serial,25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end else application.Terminate; end; end; end; end; end; MFG Thomas |
Laut Borland StyleGuide soll man mit zwei Leerzeichen einrücken. Und nicht mit Tabulatoren, hat die nämlich jemand anders eingestellt, ist die Codeformatierung wieder hinüber, was bei Leerzeichen logischerweise nicht passiert.
|
Also nochmal :D :
Code:
procedure TForm1.FormCreate(Sender: TObject);
var OK: Boolean; reg:tregistry; a:integer; serial:string; 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 serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(serial,25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end; end; end else begin if CheckCode(inttostr(a),25, 7)= false then begin serial:=inputbox('Seriennummer','Bitte geben sie ihre Seriennummer ein:','1234-1324-234'); if serial ='' then application.Terminate else begin if CheckCode(serial,25, 7)=true then begin reg:=tregistry.Create; reg.RootKey:=HKEY_CURRENT_USER; if reg.OpenKey('\Software\SELF',True) then begin reg.WriteString('CODE??',serial); reg.free; end; end else application.Terminate; end; end; end; end; end; |
|
Moin Zusammen,
nur wo ich gerade das Application.Terminate sehe: ![]() |
Hi m-werk,
funztz jetzt? :?: |
Hi, ich glaube jetzt funktioniert es so wie es soll.
Ich habe nur noch was umgebaut. if serial ='' then application.terminate else diese if serial habe ich beidemale ausgetauscht auf folgenden code: if CheckCode(serial,25, 7)= false then application.Terminate else Grund war folgender. Wenn ich in die Inputbox z.B. nur '1234' eingegeben habe, dann ist zwar nichts in der Registry gestanden, aber das Programm hat sich trotzdem geöffnet. Mit der Überprüfung, die ja immer sein soll, geht das jetzt nicht mehr. Ich teste jetzt noch ne weile, aber fürs erste sieht es jetzt gut aus. Sollte noch etwas nicht funktionieren betreffend der Inputbox, dann werde ich mich wieder melden. Ich sage allen die mir geholfen haben DANKE, DANKE, DANKE |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 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