如何使同一个按钮 运行 每次被点击时代码不同?
How to make the same button run different code everytime it is clicked?
我目前正在做一个学校项目,我正在制作一台信用卡机。我需要 'Enter Button' 来
运行 单击时的不同代码。第一次点击必须从编辑中获取卡号 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;
请注意,您在设置 iCount2 := 0
后立即测试 iCount2 = 0
。因此,该测试将始终为 True
。此外,后面的测试 iCount2 = 2
将始终是 False
,因为值从 0 开始,中间只有一个 Inc
。
改为尝试以下方法。
在表单中添加两个字符串字段 FCardNumber
和 FPin
class:
private
FCardNumber: string;
FPin: string;
同样创建一个枚举类型TEntryStage = (esCardNumber, esPin)
并添加一个该类型的字段。这将使您的代码看起来像这样:
private
type
TEntryStage = (esCardNumber, esPin);
var
FCardNumber: string;
FPin: string;
FEntryStage: TEntryStage;
在Delphi中,class字段(class成员变量)总是被初始化,所以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;
您可能会注意到无法使用 Enter
触发 Next
按钮,这很烦人。要解决此问题,请执行
procedure TForm1.eInputEnter(Sender: TObject);
begin
btnNext.Default := True;
end;
procedure TForm1.eInputExit(Sender: TObject);
begin
btnNext.Default := False;
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;
我目前正在做一个学校项目,我正在制作一台信用卡机。我需要 'Enter Button' 来 运行 单击时的不同代码。第一次点击必须从编辑中获取卡号 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;
请注意,您在设置 iCount2 := 0
后立即测试 iCount2 = 0
。因此,该测试将始终为 True
。此外,后面的测试 iCount2 = 2
将始终是 False
,因为值从 0 开始,中间只有一个 Inc
。
改为尝试以下方法。
在表单中添加两个字符串字段 FCardNumber
和 FPin
class:
private
FCardNumber: string;
FPin: string;
同样创建一个枚举类型TEntryStage = (esCardNumber, esPin)
并添加一个该类型的字段。这将使您的代码看起来像这样:
private
type
TEntryStage = (esCardNumber, esPin);
var
FCardNumber: string;
FPin: string;
FEntryStage: TEntryStage;
在Delphi中,class字段(class成员变量)总是被初始化,所以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;
您可能会注意到无法使用 Enter
触发 Next
按钮,这很烦人。要解决此问题,请执行
procedure TForm1.eInputEnter(Sender: TObject);
begin
btnNext.Default := True;
end;
procedure TForm1.eInputExit(Sender: TObject);
begin
btnNext.Default := False;
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;