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 ...