如何让同一个按钮每次点击都运行不同的代码?

问题描述 投票:0回答:1

我现在正在做一个学校的项目,我正在做一个信用卡机,我需要 "输入按钮 "在点击时运行不同的代码。我需要'输入按钮'在点击时运行不同的代码。第一次点击必须从编辑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;
delphi delphi-2010
1个回答
2
投票

你可以尝试在一个事件处理程序中完成所有的事情。有几种不同的方法来处理这个问题。然而,一个不同的解决方案是为每个任务使用单独的事件处理程序,然后每个任务可以为下一次点击分配一个新的处理程序来执行,例如。

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;

1
投票

注意,你测试 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;

好多了!

© www.soinside.com 2019 - 2024. All rights reserved.