我现在正在做一个学校的项目,我正在做一个信用卡机,我需要 "输入按钮 "在点击时运行不同的代码。我需要'输入按钮'在点击时运行不同的代码。第一次点击必须从编辑ps中获取卡号... (一旦卡号被取回,我就会清除编辑),而第二次点击必须从同一个编辑中获取密码。我如何做到这一点?
procedure TfrmMainMenu.btbtnEnterClick(Sender: TObject);
var
sCvv,sPin:string;
begin
iCount2:=0;
sCardNumber:=lbledtCardInfo.Text;
if (Length(sCardNumber)<>16) AND (iCount2=0) then
begin
ShowMessage('Card number has to 16 digits,please try again!!');
end
else
begin
Inc(iCount2);
lbledtCardInfo.clear;
lbledtCardInfo.EditLabel.Caption:='Enter Pin' ;
btbtnEnter.Enabled:=false;
end; //if
if iCount2=2 then
begin
btbtnEnter.Enabled:=true;
sPin:=lbledtCardInfo.Text;
ShowMessage(sPin);//returns a blank
end;
你可以尝试在一个事件处理程序中完成所有的事情。有几种不同的方法来处理这个问题。然而,一个不同的解决方案是为每个任务使用单独的事件处理程序,然后每个任务可以为下一次点击分配一个新的处理程序来执行,例如。
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;
好多了!