您可以尝试在单个事件处理程序中完成所有操作。有几种不同的处理方法。但是,另一种解决方案是为每个任务使用单独的事件处理程序,然后每个任务可以为下一次单击执行分配新的处理程序,例如:
procedure TfrmMainMenu.FormCreate(Sender: TObject);
begin
// you can set this at design-time if desired...
btbtnEnter.OnClick := GetCCNumber;
end;
procedure TfrmMainMenu.GetCCNumber(Sender: TObject);
begin
sCardNumber := lbledtCardInfo.Text;
if Length(sCardNumber) <> 16 then
begin
ShowMessage('Card number has to 16 digits,please try again!!');
Exit;
end;
lbledtCardInfo.Clear;
lbledtCardInfo.EditLabel.Caption := 'Enter Pin' ;
btbtnEnter.OnClick := GetCCPin;
end;
procedure TfrmMainMenu.GetCCPin(Sender: TObject);
var
sPin: string;
begin
sPin := lbledtCardInfo.Text;
if Length(sPin) <> 4 then
begin
ShowMessage('Card Pin has to 4 digits,please try again!!');
Exit;
end;
ShowMessage(sPin);
...
lbledtCardInfo.Clear;
lbledtCardInfo.EditLabel.Caption := 'Enter Number' ;
btbtnEnter.OnClick := GetCCNumber;
end;
此方法的一种变化是在UI中创建多个相互重叠的按钮,然后您可以根据需要来回切换它们的Visible
属性,例如:
procedure TfrmMainMenu.FormCreate(Sender: TObject);
begin
// you can set this at design-time if desired...
btbtnCCPinEnter.Visible := False;
btbtnCCNumEnter.Visible := True;
end;
procedure TfrmMainMenu.btbtnCCNumEnterClick(Sender: TObject);
begin
sCardNumber := lbledtCardInfo.Text;
if Length(sCardNumber) <> 16 then
begin
ShowMessage('Card number has to 16 digits,please try again!!');
Exit;
end;
lbledtCardInfo.Clear;
lbledtCardInfo.EditLabel.Caption := 'Enter Pin' ;
btbtnCCNumEnter.Visible := False;
btbtnCCPinEnter.Visible := True;
end;
procedure TfrmMainMenu.btbtnCCPinEnterClick(Sender: TObject);
var
sPin: string;
begin
sPin := lbledtCardInfo.Text;
if Length(sPin) <> 4 then
begin
ShowMessage('Card Pin has to 4 digits,please try again!!');
Exit;
end;
ShowMessage(sPin);
...
lbledtCardInfo.Clear;
lbledtCardInfo.EditLabel.Caption := 'Enter Number' ;
btbtnCCPinEnter.Visible := False;
btbtnCCNumEnter.Visible := True;
end;
,
请注意,您在设置iCount2 = 0
之后立即测试iCount2 := 0
。因此,该测试将始终为True
。此外,以后的测试iCount2 = 2
将始终为False
,因为该值从0开始并且您之间只有一个Inc
。
请尝试以下操作。
在表单类中添加两个字符串字段FCardNumber
和FPin
:
private
FCardNumber: string;
FPin: string;
还要创建一个枚举类型TEntryStage = (esCardNumber,esPin)
并添加此类型的字段。这将使您的代码如下所示:
private
type
TEntryStage = (esCardNumber,esPin);
var
FCardNumber: string;
FPin: string;
FEntryStage: TEntryStage;
在Delphi中,类字段(类成员变量)总是被初始化,因此,FEntryStage
将是esCardNumber
(= {TEntryStage(0)
)的新创建形式。
添加一个TLabeledEdit
(我看您使用它们)和一个TButton
;分别命名为eInput
和btnNext
。让标记的编辑的标题为Card number:
,按钮的标题为Next
。
现在将以下OnClick
处理程序添加到按钮:
procedure TForm1.btnNextClick(Sender: TObject);
begin
case FEntryStage of
esCardNumber:
begin
// Save card number
FCardNumber := eInput.Text;
// Prepare for the next stage
eInput.Clear;
eInput.EditLabel.Caption := 'Pin:';
FEntryStage := esPin;
end;
esPin:
begin
// Save pin
FPin := eInput.Text;
// Just do something with the data
ShowMessageFmt('Card number: %s'#13#10'Pin: %s',[FCardNumber,FPin]);
end;
end;
end;
您可能会注意到无法使用Next
触发Enter
按钮,这很烦人。要解决此问题,请
procedure TForm1.eInputEnter(Sender: TObject);
begin
btnNext.Default := True;
end;
procedure TForm1.eInputExit(Sender: TObject);
begin
btnNext.Default := False;
end;
好多了!
本文链接:https://www.f2er.com/2203540.html