Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error al ejecutar editor de componentes (https://www.clubdelphi.com/foros/showthread.php?t=22381)

elcigarra 14-06-2005 05:50:17

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

Neftali [Germán.Estévez] 14-06-2005 09:32:09

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.

elcigarra 14-06-2005 16:24:09

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.


delphi.com.ar 14-06-2005 16:41:20

¿Existe el objeto Application?
Cita:

TfrmButton.Create(Application);
Mmmmmmm...

elcigarra 14-06-2005 19:03:55

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"...

delphi.com.ar 14-06-2005 19:31:25

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 14-06-2005 19:33:26

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!

roman 14-06-2005 19:36:40

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


La franja horaria es GMT +2. Ahora son las 17:24:39.

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