![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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