Delphi 一个按钮两个程序

Delphi 一个按钮两个程序,delphi,Delphi,我想知道一个按钮是否可以有两个功能。 例如,我有一个stringgrid,其中有订单,使用按钮我想汇总所有订单,使用同一个按钮我想返回到订单未汇总时的前一个状态 if Sender = reduceOrderBTN then begin J:=1; reduceOrderBTN.Caption:= 'Show all'; qryReduceOrders.Close; qryReduceOrders.Open; end; advOrderGrid.RowCount:= qryReduceOrd

我想知道一个按钮是否可以有两个功能。 例如,我有一个stringgrid,其中有订单,使用按钮我想汇总所有订单,使用同一个按钮我想返回到订单未汇总时的前一个状态

if Sender = reduceOrderBTN then
begin
J:=1;
reduceOrderBTN.Caption:= 'Show all';
qryReduceOrders.Close;
qryReduceOrders.Open;
 end;

advOrderGrid.RowCount:= qryReduceOrders.RecordCount + 1;

while NOT qryReduceOrders.Eof do
begin

advOrderGrid.Cells[0, qryReduceOrders.RecNo] := IntToStr(qryReduceOrders.RecNo);
advOrderGrid.Cells[1, qryReduceOrders.RecNo] := qryReduceOrdersProductName.AsString;
advOrderGrid.Cells[2, qryReduceOrders.RecNo] := qryReduceOrdersSpecialWish.AsString;
advOrderGrid.Cells[3, qryReduceOrders.RecNo] := qryReduceOrdersQuantity.AsString;
advOrderGrid.Cells[4, qryReduceOrders.RecNo] := qryReduceOrdersprepTime.AsString;
 advOrderGrid.Repaint;
 qryReduceOrders.next;

end;
if (Sender = reduceOrderBTN) and (J = 1) then
 formShow(nil);
//trying to get back to old state but this doesnt work
end;

您可以简单地使用按钮的Tag属性来跟踪状态

If reduceOrderBTN.tag = 0 then begin
  // Sum orders code here
  reduceOrderBTN.tag := 1;
end
else begin
  // Set Previous state code here
  reduceOrderBTN.tag := 0;
end;

您可以简单地使用按钮的Tag属性来跟踪状态

If reduceOrderBTN.tag = 0 then begin
  // Sum orders code here
  reduceOrderBTN.tag := 1;
end
else begin
  // Set Previous state code here
  reduceOrderBTN.tag := 0;
end;

最具可读性的方法可能是创建两个像这样的TNotifyEvent过程

procedure TMyForm.OnClickNormal(Sender: TObject);
begin
  DoNormalAction;
  MyButton.Caption := 'Reverse Action';
  MyButton.OnClick := OnClickReverse;
end;

procedure TMyForm.OnClickReverse(Sender: TObject);
begin
  DoReverseAction;
  MyButton.Caption := 'Normal Action';
  MyButton.OnClick := OnClickNormal;
end;

然后在设计编辑器中设置默认操作和标题。

最可读的方法可能是创建两个类似于这样的TNotifyEvent过程

procedure TMyForm.OnClickNormal(Sender: TObject);
begin
  DoNormalAction;
  MyButton.Caption := 'Reverse Action';
  MyButton.OnClick := OnClickReverse;
end;

procedure TMyForm.OnClickReverse(Sender: TObject);
begin
  DoReverseAction;
  MyButton.Caption := 'Normal Action';
  MyButton.OnClick := OnClickNormal;
end;


然后,在设计编辑器中设置默认操作和标题。

让我们使用一个标志来保存网格当前所处的状态。在该操作中,执行事件处理程序请求该标志并相应地执行。然后把旗子换到另一个状态,就是这样。您需要状态的概念。@Juuri您已经接受了一个建议您使用标记的答案。这是可行的,但从软件开发的角度来看,这是一个糟糕的想法。你可以随心所欲,但我不得不告诉你,以这种方式使用Tag是一种非常糟糕的做法。让我们有一个和一个旗子,上面有网格当前所在的状态。在该操作中,执行事件处理程序请求该标志并相应地执行。然后把旗子换到另一个状态,就是这样。您需要状态的概念。@Juuri您已经接受了一个建议您使用标记的答案。这是可行的,但从软件开发的角度来看,这是一个糟糕的想法。你可以随心所欲,但我不得不让你知道,以这种方式使用标签是非常糟糕的做法。你可以,但这几乎不被推荐。名称标记不提供信息。使用类的私有数据成员并给它一个合理的名称。这是一种在一次性程序中可以接受的黑客行为,但否则你只是自找麻烦。至少你可以使用常量而不是数字来更清楚地说明问题。@DavidHeffernan:如果有什么问题,你会/会使用Tag属性做什么?我使用过使用标记进行此类标记的代码。诚然,与专用类型的专用成员相比,在这种情况下使用标记不太方便,但我并不觉得这种做法非常难以管理。澄清一下,我不记得在别人的代码中第一次遇到这个想法之前我自己也使用过这个想法,但我承认我至少没有将它改成更好的方法,甚至可能在其他地方引入过几次。我经常使用tag,通常作为一种索引,允许我对多个组件使用相同的例程。我想到的一个明显的答案是历史记录列表中的几个文件的列表,其中,不是动态添加菜单项,而是调用相同的OnClick事件,在该事件中,我使用该标记从数组中选择文件。可以,但不推荐这样做。名称标记不提供信息。使用类的私有数据成员并给它一个合理的名称。这是一种在一次性程序中可以接受的黑客行为,但否则你只是自找麻烦。至少你可以使用常量而不是数字来更清楚地说明问题。@DavidHeffernan:如果有什么问题,你会/会使用Tag属性做什么?我使用过使用标记进行此类标记的代码。诚然,与专用类型的专用成员相比,在这种情况下使用标记不太方便,但我并不觉得这种做法非常难以管理。澄清一下,我不记得在别人的代码中第一次遇到这个想法之前我自己也使用过这个想法,但我承认我至少没有将它改成更好的方法,甚至可能在其他地方引入过几次。我经常使用tag,通常作为一种索引,允许我对多个组件使用相同的例程。我脑海中浮现的一个明显的答案是历史列表中的几个文件的列表,其中,不是动态添加菜单项,而是调用相同的OnClick事件,我使用该标记从数组中选择文件。我不知道它是否最可读,但肯定更正确。@Leonardoherra:我不认为这或多或少是正确的。这只是一种在某些情况下更合适,而在其他情况下则不太合适的替代方案。尽管另一个答案使用的属性可能不适合标记,但这并不会使它提出的想法无效或减少。我不知道它是否可读,但肯定更正确。@LeonardoHerrera:我认为这或多或少是正确的。这只是一种在某些情况下更合适,而在其他情况下则不太合适的替代方案。即使另一个答案使用了可能不适合标记的属性,但这不会导致无效或错误 缩小它提出的想法。