Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
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-06-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Error al ejecutar editor de componentes

Alguien sabe porqué no puedo acceder a las propiedades del formulario de un editor de componentes. Cuando trato de modificar algo (p. ej. FormComponente.Width := ...) durante la ejecución del editor me da un error que reza:

"Access violation at address 0081F52D in module vcl70.bpl. Read of address 0000004C"

No es el código específico de ese editor ya que lo he probado con otros editores que funcionaban y si les agrego caprichosamente en cualquier lado la linea corresponediente que diga FormComp.width := ... (FormComp es, por supuesto, un nombre genérico, yo le pongo el que corresponde) me da un error similar.

Yo necesito acceder (si es que se puede) a modificar las dimensiones del Form (digamos... a agrandarlo) según el ancho que el usuario le de al componente utilizando el editor

gratzie
Responder Con Cita
  #2  
Antiguo 14-06-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.269
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Sin algo de código es difícil de imaginarse qué puede estar pasando...
Ese error suele pasar al acceder a algun objeto que no está inicializado, o acceder a un apuntador que "apunta" a basura.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 14-06-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
codigo

No soy amigo de aburrir con largos códgos, sin embargo como no sé donde puede estar la falla, intenté hacer un hipotético codigo (suficientemente corto) con el esquema que tanía programado en mi componente para ver si pueden descubrir algo. Imaginen un (inutil, por cierto) editor de botones standard de delphi. El form del editor, tiene un botón (button2) que fija el ancho de la ventana en 500 pixels (acá es donde daría el error).
ACLARO: No probé este editor y además lo armé de memoria en el block de notas de windows, ya que no voy a tener acceso a una máquina con Delphi hasta la noche, así que puede tener más errores. Lo importante es la idea.

Código:
 
unit ButtonEditor;
interface
 
uses
  Windows, SysUtils, Classes, {....etc, etc...}, DesignIntf, DesignEditors;
 
type
  TfrmButton = class(TForm)
	Button1: TButton;
	Button2: TButton;
	{.......}
	procedure Button2Click(Sender: TObject);
	{....... y manejo de otras propiedades del botón}
	 
  private
  public
  end;
 
 TButtonEditor = class(TComponentEditor)
	function GetVerbCount : integer; override;
	function GetVerb(Index : integer) : string; override;
	procedure ExecuteVerb(Index : integer); override;
	procedure ActualizarComponente(aForm : TfrmButton);
  end;
 
var
  frmButton: TfrmButton;
 
procedure Register;
 
implementation
 
{$R *.DFM}
 
// Form del Editor de propiedades		
//**************************************
procedure TfrmButton.Button2Click(Sender: TObject);
begin
  FrmButton.Width := 500;
end;
{....... y manejo de otras propiedades del botón}
 
// Form del Editor de propiedades		
//**************************************
function TButtonEditor.GetVerbCount : integer;
begin
  Result:=1;
end;
 
function TButtonEditor.GetVerb(Index : integer) : string;
begin
  Result:='E&dit...';
end;
 
procedure TButtonEditor.ExecuteVerb(Index : integer);
  procedure CopyButton(Dest, Source : TButton);
  begin
	Dest.Caption := Source.Caption;
	Dest.Width:=Source.Width;
	Dest.Height:=Source.Height;
  end;
Var
  aForm : TfrmButton;
begin
  aForm:=TfrmButton.Create(Application);
  try
	CopyButton(aForm.Button1, Component As TButton);
	if aForm.ShowModal = mrOK then
	begin
	  ActualizarComponente(aForm);
	  Designer.Modified;
	end;
  finally
	aForm.Free;
  end;
end;
 
procedure TButtonEditor.ActualizarComponente(aForm : TfrmButton);
  procedure GetButton(Dest, Source : TButton);
  begin
	Dest.Caption := Source.Caption;
	Dest.Width:=Source.Width;
	Dest.Height:=Source.Height;
  end;
begin
 GetButton(Component As Tbutton, aForm.Button1);
end;
 
procedure Register;
begin
  RegisterComponentEditor(TButton,TButtonEditor);
end;
end.
Responder Con Cita
  #4  
Antiguo 14-06-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿Existe el objeto Application?
Cita:
TfrmButton.Create(Application);
Mmmmmmm...
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 14-06-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Si...
Según tengo entendido TMiForm.Create(Application) hace lo mismo que Application.CreateForm excepto porque con el primero setea automáticamente la form creada como la primera (o main form) de la applicación.

De todas formas insisto: el error lo da en la linea:
"FrmButton.Width := 500;", y entiendo que es un error que me indica que estoy tocando algo que no debo (en este caso el Form del editor). El problema es porqué "no debo"...
Responder Con Cita
  #6  
Antiguo 14-06-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Estas haciendo referencia a una variable que no has asignado: frmButton.
Código Delphi [-]
procedure TfrmButton.Button2Click(Sender: TObject);
begin
  Width := 500;
end;


Yo ni la declararía.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 14-06-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por elcigarra
Si...
Según tengo entendido TMiForm.Create(Application) hace lo mismo que Application.CreateForm excepto porque con el primero setea automáticamente la form creada como la primera (o main form) de la applicación.
Si, pero el objeto Application depende del tipo de aplicación, y en este caso se trata de un editor de propiedades, y por lo que recien he visto el Application hace referencia al TApplication del IDE de Delphi.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 14-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
FrmButton jamás se crea.

En el método ExecuteVerb del editor creas una instancia de TfrmButton que asignas a la variable local aForm mientras que en TfrmButton.Button2Click intentas acceder a la variable global frmButton.

¿Porqué no simplemente en lugar de

FrmButton.Width := 500;

pones

Width := 500;?

// Saludos
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


La franja horaria es GMT +2. Ahora son las 00:34:35.


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