如何使同一个按钮 运行 每次被点击时代码不同?

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

改为尝试以下方法。

在表单中添加两个字符串字段 FCardNumberFPin 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;分别将它们命名为 eInputbtnNext。设标签编辑的标题为 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;