AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Lazarus (IDE) Quellcode Überprüfung (For Schleifen Fehler)
Thema durchsuchen
Ansicht
Themen-Optionen

Quellcode Überprüfung (For Schleifen Fehler)

Ein Thema von atzornf · begonnen am 6. Dez 2015 · letzter Beitrag vom 6. Dez 2015
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

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

  Alt 6. Dez 2015, 17:37
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 (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort) nie was ändern wird.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie ( 6. Dez 2015 um 17:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 6. Dez 2015, 17:51
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
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
atzornf

Registriert seit: 6. Dez 2015
Ort: Völklingen
11 Beiträge
 
FreePascal / Lazarus
 
#3

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

  Alt 6. Dez 2015, 18:00
@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?
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 6. Dez 2015, 18:04
Zitat:
Genau das will ich!
...hast aber immer noch die Schleife drin...

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

Geändert von haentschman ( 6. Dez 2015 um 18:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 6. Dez 2015, 18:05
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
atzornf

Registriert seit: 6. Dez 2015
Ort: Völklingen
11 Beiträge
 
FreePascal / Lazarus
 
#6

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

  Alt 6. Dez 2015, 18:16
@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.
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.458 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 6. Dez 2015, 18:20
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.

Delphi Tags... ich nerve dich bis es klappt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 6. Dez 2015, 18:21
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?
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie ( 6. Dez 2015 um 18:23 Uhr)
  Mit Zitat antworten Zitat
atzornf

Registriert seit: 6. Dez 2015
Ort: Völklingen
11 Beiträge
 
FreePascal / Lazarus
 
#9

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

  Alt 6. Dez 2015, 18:32
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.
Fabian

Geändert von TBx ( 6. Dez 2015 um 18:33 Uhr) Grund: CODE-Tags sind nett, DELPHI-Tags sind netter ...
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

Machen wir doch ein kleines Einsteiger-Tutorial

  Alt 6. Dez 2015, 19:16
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 ...
Angehängte Grafiken
Dateityp: jpg PassWortTest.jpg (18,3 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 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