FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
¿Existe el objeto Application?
Cita:
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#5
|
|||
|
|||
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"... |
#6
|
||||
|
||||
Estas haciendo referencia a una variable que no has asignado: frmButton.
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. |
#7
|
||||
|
||||
Cita:
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#8
|
||||
|
||||
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 |
|
|
|