Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Quellcode Überprüfung (For Schleifen Fehler) (https://www.delphipraxis.net/187523-quellcode-ueberpruefung-schleifen-fehler.html)

atzornf 6. Dez 2015 16:07

Quellcode Überprüfung (For Schleifen Fehler)
 
Hallo Leute,

habe ein Problem mit meinem Quellcode. Habe einen Fehler drin, den ich leider nicht erkenne.

Hier mein Quellcode:
Delphi-Quellcode:
procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);

var
benutzername : string;
passwort : string;
i : integer;
zaehler : integer;

begin

benutzername := 'root';
passwort := 'dHuz76Tr%4f1B';
i := 0;
zaehler := 1;

for i := 1 to 5 do begin

if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
   then begin
             s_benutzername.Clear;
             s_passwort.Clear;
             ausgabe_fehlermeldung.Caption := '';
             form_hauptmenue.Show;
             form_benutzerlogin.Visible := False
        end
        else begin
             s_benutzername.Clear;
             s_passwort.Clear;
             end;

        zaehler := zaehler + 1;
        ausgabe_fehlermeldung.Caption := Inttostr(zaehler);
end;
end;
Bei mir springt der Zähler aus irgend einem Grund direkt von 0 auf 6.

Wäre super, wenn Ihr mir helfen würdet.

haentschman 6. Dez 2015 16:16

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Hallo und willkommen hier...8-)

Bitte verpacke bitte den Delphi Code formatiert in Delphi Code Tags. Das ist der Button mit dem Helm...

Zum Thema:
Direkt auf 6 bedeutet
Delphi-Quellcode:
if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort) then
ist nicht True. Dadurch wird 5 mal s_benutzername leergemacht und der Zähler steht auf 6... logisch oder? :zwinker: Beim ersten Mal könntest du ja noch Glück haben das Benutzername und Paßwort paßt um in die erste Bedingung reinzukommen. Aber spätestens mit dem 1. Leeren wird die Bedingung nie wieder True sein können.

Erkläre mal den Ablauf den du vorhast... :P Das kann so vom logischen Ablauf nicht funktionieren. Wo für ist dieses Programm? Für externe Kunden? Dann solltest du dich mit "nicht einkompilieren" von Benutzernamen und Passwörtern beschäftigen.

Luckie 6. Dez 2015 16:45

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Wenn
Delphi-Quellcode:
(s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
false ist, müssten auch die Eingabefelder geleert werden. Trifft das zu?

Ansonsten, dass eine Schleife rückwärts läuft ist normal. Siehe dazu: http://michael-puff.de/Programmierun...ckwaerts.shtml

haentschman 6. Dez 2015 16:48

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Ansonsten, dass eine Schleife rückwärts läuft ist normal
Seine Zählvariable zaehler ist 6... :zwinker: I könnte maximal 5 haben...

Luckie 6. Dez 2015 16:50

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Muss nicht. Nach verlassen der Schleife ist der Wert der Zählvariablen unbestimmt. Stellt sich die Frage, wo er feststellt, dass die Zählvariable 6 ist.

Außerdem wollte ich mal wieder einen Link zu meiner Homepage unterbringen. :mrgreen:

haentschman 6. Dez 2015 16:55

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Außerdem wollte ich mal wieder einen Link zu meiner Homepage unterbringen.
Schön das wir drüber gesprochen haben...:mrgreen:
Zitat:

Nach verlassen der Schleife ist der Wert der Zählvariablen unbestimmt.
...richtig, aber dannn ist die aber bestimmt nicht immer exakt 6. :zwinker:

Luckie 6. Dez 2015 17:03

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Er kann nur exakt sein. Da es sich um einen Integer handelt. :P

Und wie so sollte er nicht (zufällig) 6 sein? Wenn der Ablauf im Code immer gleich ist, sind auch die Speicheradressen um Adressraum des Prozesses wohl gleich. Und wie oft hatten wir schon die Situation, dass es zufällig bisher immer funktioniert hat, aber eben nur zufällig. Eine kleine Änderung und der Code, der zufällig funktioniert hat, funktioniert nicht mehr.

atzornf 6. Dez 2015 17:13

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Habe meinen Quellcode mal überarbeitet:

Delphi-Quellcode:
procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);

var
benutzername : string;
passwort : string;
i : integer;
zaehler : integer;

begin

benutzername := 'root';
passwort := 'dHuz76Tr%4f1B';

for i := 1 to 3 do begin

if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
   then begin
        s_benutzername.Clear;
        s_passwort.Clear;
        form_hauptmenue.Show;
        end
        else begin
             s_benutzername.Clear;
             s_passwort.Clear;
             ausgabe_fehlermeldung.Caption := 'Falsche Eingabe';
             zaehler := i + 1;
             end;
if zaehler >= 6
   then begin
        form_benutzerlogin.Close;
        end;
end;
end;
Ich würde gerne eine Benutzerabfrage schreiben, welche die vorgegebenen Variablen benutzername/passwort überprüft.
Sofern die Eingabe des Benutzers korrekt ist, soll sich ein weiteres Fenster öffnen.
Sofern die Benutzereingabe falsch ist, sollen sich die Eingabefelder leeren und eine Labelbeschriftung mit Falscher Eingabe erzeugen.--> das ganze soll 3 mal von statten gehen, ansonsten soll sich die Anwendung schließen.

haentschman 6. Dez 2015 17:16

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
@atzornf: Die Delphi Tags üben wir noch... :zwinker:
Zitat:

Sofern die Benutzereingabe falsch ist, sollen sich die Eingabefelder leeren und eine Labelbeschriftung mit Falscher Eingabe erzeugen.--> das ganze soll 3 mal von statten gehen
Dann mußt du dem Benutzer auch die Möglichkeit geben das er 3 x auf den Button klicken kann. Merkst du was? Es macht keinen Sinn innerhalb der Klick procedure die Schleife laufen zu lassen. Die Fehlversuche mußt du dir außerhalb der procedure z.B. als privates Feld merken. Innerhalb der Klick procedure prüfst du ob die Anzahl der Fehlversuche kleiner als dein MAX ist und prüfst die Kombination. Ansonsten wird das Fenster geschlossen wie auch bei erfolgreicher Prüfung.

atzornf 6. Dez 2015 17:23

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
@haentschman

Programmiere heute zum ersten mal mit Delphi.
Wäre super, wenn du mir helfen würdest.

Wäre auch mal interessant zu wissen, was ich falsch gemacht habe.

Luckie 6. Dez 2015 17:26

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Delphi-Quellcode:
for i := 1 to 3 do
begin
  if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort) then
  begin
    s_benutzername.Clear;
    s_passwort.Clear;
    form_hauptmenue.Show;
  end
  else
  begin
    s_benutzername.Clear;
    s_passwort.Clear;
    ausgabe_fehlermeldung.Caption := 'Falsche Eingabe';
    zaehler := i + 1;
  end;
  if zaehler >= 6 then
  begin
    form_benutzerlogin.Close;
  end;
end;
Ich habe es mal sauber formatiert. Vielleicht siehst du dann deinen Fehler.

Davon mal abgesehen. Lokale Variablen werden nicht initialisiert. zaehler enthält also einen zufälligen Wert. Und was soll das
Delphi-Quellcode:
zaehler := i + 1;
?

atzornf 6. Dez 2015 17:30

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
@Luckie

Stehe gerade auf dem Schlauch!

zaehler = i + 1;
Damit meine ich, dass die zaehler Variable den Wert von i anholen soll und i bei jedem durchlauf um 1 erhöht wird.

haentschman 6. Dez 2015 17:32

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Upps...:P
Zitat:

Programmiere heute zum ersten mal mit Delphi.
...dann hilft hier eher mal ein Blatt Papier wo du dir in normalen Worten einen Plan erstellst was wann in welcher Reihenfolge passieren soll (Ablaufdiagramm siehe Anhang) Der Code ist erstmal zweitrangig.

