Delphi-PRAXiS

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

MrSpock 14. Jun 2002 20:31

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:
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;
Es geht bestimmt auch einfacher, aber dieser Code basiert auf deinem Grundgerüst.

Du musst noch fCode als String, V versuch als Integer und gefunden als Boolean deklarieren.

Christian Seehase 14. Jun 2002 21:05

Moin Zusammen,

dann will ich noch mal :mrgreen:
Diesmal weniger stilisiert.

Eine Unit mit allgemeinen Funktionen:
Code:
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.
und die mit dem Registrierungsformular.

Code:
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.
Die Projektdatei dann so wie oben schon angegeben

@Mathias:
Zitat:

Zitat von Mathias
Du musst "RegOK" nur vor "CheckRegistry" in der Unit definieren, sonst findet letztere die erstere nicht.

Warum? Ich habe die beiden ja schon vor dem Implementation Abschnitt deklariert. Daher "weiss" der Compiler doch, was ihn erwartet ;-)

thomasdrewermann 14. Jun 2002 21:46

Ich hab die Überprüfung auch noch eingebaut:
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('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;
Ich hoffe es funtz :D

MFG
Thomas

MathiasSimmack 15. Jun 2002 07:53

Zitat:

Zitat von Christian Seehase
Warum? Ich habe die beiden ja schon vor dem Implementation Abschnitt deklariert. Daher "weiss" der Compiler doch, was ihn erwartet

In deiner neuen Variante ja. Da ich mich aber auf dein erstes Posting bezog und dort auch im interface-Teil "RegOk" nach "CheckRegistry" kommt, findet der Compiler die Funktion nicht.

Beweisstück A, Euer Ehren:
Code:
function CheckRegistry : Boolean;
function RegOK        : Boolean;

implementation
...
:D


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.

MathiasSimmack 15. Jun 2002 08:07

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.

m-werk 15. Jun 2002 08:22

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?

Luckie 15. Jun 2002 08:25

Na dann überprüf ihn doch vorher und wenn er nicht stimmt, dann rufst du die Prozedur zum Schreiben gar nicht erst auf.

m-werk 15. Jun 2002 08:31

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:
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;
Noch etwas ist mir aufgefallen:

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.

Luckie 15. Jun 2002 08:36

Pack mal alles, was du in Craete hast in eine eigene Prozedur (RegisterApp, oder so).
Und in OnCreate machst du dann so was:
Code:
  if CheckCode) = TRUE then
    RegisterApp(..);
  else
    Application.Terminate;
Die Überprüfung nimmst du dann natürlich aus der Schreiben-Prozedur raus.

thomasdrewermann 15. Jun 2002 08:46

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(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;
Ich hoffe es sind keine Bugs mehr drin :D

m-werk 15. Jun 2002 08:48

Hi, ich hab in die procedure von oncreate folgenden Code jetzt drinn:

Code:
procedure TKundendaten.FormCreate(Sender: TObject);
 begin
   if (not CheckCode(IntToStr(a), 25, 7)) then
    RegisterApp(..)
  else
    Application.Terminate;
end;
Weiters:

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

Luckie 15. Jun 2002 08:49

Na ja. Nicht sehr übersichtlich. Ich würde wie gesagt in OnCraete überprüfen und dann die In-die-Regsitry-schreib-Prozedur aufrufen.

Luckie 15. Jun 2002 08:51

Code:
private
{blablabla}
procedure RegisterAPP;

...
...
...

procedure TForm1.RegisterApp;
begin
  ...;
  ...;
end;

m-werk 15. Jun 2002 08:57

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?

Luckie 15. Jun 2002 09:01

Da passen irgendwo die Datentypen nicht zusammen. Mehr kann ich im Moment auch nicht sagen.

MrSpock 15. Jun 2002 09:28

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.

thomasdrewermann 15. Jun 2002 09:35

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;

Luckie 15. Jun 2002 09:50

@Thomas: Nur mal so eine Frage am Rande: Warum hörst du auf hinter finally deinen Code zu formatieren?

thomasdrewermann 15. Jun 2002 09:57

Ein formatierter Code für Luckie :wink: :

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;
Ich weiss ja nocht wie gross dein Monitor ist auf meinen passt der Code manchmal garnicht in eine Zeile :D

MFG
Thomas

Luckie 15. Jun 2002 10:05

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.

thomasdrewermann 15. Jun 2002 10:18

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;

Luckie 15. Jun 2002 10:31

@Thomas und alle die es interessiert:
http://www.delphipraxis.de/viewtopic.php?p=1101#1101

Christian Seehase 15. Jun 2002 13:55

Moin Zusammen,

nur wo ich gerade das Application.Terminate sehe:

Ablauf der Events beim Erzeugen/Schliessen eines Formulares

thomasdrewermann 17. Jun 2002 15:00

Hi m-werk,
funztz jetzt? :?:

m-werk 17. Jun 2002 20:04

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 18:40 Uhr.

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