![]() |
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:
Bei mir springt der Zähler aus irgend einem Grund direkt von 0 auf 6.
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; Wäre super, wenn Ihr mir helfen würdet. |
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:
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.
if (s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort) then
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Wenn
Delphi-Quellcode:
false ist, müssten auch die Eingabefelder geleert werden. Trifft das zu?
(s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
Ansonsten, dass eine Schleife rückwärts läuft ist normal. Siehe dazu: ![]() |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
|
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: |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
Zitat:
|
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Habe meinen Quellcode mal überarbeitet:
Delphi-Quellcode:
Ich würde gerne eine Benutzerabfrage schreiben, welche die vorgegebenen Variablen benutzername/passwort überprüft.
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; 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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
@atzornf: Die Delphi Tags üben wir noch... :zwinker:
Zitat:
|
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Delphi-Quellcode:
Ich habe es mal sauber formatiert. Vielleicht siehst du dann deinen Fehler.
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; 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;
|
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Liste der Anhänge anzeigen (Anzahl: 1)
Upps...:P
Zitat:
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. ![]() Da Objektpascal ereignisorientiert funktioniert wirst du nach dem Tutorial deinen Code auch verstehen warum das nicht funktioniert. :thumb: |
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:
nie was ändern wird.
(s_benutzername.Caption = benutzername) and (s_passwort.Caption = passwort)
|
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 |
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? |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
ButtonClick ist deine
Delphi-Quellcode:
Mit den Delphi Tags nerv ich dich heute noch... :thumb:
procedure Tform_benutzerlogin.anmelden_knopfClick(Sender: TObject);
|
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. |
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
:evil: Delphi Tags... ich nerve dich bis es klappt. |
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:
Delphi-Quellcode:
Wird die if Abfrage jemals false werden?
login_counter := 0;
if login_counter < 3 then begin |
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
|
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
Bitte Delphi Tags nicht Code Tags. Der Button mit dem Helm... wir lernen das noch... :roll: ähhhmmmm....
Delphi-Quellcode:
s_benutzername: TEdit;
Delphi-Quellcode:
...du mußt schon .Text auswerten sonst vergleichst du die Caption. Obwohl... im Delphi hat TEdit kein Caption. Im Lazarus? :gruebel:
s_benutzername.Caption = benutzername
auch im Lazarus gibt es kein Caption: ![]() |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
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. |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Vielen Dank für eure Hilfe!
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. 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:
Fehlercode im Anhang!
procedure Tform_hauptmenue.beenden_knopfClick(Sender: TObject);
begin close; form_benutzerlogin.Close; end; |
AW: Quellcode Überprüfung (For Schleifen Fehler)
Neues Thema --> neuer Thread!
|
AW: Quellcode Überprüfung (For Schleifen Fehler)
Zitat:
Zitat:
|
AW: Quellcode Überprüfung (For Schleifen Fehler)
@Luckie
Programm funktioniert wie es soll! Mache einen neuen Thread auf... |
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:
|
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:
P.S.: Bis ich fertig bin, ist schon wieder alles erledigt. Das hat man nun davon, wenn man sich die Zeit nimmt ... :lol:
// ***** 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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