Ein Projekt zum üben ist mit Sicherheit nicht falsch. Man sollte aber, bevor man sich an so etwas wagt, ein paar Tutorials durchgeackert haben. Dieses z.B. http://www.stelzmann-development.de/.../crashkurs.htm
Da Objektpascal ereignisorientiert funktioniert wirst du nach dem Tutorial deinen Code auch verstehen warum das nicht funktioniert. :thumb:

Luckie 6. Dez 2015 17:37

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Du weist zaehler den aktuellen Wert der Zählvariablen zu um eins erhöht. Aber warum? Was soll die Variable denn Zähen?

Druck dir den Code mal aus und gehe ihn mal mit einem Bleistift in der Hand durch.

Schleife beginnt
i = 1
if Abfrage ist false
Eingabefelder werden gelöscht
Sprung zum Anfang der Schleife
i = 2
if Abfrage ist false (logisch, kann sich ja nichts geändert haben)
Eingabefelder werden gelöscht
Sprung zum Anfang der Schleife
i = 3
if Abfrage ist immer noch false
Eingabefelder werden gelöscht
Sprung zum Anfang der Schleife
Schleife wird verlassen

Du siehst, die Schleife ist irgendwie überflüssig, da sich an
Delphi-Quellcode:
(s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
nie was ändern wird.

Luckie 6. Dez 2015 17:51

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Ich glaube du willst das:
Code:
globale Variable AttemptCount

Button_Click:
Wenn AttemptCount < X
begin
  Wenn Benutzername und Passwort richtig
    mach was
  else
    mach was anders
    erhöhe AttemotCount
  end
end
else
  Nachricht: X Versuche verbraucht
end

atzornf 6. Dez 2015 18:00

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
@Luckie

Genau das will ich!

procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);

var
benutzername : string;
passwort : string;
i : integer;

begin

benutzername := 'root';
passwort := 'dHuz76Tr%4f1B';

for i := 1 to 3 do begin

if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
then begin
form_hauptmenue.Show;
end
else begin
ausgabe_fehlermeldung.Caption := 'Falsche Eingabe';
s_benutzername.Clear;
s_passwort.Clear;
end;
end;
if i >= 3
then begin
form_benutzerlogin.Close;
end;
end;

Ich habe mal meinen Quellcode ein wenig abgeändert.
Weshalb muss ich den das ButtonClick: verwenden?

haentschman 6. Dez 2015 18:04

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Genau das will ich!
...hast aber immer noch die Schleife drin... :zwinker:

ButtonClick ist deine
Delphi-Quellcode:
procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);
Mit den Delphi Tags nerv ich dich heute noch... :thumb:

Luckie 6. Dez 2015 18:05

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Benutz bitte die Delphi-Tags!

Mein Button_Click ist nur eine Pseudo-Bezeichnung. für irgendeine ButtonClick Routine.

Noch mal. Du hast nicht verstanden, warum deine Schleife überflüssig und nutzlos ist. Ich habe dir doch genau beschrieben, was deine Schleife macht, nämlich im Prinzip nichts, weil sich die Eingabe ja nicht ändert. Und wenn sie bei ersten Durchlauf falsch ist, wird es die Eingabe auch beim millionsten Durchlauf sein.

Und du hast meinen Pseudo-Code nicht umgesetzt. Das Denken habe ich dir schon abgenommen. Du musst es nur noch in Delphi formulieren.

atzornf 6. Dez 2015 18:16

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
@Luckie

procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);

var
benutzername : string;
passwort : string;
login_counter : integer;

begin

benutzername := 'root';
passwort := 'dHuz76Tr%4f1B';
login_counter := 0;

if login_counter < 3 then begin
if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
then begin
form_hauptmenue.Show;
end
else begin
ausgabe_fehlermeldung.Caption := 'Falsche Eingabe';
s_benutzername.Clear;
s_passwort.Clear;
login_counter := login_counter + 1;
end;
end;

end;

Habe dies mal nach deiner Vorgabe gestaltet.
Scheint aber noch nicht zu funktionieren.

haentschman 6. Dez 2015 18:20

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Scheint aber noch nicht zu funktionieren.
Jupp... mit jedem Button Klick setzt du den login_counter wieder auf 0. Diesen Wert mußt du dir "global" merken.

