Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Read access violation address al intentar cambiar color a TCategoryPanel personalizad (https://www.clubdelphi.com/foros/showthread.php?t=89014)

osmeg 11-09-2015 15:27:24

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.


La franja horaria es GMT +2. Ahora son las 03:46:53.

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