![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
||||
|
||||
|
Cita:
Estuve haciendo pruebas al respecto y también me marca errores (aún quitando la línea que indicas), uno montón de "Access violation" e "Invalid pointer operation" y no queda más que Ctrl-Alt-Supr. Esto sucede cuando se inserta la componente durante el diseño y creo que tiene que ver con el hecho de que el Designer no se entera de la componente creada. También intenté usar InsertControl y aunque los errores no fueron tan catastróficos aún apareción uno aunque esto último ya no lo probé con detalle. // Saludos Última edición por roman fecha: 15-01-2004 a las 20:24:08. Razón: Un penoso error ortográfico |
|
#2
|
||||
|
||||
|
Pues, si lo he probado.... Este fue el texto original de mi respuesta, solo que lo resumí (bastante) porque creí que lo estaba complicando:
Bueno, te comento que he probado tu código y el error solo lo da si el Owner del TEdit2 destruye al componente, si lo destruyes "a mano" no se produce esto, lo que me lleva a sospechar que el problema es que primero se ejecuta el destroy del TWinControl y luego el de TComponent, que quiero decir con esto, que el form libera primero a todos los componentes relacionados por el Parent y luego los relacionados por el Owner, y como accede a la lista de abajo hacia arriba, destruye primero el botón y luego al edit, entonces cuando quieres destuír el botón explícitamente en el Destroy da un access violation, solución: elimina la línea Fboton.Free, total queda siempre eliminado cuando se elimina el TEdit, por su relación Owner.
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
|
|
#3
|
||||
|
||||
|
¿Has recompilado el paquete donde tienes instalado el componente?... porque si lo cambias solo en RunTime, el exe funcionará sin problemas pero el IDE fallará porque conserva una versión antigua del componente.
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
|
|
#4
|
||||
|
||||
|
Cita:
1. Inserté el componente 2. Cerré el formulario 3. Cerré Delphi Sin problemas Y me dije a mí mismo: "MiMismo, algo andabas haciendo mal" Entonces volví a abrir Delphi e hice: 1. Inserté el componente 2. Cerré Delphi Accesss violation again. // Saludos |
|
#5
|
||||
|
||||
|
Como dije, aún eliminando la línea del Free obtengo errores. Aquí está el codigo completo que según yo coincide con lo que dices:
Código:
unit EditEx;
interface
uses
SysUtils, Classes, Controls, StdCtrls;
type
TEditEx = class(TEdit)
private
FBoton: TButton;
protected
procedure SetParent(AParent: TWinControl); override;
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TEditEx]);
end;
constructor TEditEx.Create;
begin
inherited;
FBoton := TButton.Create(Self);
end;
procedure TEditEx.SetParent(AParent: TWinControl);
begin
inherited;
FBoton.Parent := AParent;
end;
end.
|
|
#6
|
|||
|
|||
|
Buenas, lo he probado, y a mi aún me sigue dando errores.Me pasa igual que ha roman
Por todos sitios donde he mirado, lo hacen como tu dices, pero no me funciona. El labelededit que lleva delphi, le he mirado el codigo fuente, y tambien lo hacen igual. No se, pero no me funciona. El error es una lista interminable de errores hasta que tengo que reiniciarlo. Gracias.
__________________
La victoria tiene cien padres. La derrota es huérfana (Napoleón). |
|
#7
|
|||
|
|||
|
además he hecho esto
procedure Tedit2.SetParent(AParent: TWinControl); begin inherited; FBoton.Parent := AParent; showmessage(AParent.Name); end; y el mensaje es 'Form1' es decir, lo esta asignando bien.Pero al cerrar la aplicación algo hace. Saludos
__________________
La victoria tiene cien padres. La derrota es huérfana (Napoleón). |
|
#8
|
||||
|
||||
|
Cita:
Vuelve a revisar el código y seguro que encontrarás cómo solucionarlo. Observa los puntos donde crea la etiqueta (SetupInternalLabel) y donde le asigna el Parent (SetParent) y verás que primero verifica que sea distinto de nil. También observa el uso de FreeNotification y Notification. El primero le indica a la etiqueta que le avise cuando se destruya y así, en Notification poder poner a nil la referencia. // Saludos |
|
#9
|
|||
|
|||
|
lo he hecho esto que me dices.El setupinternallabel, si no recuerdo mal, lo que hacia era crearlo.
Y el notification le pasa el componente y la orden opremove o algo asi era Flabel := nil Todo esto lo he probado. No se.Haber si alguien seria tan amable de hacer un pequeño componente muy pequeño que lo unico que haga sea crar dos componentes a partir de uno y que cuando se cierre el programa no de todos esos errores. Se que es un poco pedir, pero es que no me funciona lo que en teoria deberia de funcionar. Muchas gracias
__________________
La victoria tiene cien padres. La derrota es huérfana (Napoleón). |
|
#10
|
||||
|
||||
|
Cita:
Código:
unit EditEx;
interface
uses
SysUtils, Classes, Controls, StdCtrls;
type
TEditEx = class(TEdit)
private
FBoton: TButton;
protected
procedure SetParent(AParent: TWinControl); override;
procedure Notification(AComponent: TComponent;
AOperation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
published
property Boton: TButton read FBoton;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TEditEx]);
end;
constructor TEditEx.Create;
begin
inherited;
FBoton := TButton.Create(Self);
FBoton.FreeNotification(Self);
end;
procedure TEditEx.SetParent(AParent: TWinControl);
begin
inherited;
if Assigned(FBoton) then
FBoton.Parent := AParent;
end;
procedure TEditEx.Notification(AComponent: TComponent; AOperation: TOperation);
begin
inherited;
if (AComponent = FBoton) and (AOperation = opRemove) then
FBoton := nil;
end;
end.
Claro que verás que aunque puedes modificar las propiedades del botón en el inspector de objetos, no puedes moverlo, ni siquiera seleccionarlo en el formulario mediante el ratón. Dependiendo de lo que desees quizá te convenga fijarte con más detalle en la implementación de TLabeledEdit para lograr que el botón se mueva junto con tu Edit. // Saludos |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|