:evil: Delphi Tags... ich nerve dich bis es klappt.

Luckie 6. Dez 2015 18:21

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Noch mal. Benutz bitte endlich die Delphi Codetags. Das ist der Helm oben bei den Schaltflächen!

Zitat:

Scheint aber noch nicht zu funktionieren.
OK. Gut. Du kannst dir vorstellen, was wir jetzt gerne wissen würden, um dir zu helfen?

Delphi-Quellcode:
login_counter := 0;

if login_counter < 3 then begin
Wird die if Abfrage jemals false werden?

atzornf 6. Dez 2015 18:32

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Habe die Variable login_counter nun im public Bereich global definiert...
Funktioniert aber immer noch nicht!

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2;

type

  { Tform_benutzerlogin }

  Tform_benutzerlogin = class(TForm)
    anmelden_knopf: TButton;
    beenden_knopf: TButton;
    ausgabe_fehlermeldung: TLabel;
    s_benutzername: TEdit;
    s_passwort: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure anmelden_knopfClick(Sender: TObject);
    procedure beenden_knopfClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    login_counter : integer;
  end;

var
  form_benutzerlogin: Tform_benutzerlogin;

implementation

{$R *.lfm}

{ Tform_benutzerlogin }

procedure Tform_benutzerlogin.FormShow(Sender: TObject);
begin

form_benutzerlogin.Caption := 'Scylla V.1.0 - Login';
s_benutzername.Caption := '';
s_passwort.Caption := '';
ausgabe_fehlermeldung.Caption := '';
anmelden_knopf.Caption := 'Anmelden';
beenden_knopf.Caption := 'Beenden';

end;

procedure Tform_benutzerlogin.beenden_knopfClick(Sender: TObject);
begin

close;

end;

procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);

var
benutzername : string;
passwort : string;

begin

benutzername := 'root';
passwort := 'dHuz76Tr%4f1B';

if login_counter < 3 then begin
        if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
           then begin
                form_hauptmenue.Show;
                end
                 else begin
                      ausgabe_fehlermeldung.Caption := 'Falsche Eingabe';
                      s_benutzername.Clear;
                      s_passwort.Clear;
                      login_counter := login_counter + 1;
                      end;
        end;

end;
end.

Luckie 6. Dez 2015 18:34

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Funktioniert aber immer noch nicht!
Wir sind keine Hellseher und sitzen nicht neben dir am Computer. WAS funktioniert nicht? Was soll passieren und was passiert?

haentschman 6. Dez 2015 18:40

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Funktioniert aber immer noch nicht!
...was passiert deiner Meinung nach falsch?

Bitte Delphi Tags nicht Code Tags. Der Button mit dem Helm... wir lernen das noch... :roll:

ähhhmmmm....
Delphi-Quellcode:
s_benutzername: TEdit;
Delphi-Quellcode:
s_benutzername.Caption = benutzername
...du mußt schon .Text auswerten sonst vergleichst du die Caption. Obwohl... im Delphi hat TEdit kein Caption. Im Lazarus? :gruebel:

auch im Lazarus gibt es kein Caption: http://lazarus-ccr.sourceforge.net/d...rls/tedit.html...compiliert das?

TBx 6. Dez 2015 18:42

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Zitat von Luckie (Beitrag 1323578)
Wir sind keine Hellseher

Die einzigen Dinge, die ich Dir definitiv sagen kann, sind:
1. Du initialisierst den Counter immer noch nicht
2. Du vergleichst Username und Password nicht mit den Usereingaben, da müßtest Du mit der Property Text und nicht mit Caption vergleichen.

atzornf 6. Dez 2015 18:45

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2;

type

  { Tform_benutzerlogin }

  Tform_benutzerlogin = class(TForm)
    anmelden_knopf: TButton;
    beenden_knopf: TButton;
    ausgabe_fehlermeldung: TLabel;
    s_benutzername: TEdit;
    s_passwort: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure anmelden_knopfClick(Sender: TObject);
    procedure beenden_knopfClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private declarations }
  public
    login_counter : integer;
  end;

var
  form_benutzerlogin: Tform_benutzerlogin;

implementation

{$R *.lfm}

{ Tform_benutzerlogin }

procedure Tform_benutzerlogin.FormShow(Sender: TObject);
begin

form_benutzerlogin.Caption := 'Scylla V.1.0 - Login';
s_benutzername.Caption := '';
s_passwort.Caption := '';
ausgabe_fehlermeldung.Caption := '';
anmelden_knopf.Caption := 'Anmelden';
beenden_knopf.Caption := 'Beenden';

end;

procedure Tform_benutzerlogin.beenden_knopfClick(Sender: TObject);
begin

close;

end;

procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);

var
benutzername : string;
passwort : string;

begin

benutzername := 'root';
passwort := 'dHuz76Tr%4f1B';

if login_counter < 3
   then begin
        if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
           then begin
                form_hauptmenue.Show;
                end
                 else begin
                      ausgabe_fehlermeldung.Caption := 'Falsche Eingabe';
                      s_benutzername.Clear;
                      s_passwort.Clear;
                      login_counter := login_counter + 1;
                      end;
        end;

if login_counter >= 3
   then begin
        form_benutzerlogin.Close;
        end;

end;
end.
Vielen Dank für eure Hilfe!
Benutzerkontrolle funktioniert!

Eventuell könnt Ihr mir noch bei einem Thema helfen:

Ich habe zwei Formulare. Sofern ein Benutzer auf der zweiten Form auf Beenden drückt soll sich auch ebenfalls Form1 schließen.

Mein Quellcode:
Delphi-Quellcode:
procedure Tform_hauptmenue.beenden_knopfClick(Sender: TObject);
begin

close;
form_benutzerlogin.Close;

end;
Fehlercode im Anhang!

TBx 6. Dez 2015 18:47

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Neues Thema --> neuer Thread!

Luckie 6. Dez 2015 18:49

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Zitat:

Zitat von TBx (Beitrag 1323581)
1. Du initialisierst den Counter immer noch nicht

Integer Felder werden doch mit null initialisiert oder?
Zitat:

2. Du vergleichst Username und Password nicht mit den Usereingaben, da müßtest Du mit der Property Text und nicht mit Caption vergleichen.
Da hat meine Glaskugel kurz gewackelt, aber sie ist mit Lazarus/FreePascal nicht so firm. :mrgreen:

atzornf 6. Dez 2015 18:52

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
@Luckie

Programm funktioniert wie es soll!
Mache einen neuen Thread auf...

haentschman 6. Dez 2015 18:54

AW: Quellcode Überprüfung (For Schleifen Fehler)
 
Mich wundert das das mit .Caption compiliert. Auch bei Lazarus hat lt. Doku TEdit diese Property nicht... magic Compiler der das umbiegt? :thumb:

Perlsau 6. Dez 2015 19:16

Machen wir doch ein kleines Einsteiger-Tutorial
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du hast ein Programm, das Zugangsdaten erfordert: Benutzername und Passwort. Gehen wir mal davon aus, die sind im Programm als globale Konstanten gespeichert, und zwar im Code für das Formular FormPass, auf dem sich zwei Editfelder und zwei Labels befinden. Einen Button brauchst du nicht, denn du kannst im Editfeld ja einfach Enter drücken und diese Taste dort abfragen. Nun möchtest du erreichen, daß der Anwender drei Versuche hat, um die richtige Name-Passwort-Kombination einzugeben. Nach dem fehlgeschlagenen dritten Versuch soll das Programm mit dem Hinweis, daß Anzahl der Versuche erreicht wurde, beendet werden. All das wird in der unitpass angehandelt. An die Mainform geht dann nur noch die Information, ob der Versuch erfolgreich war. Dazu wird in der Mainform die FormPass modal aufgerufen, was erstens zur Folge hat, daß alle anderen Formulare gesperrt sind, während sie angezeigt wird, und zweitens einen Rückgabewert erlaubt, der die Mainform dann darüber informiert, ob die Eingabe zulässig war.

