Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-09-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
error al colocar un componente propio a un form

Estimados, estoy tratando de programar un componente propio y el código resultante es este.

//Inicio

type
TProducto = class(TPanel)
protected
procedure SetHeight(Value:integer);
procedure SetWidth(Value:integer);
procedure SetForma(Value:TShapeType);
procedure SetEtiqueta(Value:String);
procedure SetColorForma(Value:TColor);
procedure SetOnMouseDown(Value:TMouseEvent);

function GetForma:TShapeType;
function GetHeight:integer;
function GetWidth:integer;
function GetEtiqueta:string;
function GetColorForma:TColor;
function GetOnMouseDown:TMouseEvent;

published
sForma:TShape;
lEtiqueta:TLabel;

constructor PanelCreate(Sender: Tcomponent);
procedure PanelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ShapeMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
property Height:integer read GetHeight write SetHeight default 0;
property Width:integer read GetWidth write SetWidth default 0;
property Forma:TShapeType read GetForma write SetForma default stRoundRect;
property Etiqueta:string read GetEtiqueta write SetEtiqueta;
property ColorForma:TColor read GetColorForma write SetColorForma default clGreen;
property OnMouseDown:TMouseEvent read GetOnMouseDown write SetOnMouseDown;
//property PopUpMenu:TPopUpMenu read GetPopUpMenu write SetPopUpMenu;

public
procedure MostrarMensaje; virtual; abstract;
private

end;
//Fin

Obviamente despues de implementation esta el código necesario para todos los procesos y funciones declarados para la clase, no lo escribo acá por que ya es mucho :S.

El tema es que cuando registro esta clase y la instalo como un nuevo componente, aparece el la barra de componentes todo muy lindo, pero cuando la ubico en un form me sale un error "Acces violation in module productos.bpl" y luego "stack overflow save your work and restart delphi" cuac :SSS.

por que se puede dar esto.

sludos.
Responder Con Cita
  #2  
Antiguo 14-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Veo que ya tienes algunos mensajes en el foro, por lo cual ya deberías haber leido la Guía de Estilo de los foros...

También te recomiendo que uses las etiquetas (sin los espacios en blanco) para mostrar tu código:

var
A, I: Integer;

begin
A := 3;
for I := A to 10 do
ShowMessage(IntToStr(I))
end;

Código Delphi [-]
var
  A, I: Integer;

begin
  A := 3;
  for I := A to 10 do
    ShowMessage(IntToStr(I))
end;

Ves la diferencia?

Ahora, sobre tu problema, algo me dice que el error se encuentra en el código del constructor CreatePanel, pero sin ver el código no te puedo decir más...


Saludos...

Última edición por maeyanes fecha: 14-09-2007 a las 21:24:56.
Responder Con Cita
  #3  
Antiguo 14-09-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
Este es el código del constructor



Código delphi [-]



constructor TProducto.PanelCreate(Sender:Tcomponent);
begin
inherited Create(Sender);

lEtiqueta:=TLabel.Create(Sender);
lEtiqueta.Caption:=''+#13#10+'';
lEtiqueta.Font.Size:=10;
lEtiqueta.Font.Style:=[fsBold];
lEtiqueta.Top:=0;
lEtiqueta.AutoSize:=false;
lEtiqueta.OnMouseDown:=ShapeMouseDown;
lEtiqueta.Font.Name:='Optima';

sForma:=TShape.Create(Sender);
sForma.Brush.Style:=bsClear;
sForma.Pen.Style:=psClear;
sForma.OnMouseDown:=ShapeMouseDown;

BevelInner:=bvNone;
BevelOuter:=bvNone;
Color:=clWhite;
ParentShowHint:=false;
ShowHint:=true;
AutoSize:=true;
OnMouseDown:=PanelMouseDown;
InsertControl(sForma) ;
InsertControl(lEtiqueta);
end;


saludos.
Responder Con Cita
  #4  
Antiguo 14-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
No veo nada raro en tu código...

Podrás subir la unidad del código en un archivo zip para que le eche un vistazo?


Saludos...
Responder Con Cita
  #5  
Antiguo 14-09-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
ahí lo subi, espero que se entienda :S

gracias.
Responder Con Cita
  #6  
Antiguo 14-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Ahí donde?
Responder Con Cita
  #7  
Antiguo 14-09-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
Ahora si
Archivos Adjuntos
Tipo de Archivo: zip Producto.zip (1,4 KB, 7 visitas)
Responder Con Cita
  #8  
Antiguo 14-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
El error de Stack Overflow se da en este método:

Código Delphi [-]
function TProducto.GetOnMouseDown:TMouseEvent;
begin
  Result := OnMouseDown;
end;

Por que, por que estas haciendo llamadas recursivas del mismo método GetOnMouseDown...

Solucion:

Código Delphi [-]
function TProducto.GetOnMouseDown:TMouseEvent;
begin
  Result := sForma.OnMouseDown
end;

Ahora, como estás creando un componente visual, te recomiendo que en lugar de crear un constructor propio, redefinas el de TPanel:

Código Delphi [-]
TProducto = class(TPanel)
  // ...
public
  constructor Create(AOwner: TComponent); override;
end;

implementation

constructor TProducto.Create(AOwner: TComponent);
begin
  inherited;
  // Inicializas tu componente...
end;

Por cierto, los métodos para asignar propiedades deben ser siempre privados, a menos que quieras hacerlos virtuales para que futuros descendientes los puedan redefinir...

Otra observación, el método MostrarMensaje lo declaras como un método abstracto, y al ser un componente visual, esto no es aconsejable, ya que para poder hacer buen uso del componente, tendrías que crear un descendiente que implementara la funcionalidad de MostrarMensaje...


Saludos....
Responder Con Cita
  #9  
Antiguo 14-09-2007
mauqu mauqu is offline
Miembro
 
Registrado: may 2007
Posts: 28
Poder: 0
mauqu Va por buen camino
compañero, muchas gracias, el problema del overflow se debía a eso y a las propiedas height y width que las estaba asignando igual que la de onmousedown, cambié tambien el constructor y todo esta perfecto, muchas gracias.

slds.
Responder Con Cita
Respuesta



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
Problema con foco en componente propio diegofhernando OOP 2 04-09-2007 17:58:34
Abrir archivo propio desde Windows....en programa propio darkphantom Varios 12 22-02-2007 04:46:49
componente form transparente... n3mohack Varios 10 13-01-2006 16:11:38
Preview propio en un form brandolin Impresión 1 30-06-2005 14:44:30
Borrar componente de un Form muzit OOP 7 23-10-2003 23:44:30


La franja horaria es GMT +2. Ahora son las 00:32:59.


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