在 Delphi 11.1 Alexandria的Windows 10中的一个32位VCL应用程序中,我有5个TRadioButton
控件直接位于TRelativePanel
上。我希望将其中3个作为独立组使用,而不使用容器控件(如TPanel
)用于这3个TRadioButton
控件,这意味着当我单击这3个TRadioButton
控件中的一个时,剩余的2个TRadioButton
控件将不会被取消选中。
为此,我重写了TRadioButton
类中受保护的SetChecked
方法:
type
TMyRadioButton = class(Vcl.StdCtrls.TRadioButton)
private
FChecked: Boolean;
protected
procedure SetChecked(Value: Boolean); override;
end;
implementation
procedure TMyRadioButton.SetChecked(Value: Boolean);
procedure TurnSiblingsOff;
var
I: Integer;
Sibling: TControl;
begin
if Parent <> nil then
with Parent do
for I := 0 to ControlCount - 1 do
begin
Sibling := Controls[I];
if (Sibling <> Self) and (Sibling is TMyRadioButton) then
with TMyRadioButton(Sibling) do
begin
if Assigned(Action) and (Action is TCustomAction) and TCustomAction(Action).AutoCheck then
TCustomAction(Action).Checked := False;
SetChecked(False);
end;
end;
end;
begin
if FChecked <> Value then
begin
FChecked := Value;
TabStop := Value;
if HandleAllocated then
begin
SendMessage(Handle, BM_SETCHECK, WPARAM(Checked), 0);
if not (csLoading in ComponentState) and IsCustomStyleActive and Visible then
SendMessage(Handle, WM_SETREDRAW, 1, 0);
end;
if Value then
begin
TurnSiblingsOff;
inherited Changed;
if not ClicksDisabled then
Click;
end;
end;
end;
您可以看到,我更改了TurnSiblingsOff
过程以仅考虑TMyRadioButton
控件,因此不要取消选中其余的2个TRadioButton
控件。
然后,我重新声明了3个要独立的TRadioButton
控件为TMyRadioButton
:
rbSortNone: TMyRadioButton;
rbSortPath: TMyRadioButton;
rbSortModified: TMyRadioButton;
但是,在Objectinspector中,这3个控件仍然声明为TRadioButton
!:
为什么?
然后在第二步中,我计划添加一个属性GroupIndex
,这样只有具有相同GroupIndex的控件才会被取消选中。
2条答案
按热度按时间rks48beu1#
这是GroupRadioButton.pas中新组件
TGroupRadioButton
的最新版本(请注意新属性GroupIndex
):这是一个包PackageGroupRadioButton.dpk:
现在我已经创建了这个演示应用程序:
下面是DPR:
以下是PAS:
这是DFM:
下面是一个简短的演示视频:
unguejic2#
这个(最终的)答案完全基于Andreas Rejbrand的想法,即只使用一个插入器类(没有新的组件):
以下是DPR来源:
以下是PAS来源:
这是DFM的来源:
下面是一个简短的演示视频: