-2

假设我有三个开关,分别是 SW_A、SW_B 和 SW_ALL。

单击 SW_A 时(从关闭到打开),TMemo 打印“SW_A 已打开”,同样适用于 SW_B。

但是,当单击 SW_ALL(从关闭到打开)时,TMemo 会打印“SW_ALL is on”,并且 SW_A 和 SW_B 都应该打开,无论它们当前的状态是什么,而不打印“SW_A is on”和“SW_B is on”。 '

我的问题是,每当单击 SW_All 时,其他开关也会打印出它们的状态。有谁知道如何解决这个问题?谢谢!!

procedure TForm1.SW_ALLSwitch(Sender: TObject);
begin
  if SW_All.IsChecked then
  begin
    Memo1.Lines.Add('SW_All is on');

    SW_Alarm_A.IsChecked := True;
    SW_Alarm_B.IsChecked := True;

  end
  else
  begin
    Memo1.Lines.Add('SW_All is off');

    SW_Alarm_A.IsChecked := False;
    SW_Alarm_B.IsChecked := False;

  end;

end;


procedure TForm1.SW_ASwitch(Sender: TObject);
begin
  if SW_A.IsChecked = False then
    Memo1.Lines.Add('SW_A is off')
  else
    Memo1.Lines.Add('SW_A is on');
end;
4

1 回答 1

2

目前尚不清楚是仅在“单击 SW_ALL(从关闭到打开)”时出现问题,还是“每当单击 SW_ALL 时”出现问题。以下是“每当单击 SW_ALL”的解决方案。

开关组件大概有一个 OnSwitch 事件。当您切换 SW_ALL 并以编程方式更改其他开关的状态时,SW_A 和 SW_B 的 OnSwitch 事件会像单击时一样触发。

要暂时阻止 SW_A 和 SW_B 对开关事件做出反应,您可以将 nil 分配给 OnSwitch 事件,更改开关状态并重新分配 OnSwitch 事件。例如

procedure TForm1.SW_ALLSwitch(Sender: TObject);
var
  TempOnSwA, TempOnSwB: TNotifyEvent;
begin
  TempOnSwA := SW_Alarm_A.OnSwitch;
  SW_Alarm_A.OnSwitch := nil;
  TempOnSwB := SW_Alarm_B.OnSwitch;
  SW_Alarm_B.OnSwitch := nil;

  if SW_All.IsChecked then
  begin
    Memo1.Lines.Add('SW_All is on');

    SW_Alarm_A.IsChecked := True;
    SW_Alarm_B.IsChecked := True;

  end
  else
  begin
    Memo1.Lines.Add('SW_All is off');

    SW_Alarm_A.IsChecked := False;
    SW_Alarm_B.IsChecked := False;

  end;

  SW_Alarm_A.OnSwitch := TempOnSwA;
  SW_Alarm_B.OnSwitch := TempOnSwB;
end;
于 2014-12-08T09:27:15.243 回答