Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-12-2014
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Poder: 0
osmeg Va por buen camino
Access violation at address al agregar TButtonCategory en TCategoryButtons

Buenas noches a todos,

Estoy utilizando uno de los componentes VCL disponible en Delphi, el componente TCategoryButtons. Mi intención es crear un componente TCategoryButton, dentro de este agregar varias categorias del tipo TButtonCategory, y finalmente en este último agregar TButtonItems.

Aparentemente todo funciona a la perfección porque el componente y sus derivados realizan su función. Sin embargo, siempre aparece el error: "Access violation at address ... in module ... Read of address 00000000X" y no entiendo porqué.

El código que estoy utilizando es el siguiente:

Código Delphi [-]
type
  TForm1 = class(TForm)
    Panel: TPanel;
    procedure PanelClick(Sender: TObject);
  private
  seccionBotones: TCategoryButtons;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PanelClick(Sender: TObject);
var
    categoria:TButtonCategory;
    boton: TButtonItem;
begin

seccionBotones:= TCategoryButtons.Create(Panel);
seccionBotones.Parent:= Panel;

categoria:=seccionBotones.Categories.Add;
categoria.Caption:= 'Categoria 1';

boton:= categoria.Items.Add;
boton.Caption:='Boton'

end;

end.
Agradezco de antemano algún aporte que los usuarios del clubdelphi puedan realizar para la solución de este problema.
Responder Con Cita
  #2  
Antiguo 10-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
osmeg,

Cita:
Empezado por osmeg
...Estoy utilizando...el componente VCL TCategoryButtons...siempre aparece el error: "Access violation"...


Revisa este código:
Código Delphi [-]
 procedure TForm1.PanelClick(Sender: TObject);
 var
   categoria:TButtonCategory;
   boton: TButtonItem;

 begin
 
   // Sentencia eliminada por ser redundante -> seccionBotones := TCategoryButtons.Create(Panel);
   // seccionBotones es creado en la definición de la clase TForm1

   seccionBotones.Parent:= Panel;
 
   categoria:=seccionBotones.Categories.Add;
   categoria.Caption:= 'Categoria 1';
 
   boton:= categoria.Items.Add;
   boton.Caption:='Boton'
 
 end;
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 10-12-2014 a las 07:10:47.
Responder Con Cita
  #3  
Antiguo 10-12-2014
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Poder: 0
osmeg Va por buen camino
Hola nlsgarcia,

Gracias por contestar. Realicé lo que me indicaste (quitar sentencia redundante) pero ahora no aparece el componente en el Panel y sigue apareciendo el mismo error (Access violation at address...). Según entiendo, el problema se encuentra en la sentencia:

Código Delphi [-]
categoria:=seccionBotones.Categories.Add;

Porque 'categoria' no ha sido creada explícitamente en el código usando su respectivo constructor:

Código Delphi [-]
categoria:= TButtonCategory.Create();

El problema es que no sé como crearlo porque el constructor exige un elemento TCollection como parámetro.

Saludos.
Responder Con Cita
  #4  
Antiguo 10-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola osmeg.

Creo que este enlace te puede servir de ayuda: VCL Controls: Category Buttons

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 11-12-2014
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Poder: 0
osmeg Va por buen camino
Gracias por responder ecfisa,

Estuve comparando el uso del componente TCategoryButtons (y todos sus derivados: TButtonCategory y TButtonItem) cuando se crea tanto en tiempo de diseño como en tiempo de ejecución. Tras revisar durante algún tiempo, encontré una solución al problema del error Access violation at address..., con la siguiente secuencia de pasos:

1. Se oculta el componente principal (TCategoryButtons)
2. Se agregan los elementos necesarios al componente principal
3. Una vez agregados todos los elementos, se muestra el componente principal.

Creo que queda mas clara la idea expresandola en código:

Código Delphi [-]
type   TForm1 = class(TForm) 
Panel: TPanel;     
procedure PanelClick(Sender: TObject);   
private   
seccionBotones: TCategoryButtons;     
{ Private declarations }   
public     
{ Public declarations }   
end;  

var   
Form1: TForm1;  
implementation  

{$R *.dfm}  
procedure TForm1.PanelClick(Sender: TObject); 
var     
categoria:TButtonCategory;     
boton: TButtonItem; 
begin  

seccionBotones:= TCategoryButtons.Create(Panel); 
seccionBotones.Parent:= Panel; 

