Ante todo muchas gracias por vuestro consejo y esfuerzo.
Voy a intentar concretar el tema...
No se si lo que quiero hacer se puede hacer si crearte tu propio componente y tus propios eventos. Sospecho que si, así que intentaré explicarme con mas claridad metiendo mas código de por medio
No pondré las clases que uso porque son un poco coñazo y largas, así que extrapolaré algo que mas o menos sea equiavlente pero resumido:
Código:
unit unit1;
TDibujo = class
private
nombre:String;
x,y:single;
radio:single;
imagen:TImage;
procedure _Onclick(Sender:TObject);
constructor Create(nombre:String;cx,cy,radio:single;im:String;padre:TWinControl);
(...)
end;
implementation
constructor
TDibujo.create(nombre:String;cx,cy,rad:single;im:String;padre:TWinControl);
begin
x:=cx;
y:=cy;
radio:rad;
imagen:=TImage.Create(nil);
imagen.Parent:=padre;
imagen.Picture.Bitmap.PixelFormat:=pf24bit;
imagen.OnClick:=_imagenclick;
if radio<10 then
imagen.Picture.LoadFromFile('pequeño.bmp')
else
imagen.Picture.LoadFromFile('grande.bmp');
end;
(...)
procedure _OnClick(Sender:TObject);
begin
?¿?¿?¿?
end;
IDEA - OBJETIVO
En el form de la
unit2 habrán:
-boton
CREAR: que cada vez que se pulse, creará un objeto de tipo TDIbujo. La imagen se presentará en el form según las coordenadas que se le asignaron al objeto al crearlo ( por ejemplo de forma aleatoria ). Claro,¿no? :P
- 4 Componentes tipo TEdit, vacios, en la parte inferior del form, con sus TLabels: "nombre, coordenada X, coordenada Y, Radio".
Así tendré tantas imágenes en el form como objetos creados de TDibujo.
Estas imágenes que representan a los objetos de TDibujo, se pueden mover con el ratón, es decir, pinchando sobre una y arrastrandola donde quieras. Las coordenadas de donde sueltes la imagen, deben actualizarse en el objeto. ESTO LO TENGO RESUELTO GRACIAS A NEFTALI
.
EL PROBLEMA
Tambien quiero que cuando hagas un click sobre cualquier imagen, en los TEdit aparezca los datos del objeto que representa esa imagen. Se entiende ¿no?. Hago click sobre una imagen, y aparece su nombre, coordenadas, y radio en los TEdit del formulario.
LA SOLUCIÓN CUTRE
Si declaro/implemento la clase TDibujo en la unit2 podría implementar así:
Código:
procedure TDibujo._OnClick(Sender:TObject);
begin
TEditNombre.text:=nombre;
TEditcX.text:=FloatToStr(x);
TEditcY.text:=FloatToStr(y);
TEditRadio:=FloatToStr(radio);
end;
Lo puedo hacer así ya que los componentes TEdit están en el mismo formulario que la (definición de la) clase y son visibles a ella(a la clase), pudiendo así acceder sin problemas.
Pero esta solución me parece muy poco elegante, aparte de otras cosas.
EL PROBLEMA (AMPLIACIÓN)
Como la clase está en la unit1, y en la unit2 empiezo así:
Código:
unit unit2
uses unit1;
NO PUEDO ACCEDER A LOS COMPONENTES DE LA unit2 DESDE LA unit1, es decir:
Código:
procedure TDibujo. _OnClick(Sender:TObject);
begin
unit2.TEditNombre.text:=nombre;
(...)
...me dice que no sabe quien sea unit2, porque no la usa, y no puede usarla porque crearia un "circular unit reference".
Cuando hago un click sobre la imagen, capturo el evento, pero tengo que codificarlo en la unit1, y por lo tanto no puedo acceder a los componentes de la unit2 para mostrar los datos del objeto....arf arf.
Espero que ahora se entienda bien mi problema :P.
La idea de jachguate de crearme mi propio componente y mis propios eventos, me parece buena....pero mis conocimientos no llegan a tanto... Y por ahora no tengo demasiado tiempo para aprenderlo, aunque lo haré en un futuro ya que ya veo que es bastante útil.
Creo que no se me olvida nada....de todos modos ¡¡¡MUCHAS GRACIAS POR VUESTRA AYUDA!!!
Editado por jachguate. razon: sacar de la etiqueta code lo que no debia estar alli: