-2

SW_A、SW_B、SW_ALL という 3 つのスイッチがあるとします。

SW_A が (オフからオンに) クリックされると、TMemo は「SW_A is on」と出力し、SW_B についても同じことが機能します。

ただし、SW_ALL をクリックすると (オフからオンに)、TMemo は 'SW_ALL is on' を出力し、'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 に答える