seccionBotones.Hide; //Linea nueva: Oculta el componente seccionBotones

categoria:=seccionBotones.Categories.Add; 
categoria.Caption:= 'Categoria 1';  

boton:= categoria.Items.Add; 
boton.Caption:='Boton';
 
seccionBotones.Show; //Línea nueva: Muestra el componente seccionBotones

end;


La verdad desconozco porqué de esta forma se soluciona el problema del error. Depronto alguno de ustedes quiera complementar esa solución justificandola.

Saludos y gracias por su colaboración.
Responder Con Cita
  #6  
Antiguo 11-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
osmeg,

Cita:
Empezado por osmeg
...Realicé lo que me indicaste (quitar sentencia redundante) pero ahora no aparece el componente en el Panel y sigue apareciendo el mismo error...
Cita:
Empezado por osmeg
...encontré una solución al problema del error Access violation...con la siguiente secuencia de pasos...Se oculta el componente...Se agregan los elementos necesarios...se muestra el componente...


Te comento:

1- El código del Msg #1 crea dos instancias del componente TCategoryButtons, una en la clase de TForm1 y otra dentro de un método de TForm1.

2- La idea de eliminar la sentencia redundante, era para ejemplificar que el problema se originaba por las dos instancias del componente, no como una solución definitiva.

3- Una forma de eliminar el error de Access Violation y evitar la redundancia del componente TCategoryButtons es la siguiente:
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,
  Vcl.CategoryButtons, Vcl.ExtCtrls, Vcl.ImgList;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure Panel1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Panel1Click(Sender: TObject);
var
   seccionBotones : TCategoryButtons;
   categoria : TButtonCategory;
   boton : TButtonItem;

begin
   seccionBotones := TCategoryButtons.Create(Panel1);
   seccionBotones.Parent := Panel1;

   categoria := seccionBotones.Categories.Add;
   categoria.Caption := 'Categoria 1';

   boton := categoria.Items.Add;
   boton.Caption := 'Boton';
end;

end.
El código anterior en Delphi XE6 sobre Windows 7 Professional x32, crea en Runtime un componente TCategoryButtons asociado a un TPanel y adiciona un botón al mismo.

Otro ejemplo

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons,
  Vcl.CategoryButtons, Vcl.ExtCtrls, Vcl.ImgList, PNGImage;

type
  TForm1 = class(TForm)
    CategoryButtons1: TCategoryButtons;
    ImageList1: TImageList;
    Image1: TImage;
    procedure CategoryButtons1CategoriesItemsClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Muestra una Imagen PNG en función del botón seleccionado en TCategoryButtons
procedure TForm1.CategoryButtons1CategoriesItemsClick(Sender: TObject);
var
   Image : String;
   Index : Integer;
begin
   Index := TCategoryButtons(Sender).CurrentCategory.CategoryButtons.SelectedItem.Index;
   Image := 'D:\Developers Delphi\Delphi Test (DXE6)\Test-17 (TCategoryButtons-1)\Images\'
            + 'Emoticons-'
            + IntToStr(TCategoryButtons(Sender).CurrentCategory.Items[Index].ImageIndex + 1)
            + '.png';
   Image1.Picture.LoadFromFile(Image);
end;

end.
El código anterior en Delphi XE6 sobre Windows 7 Professional x32, muestra un ejemplo de uso del componente TCategoryButtons configurado en Tiempo de Diseño, como se muestra en la siguiente imagen:



El código del ejemplo funciona correctamente sin la necesidad de crear una nueva instancia del componente TCategoryButtons, dado que este es creado en la definición de la clase TForm1.

El código esta disponible en : TCategoryButtons.rar

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 11-12-2014 a las 09:52:45.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ventana de error: Access violation at address 00CA1C10. Read of address 00CA1C10 HERYCK Varios 3 06-10-2012 08:35:57
Access violation at address 7C92B1FA in module 'ntdll.dll'. Write of address 00000010 genyus00 Varios 1 12-02-2011 10:41:20
Access violation at address elarys Varios 6 22-11-2007 19:24:35
Access violation at address ... Franklim API de Windows 2 03-12-2004 01:09:53
Access violation at address 005553D2 Antonio Rosas E Conexión con bases de datos 2 08-10-2004 21:18:55


La franja horaria es GMT +2. Ahora son las 14:01:55.


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
Copyright 1996-2007 Club Delphi