Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit Regedit und Form öffnen!! (https://www.delphipraxis.net/152-probleme-mit-regedit-und-form-oeffnen.html)

m-werk 14. Jun 2002 18:36


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:
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;
Könnt Ihr mir da behilflich sein???

RomanK 14. Jun 2002 18:45

Lade doch erst dein Hauptform und frage dann ab !!

thomasdrewermann 14. Jun 2002 18:59

Also bei mir klappts mit dem Code :D

Code:
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;
Wenn noch kein Wert exsistiert dann öffnet sich eine Inputbox sonst eine Messagebox mit dem vorher eingegebenen Wert.

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

Christian Seehase 14. Jun 2002 19:06

Moin m-werk,

ich würd's so machen:

In der Projektdatei prüfen, ob das Programm gestartet werden darf:

Code:
begin
  Application.Initialize;
  if CheckRegistry then
  begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.
wobei dann, in einer Unit, noch folgendes steht:
Code:
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;
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.
Ach ja, das TRegForm darf natürlich nicht in der Projektdatei erzeugt werden.

m-werk 14. Jun 2002 19:48

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:
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;
Kann man das irgendwie anstellen?

RomanK 14. Jun 2002 20:09

Die Funktion Inputbox liefert als result einen String, du kanns also:

Code:
If inputbox = 'was solls sein??' then

m-werk 14. Jun 2002 20:14

Hi, kann ich das so machen:

if inputbox = CheckCode(IntToStr(a),25, 7) then
Application.ShowMainForm := True;

MathiasSimmack 14. Jun 2002 20:17

Zitat:

Zitat von m-werk
(...)

Hi m-werk.
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.

MathiasSimmack 14. Jun 2002 20:18

Zitat:

Zitat von m-werk
Hi, kann ich das so machen:

if inputbox = CheckCode(IntToStr(a),25, 7) then
Application.ShowMainForm := True;

Bestimmt nicht, weil der Rückgabewert von "CheckCode" doch wohl ein Bool ist (MrSpock?). Inputbox liefert aber einen String zurück, was FR ja erwähnt hat.

RomanK 14. Jun 2002 20:19

Fast halt noch die parameter!!

Code:
a:=strtoint(inputbox('Programm freischalten','Code',''));
if CheckCode(IntToStr(a),25, 7)) then
Allerdings wird mit jedem Inputbox der dialog aufgerufen,also würde ich den wert in nen String/integer zwischenspeichern.

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 02:37 Uhr.
Seite 1 von 4  1 23     Letzte »    

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