PDA

Ver la Versión Completa : TGrpButtonItem con propiedad Enabled


Jose Roman
08-11-2016, 18:54:17
Cordial saludo,

Estoy trabajando con XE8, y tengo un proyecto que tiene un componente TButtonGroup y a su vez este tiene dos TGrpButtonItem, como se sabe este ultimo no posee la propiedad Enabled, me gustaria crear una clase derivada para tal fin como lo hace en marteens.com (http://marteens.com/trick46.htm), esto es avanzado para mi y no se implementarlo bien.

Gracias por la ayuda

AgustinOrtu
08-11-2016, 19:44:59
Aca (http://delphiaccess.com/foros/index.php/topic/13186-habilitardeshabilitar-items-de-un-tbuttongroup/) 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)


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;

{ TGrpButtonItemEx }

constructor TGrpButtonItemEx.Create(Collection: TCollection);
begin
inherited Create(Collection);
Enabled := True;
end;

procedure TGrpButtonItemEx.SetEnabled(const Value: Boolean);
begin
FEnabled := Value;
end;

{ TButtonGroup }

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

Jose Roman
09-11-2016, 02:34:27
Gracias por tu ayuda, utilizare el ejemplo y te comentare como me fue.