Ver Mensaje Individual
  #1  
Antiguo 11-09-2015
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Reputación: 0
osmeg Va por buen camino
Read access violation address al intentar cambiar color a TCategoryPanel personalizad

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; //Aquí es donde ocurre el error.
              TCategoryPanelRespuesta(CategoryPanelGroupRespuestas.Controls[i]).comboBoxContAcad.Enabled:= false;
              TCategoryPanelRespuesta(CategoryPanelGroupRespuestas.Controls[i]).btnVerRespuestas.Enabled:= false;
            end;
        end;
    end;
end;

Saludos.
Responder Con Cita