Beim Start der Passwort-Form werden erst einmal die beiden Editfelder geleert und die Variable, die die Versuche zählen soll, mit dem Wert 0 initialisiert. Dann wartet das Programm auf Benutzereingaben, konkret auf die Betätigung der Enter-Taste. Erst wenn die Enter-Taste gedrückt wurde, geht es an die Auswertung.

In der Auswerten-Methode wird erst einmal geprüft, ob der Text in den Edit-Feldern den gespeicherten Zugangsdaten entspricht. Ist das der Fall, wird das Fenster mit dem Rückgabe-Wert mrOK geschlossen. Dazu muß man wissen, daß bei modal aufgerufenen Fenstern jede Änderung der Variable ModalResult das Fenster schließt. Diese Variable steht beim Start eines modalen Fensters auf mrNone.

Ist die Eingabe falsch, springt das Programm in den darunterstehenden Begin-End-Block: Die Variable Versuche wird um 1 erhöht und gleich darauf abgefragt, ob sie bereits den Wert 3 erreicht hat. Ist das der Fall, wird das Passwort-Fenster mit dem Modalresult mrCancel geschlossen, andernfalls wird eine Meldung ausgegeben, daß dies der soundsovielte Fehlversuch war, die Editfelder geleert und wieder auf Enter gewartet.

Delphi-Quellcode:
// ***** Hauptformular *****
unit unitmain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TFormMain }

  TFormMain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);

  private { private declarations }
    Var
      StartModus : Boolean;

  public { public declarations }

  end;

var
  FormMain: TFormMain;

implementation
{$R *.lfm}

uses
  unitpass;

{ TFormMain }

procedure TFormMain.FormCreate(Sender: TObject);
begin
  StartModus := True;
end;

procedure TFormMain.FormShow(Sender: TObject);
Var
  w : Integer;
begin
  If StartModus Then // Startmodus ist nur beim Programmstart True; OnShow wird aber auch beim Wiederanzeigen ausgelöst, z.B. wenn die App minimiert war
  begin
    FormPass.Left := 500;
    FormPass.Top := 300;
    w := FormPass.ShowModal;
    If w <> mrOK then
    begin
      ShowMessage('Ihre Anmeldung war inkorrekt ... Programm wird beendet!');
      Close;
    end;
  end;
  StartModus := False;
end;

end.

// ***** Formular für Passworteingabe *****
unit unitpass;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TFormPass }

  TFormPass = class(TForm)
    Edit_Pass: TEdit;
    Edit_Name: TEdit;
    Label_Name: TLabel;
    Label_Pass: TLabel;

    procedure FormShow(Sender: TObject);
    procedure Edit_NameKeyPress(Sender: TObject; var Key: char);

  private { private declarations }
  Const
    BName = 'Name';
    BPass = 'Pass';
  Var
    Versuche : Integer;

  Procedure EditsLeeren;
  Procedure Auswerten;

  public { public declarations }
  end;

var
  FormPass: TFormPass;

implementation
{$R *.lfm}
{ TFormPass }

procedure TFormPass.EditsLeeren;
begin
  Edit_Name.Clear;
  Edit_Pass.Clear;
end;

procedure TFormPass.Auswerten;
begin
  If (Edit_Name.Text = BName) and
     (Edit_Pass.Text = BPass) then
  ModalResult := mrOK        else

  begin
    Inc(Versuche);
    If Versuche = 3 Then
       ModalResult := mrCancel Else
       begin
         ShowMessage(IntToStr(Versuche) + '. Versuch fehlgeschlagen!');
         EditsLeeren
       end;
  end;
end;

procedure TFormPass.FormShow(Sender: TObject);
begin
  Versuche := 0;
  EditsLeeren;
end;

procedure TFormPass.Edit_NameKeyPress(Sender: TObject; var Key: char);
begin
  If Key = #13 Then
  begin
    Key := #0;
    Auswerten;
  end;
end;

end.
P.S.: Bis ich fertig bin, ist schon wieder alles erledigt. Das hat man nun davon, wenn man sich die Zeit nimmt ... :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:14 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