グループ内で唯一のDelphi TSpeedButtonが押されたままになるようにする方法
質問
TSpeedButtonにこのプロパティがある理由はわかりませんが、TSpeedButtonが特定のグループインデックスの唯一のボタンである場合、「AllowAllUp」かどうかに関係なく、TSpeedButtonは押されたままになりません。が押されます。ジェダイのコントロールで十分かもしれませんが、うまくいけば修正があります。ヘルプや逸話をいただければ幸いです。
ところで、私は(まだ)Delphi 7を使用していますが、これが全面的な難問かどうかはわかりません。
解決
ここにはD7がありませんが、D2006では、GroupIndexの値が>の場合、Speedbuttonは押したままになります。 0。
これが希望する動作でない場合は、OnClick-EventhandlerでDown-Propertyを手動で設定できます(GroupIndexが0であることを確認してください)。
他のヒント
Delphi 7(ビルド4.453)で試しました:
- 新しいアプリケーションを作成
- フォームに
TSpeedButton
を追加 - set
AllowAllUp:= true;
- set
GroupIndex:= 1;
- アプリケーションを実行
ボタンをクリックすると、他のコードを必要とせずにダウン状態に切り替わります。
knight_killerは正しいです。デルファイのどのバージョンでも動作することを教えてください:
object SpeedButton1: TSpeedButton
Left = 152
Top = 384
Width = 23
Height = 22
AllowAllUp = True
GroupIndex = 99
end
Delphiが作業を行うため、「コードを記述しないでください」
IDEで、すべてのSpeedButtonsを選択します グループとして動作し、全体を設定したい グループの" GroupIndex" 「0」以外の何かに; これでコードはありません-NADA !!
うーん、奇妙なことに、これを何度も使用して成功したことを覚えています。おそらく、SpeedButtonの Down
プロパティで遊んでみてください。クリックすると自動的に切り替わるとは思わない--- Down
を明示的に切り替える必要があります...
[edit: Checked
を Down
に置き換えました--- TSpeedButtonには Checked
プロパティがありません、申し訳ありません!]
これを機能させるために、Downプロパティは常にOnClickイベントでダウンしているため、Downプロパティを切り替えることはできません。別の値が必要です:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
MyBoolProperty := not MyBoolProperty;
SpeedButton1.Down := MyBoolProperty;
end;
トリックは、GroupIndexを一意の値に設定し、AllowAllUpをtrueに設定することです。 最初のものを忘れた場合、ダウンしたままにならず、2番目のものを忘れた場合、一度ダウンすると、アップしたままになりません。
AllowAllUpをTrueに設定します。
GroupIndexを0以外に設定します。
すべてをOnClickに保持するには、試してください
with Speedbutton1 do
begin
if tag = 1 then tag := 0 else tag := 1;
down := (tag = 1);
end;
GroupIndex
はボタンをグループ化します。グループ内の1つのボタンのみがアクティブになります。それらはすべて、 0
よりも高い同じインデックスを持つ必要があります。
AllowAllUp
では、ボタンを2回連続でクリックすると、ボタンを上下に切り替えることができます。
自分の問題の解決策を探していましたが、これは同じものだと思います。 SpeedButtonにスイッチのように上下の状態を切り替えるようにしたかったので、プロパティを設定してこれを管理しました:
AllowAllUp := True;
GroupIndex := 1;
次に、作成したボタンの OnClick
イベントで:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if( SpeedButton1.AllowAllUp ) then
begin
SpeedButton1.AllowAllUp := False;
SpeedButton1.Down := True;
end else
begin
SpeedButton1.AllowAllUp := True;
SpeedButton1.Down := False;
end;
end;
これにより、ボタンがクリックされるとボタンが下に切り替わり、もう一度クリックされるとボタンが上に切り替わります。
何か助けになることを願って
AllowAllupをtrueに、Downをfalseに設定します。
その後、 OnClick
イベントで:
....
btn.AllowAllUp := not btn.AllowAllUp;
btn.Down := not btn.Down;
....