如何使同一按钮每次单击都运行不同的代码?

我目前正在做一个学校项目,正在制作信用卡机。我需要“输入按钮” 单击时运行不同的代码。第一次单击必须从编辑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;
iCMS 回答:如何使同一按钮每次单击都运行不同的代码?

您可以尝试在单个事件处理程序中完成所有操作。有几种不同的处理方法。但是,另一种解决方案是为每个任务使用单独的事件处理程序,然后每个任务可以为下一次单击执行分配新的处理程序,例如:

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

请尝试以下操作。

在表单类中添加两个字符串字段FCardNumberFPin

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;分别命名为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;

您可能会注意到无法使用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

大家都在问