Aca se hablo de ese tema
Aunque el codigo que publique cumple su cometido, lo que resta por implementar es el comportamiento visual (no permitir clickear el boton, sombrearlo o algo para se note que esta desactivado, mouseover, entre otros)
Código Delphi
[-]
unit Unit1;
interface
uses
System.Classes,
Vcl.Forms,
Vcl.Dialogs,
Vcl.Controls,
Vcl.ButtonGroup;
type
TButtonGroup = class(Vcl.ButtonGroup.TButtonGroup)
protected
procedure DoItemClicked(const Index: Integer); override;
function GetButtonClass: TGrpButtonItemClass; override;
end;
TGrpButtonItemEx = class(TGrpButtonItem)
private
FEnabled: Boolean;
procedure SetEnabled(const Value: Boolean);
public
constructor Create(Collection: TCollection); override;
property Enabled: Boolean read FEnabled write SetEnabled;
end;
TForm1 = class(TForm)
ButtonGroup1: TButtonGroup;
procedure FormCreate(Sender: TObject);
procedure ItemClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ItemClick(Sender: TObject);
begin
ShowMessage('ItemClick');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ButtonGroup1.ButtonOptions := [gboFullSize, gboShowCaptions];
ButtonGroup1.Items[0].OnClick := ItemClick;
ButtonGroup1.Items[1].OnClick := ItemClick;
TGrpButtonItemEx(ButtonGroup1.Items[0]).Enabled := False;
end;
constructor TGrpButtonItemEx.Create(Collection: TCollection);
begin
inherited Create(Collection);
Enabled := True;
end;
procedure TGrpButtonItemEx.SetEnabled(const Value: Boolean);
begin
FEnabled := Value;
end;
procedure TButtonGroup.DoItemClicked(const Index: Integer);
var
ButtonItem: TGrpButtonItem;
begin
ButtonItem := Items[index];
if Assigned(ButtonItem) and (ButtonItem is TGrpButtonItemEx) then
begin
if not TGrpButtonItemEx(ButtonItem).Enabled then Exit;
end;
inherited DoItemClicked(index);
end;
function TButtonGroup.GetButtonClass: TGrpButtonItemClass;
begin
Result := TGrpButtonItemEx;
end;
end.
Lo mas sencillo es utilizar
TActionList y conectar los botones con los respectivos Actions. Luego, te manejas con las propiedad TAction.Enabled. Aunque esta solucion tiene la misma "pega" que la anterior, visualmente los botones parecen activos, pero es mucho mas sencilla de implementar