Que tal amigos de ClubDelphi,
Tengo un problema a la hora de cambiar el color a un componente, No sé si me puedan colaborar. Resulta que he creado una clase de tipo TCategoryPanel personalizada según lo que requiero. Lo que tiene de diferente esta clase con respecto al TCategoryPanel genérico es que tiene componentes internos en él: un TButton y un TComboBox. Un número indeterminado de estos TCategoryPanel personalizado es agregado a un TCategoryPanelGroup.
Lo que se desea principalmente es que cuando el usuario dé clic en algun TCategoryPanel se cambie el color de este para diferenciarlo de los demás y, a los demás dejarlos con un color estandar. Sin embargo aquí esta el problema: cuando se da clic a un componente TCategoryPanel se admite el cambio de color de aquel que se seleccionó, pero al intentar cambiar el color de los demas aparece la excepción Read access violation address. Esta excepción aparece como 15 veces y después sí efectua el cambio como se solicita.
A continuación se encuentra detallado el código del TCategoryPanel personalizado:
Código Delphi
[-]
unit CategoryPanelRespuesta;
interface
uses
System.Classes, Vcl.Controls, Vcl.StdCtrls, ExtCtrls, Vcl.Graphics, Vcl.Forms, Vcl.ButtonGroup, SysUtils;
type
TCategoryPanelRespuesta = class(TCategoryPanel)
constructor Create(AOwner:TComponent);
private
comboBoxContAcad: TComboBox;
btnVerRespuestas: TButton;
end;
implementation
constructor TCategoryPanelRespuesta.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Self.BorderStyle:= bsSingle;
Self.ParentBackground:= false;
comboBoxContAcad:= TComboBox.Create(Self);
comboBoxContAcad.Parent:= Self;
comboBoxContAcad.Style:= csDropDownList;
btnVerRespuestas:= TButton.Create(Self);
btnVerRespuestas.Parent:= Self;
btnVerRespuestas.Caption:= 'Ver respuestas';
end;
end.
Y aquí se encuentra el código del evento onClick del TCategoryPanel:
Código Delphi
[-]
procedure TFrmGUIGestionRespuestas.btnCategPanelRtasClick(Sender: TObject);
var
i: Integer;
begin
if Sender is TCategoryPanelRespuesta then
begin
for i := 0 to CategoryPanelGroupRespuestas.ControlCount-1 do
begin
if TCategoryPanelRespuesta(Sender).codigo = TCategoryPanelRespuesta(CategoryPanelGroupRespuestas.Controls[i]).codigo then
begin
TCategoryPanelRespuesta(Sender).Color:= clGradientInactiveCaption;
TCategoryPanelRespuesta(Sender).comboBoxContAcad.Enabled:= true;
TCategoryPanelRespuesta(Sender).btnVerRespuestas.Enabled:= true;
end
else
begin
TCategoryPanelRespuesta(CategoryPanelGroupRespuestas.Controls[i]).Color:= clMenu; TCategoryPanelRespuesta(CategoryPanelGroupRespuestas.Controls[i]).comboBoxContAcad.Enabled:= false;
TCategoryPanelRespuesta(CategoryPanelGroupRespuestas.Controls[i]).btnVerRespuestas.Enabled:= false;
end;
end;
end;
end;
Saludos.