Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TGrpButtonItem con propiedad Enabled (https://www.clubdelphi.com/foros/showthread.php?t=91086)

Jose Roman 08-11-2016 18:54:17

TGrpButtonItem con propiedad Enabled
 
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, esto es avanzado para mi y no se implementarlo bien.

Gracias por la ayuda

AgustinOrtu 08-11-2016 19:44:59

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;
 
{ 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.


La franja horaria es GMT +2. Ahora son las 19:37:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi