PDA

Ver la Versión Completa : Eventos sobre una linea


Majo
25-06-2003, 20:57:49
Ante todo Un saludo, y gracias por su atencion

El problema que tengo es el siguiente:

Debo crear una serie de lineas en tiempo de ejecución, éstas deben aparecer en respuesta a clicks sucesivos sobre la form, esto tengo "idea sobre como hacerlo". el problema es que tengo mas componentes en pantalla tambien creados tambien en tiempo de ejecucion. al colocar estas lineas sobre la pantalla me borra los otros componentes.

a el otro problema es que el evento OnMouseMove sobre la linea se dispara no cuando paso sobre la lìnea sino cuando pasa sobre el recuadro que encierra la linea. lo mismo sucede con otros eventos.

Sino me he explicado bien, el objetivo es unir ciertos componentes que he creado en tiempo de ejecucion a través de lineas que a su vez deben poderse eliminar y que cuando el mouse pase sobre ellas el mouse cambie de aspecto.

gracias por su atencion y les agradecere cualquier aporte que puedan hacerme. :confused: :confused: :mad: ;)

andres1569
25-06-2003, 22:16:40
Por lo que explicas, tengo la sensación de qe utilizas un TShape o un TBevel para dibujar las líneas, ¿es así? Por supuesto, cuando colocas un componente, éste se sitúa sobre los anteriores, una forma de que se quede dibujado de fondo es que le apliques el método SendToBack nada más crearlo.

Bueno, ten en cuenta que estás tratando de hacer esto de una forma un tanto rudimentaria, es lógico que surta algún efecto no esperado. Si en realidad estás usando componentes TShape o TBevel para las líneas, en cuyo caso sólo pueden ser horizontales o verticales, lo que tienes que hacer es ajustar el alto/ancho del componente al grosor de la línea horizontal/vertical respectivamente para que coincida practicamente la superficie de la línea con el rectángulo que la delimita, no sé si me he explicado bien. De esta forma el OnMouseMove se ajustará más a lo que tú deseas hacer.

Si quieres que el Mouse cambie de aspecto al pasar sobre una línea, basta con que le asignes un Cursor diferente a los componentes que usas para las mismas (en la propiedad del mismo nombre).

Majo
25-06-2003, 23:37:04
Un saludo Y
Gracias por su colaboración andres


En realidad no estoy usando un TShape, lo que hago es crear un objeto que hereda las características de TGraphicControl. Y en el metodo paint de éste, dibujo la linea.

Tal vez no me supe explicar, lo que pasa es que al colocar la línea sobre un componente que ya esta sobre la form, parece que prima el objeto de la linea sobre el componente que ya estaba allí. Y.... que pasa ..... ya no se dispara ningun evento del componente (el que ya estaba en la form). Gran problema, porque este componente el cual ya tiene una funcion que me permite arrastralo con el mouse sobre la form, ya no lo hace, está allí dibujado pero parece que no existiera, no funciona ningun evento sobre él, pero si funcionan los eventos del objeto de la linea.

En cuanto el problema del evento OnMouseMove, al ser con lìneas horizontales o verticales la opcion que me das es muy buena. El problema es que pràcticamente las lineas que tengo que trazar todas son oblicuas, es decir, por ejemplo trazo una línea

MoveTo(0,0)
LineTo (100,100)

el recuadro que me crea el objeto es de 100*100 y yo necesito que los eventos se disparen cuando se pase o se haga click sobre la linea, no sobre este recuadro, la razon esque tengo muchos componentes para unir a travès de muchas líneas. y Además este recuadro me inhabilita los componentes que ya estaban y estan detras de él.

En otras palabras me gustaría saber como con el metodo paint o con otro metodo de otro objeto lograría que el área sobre el cual se disparan los eventos no sea un recuadro con ancho y alto sino, como en el ejemplo que doy con la línea, el área sea demarcada por líneas que estan dibujadas.

Andres si me puede prestar ayuda le agradecere infinitamente
y si alguien mas lee este mensaje y me puede sacar de este aprieto
;) ;) ;) Muchas gracias

andres1569
25-06-2003, 23:54:28
La funcionalidad que pides, eso de que detecte si se pulsa sobre la línea inclinada, es más propio de un componente de gráficos.

Alguna vez también he echado en falta un componente TLinea que permita esa funcionalidad, pero Delphi no lo trae de fábrica, quizás mirando en alguna página de componentes halles uno que haga eso.

Mira en Delphi Super Page: http://delphi.icm.edu.pl/

o en http://www.delphi32.com/

o en http://www.vclcomponents.com

o en las efg's

http://homepages.borland.com/efg2lab/Library/Delphi/Graphics/index.html

delphi.com.ar
26-06-2003, 00:13:10
Hola Majo, te cuento lo que yo he hecho cuando hice algo parecido a lo que vos querés hacer, por cada "pseudo-objeto" creado sobre el GraphicControl control creo una Región y la mantengo en una colección ordenado por lo que sería el ZOrder, no es ninguna idea revolucionaria, es lo que hace Windows con sus ventanas. Entonces cuando se mueve el mouse lo que hago es recorrer esta colección y ver si el mouse se encuentra sobre alguno de mis objetos.

Saludos!

delphi.com.ar
26-06-2003, 00:31:12
Aquí te he subido un ejemplo de un componente para cargar Audiometrías que esta hecho de esta manera, lamento no poder pasarte los fuentes, pero si te sirve la metodología podemos seguir "investigando".

http://www.geocities.com/delphi_com_ar/audiometria/index.html

Saludos!

Majo
26-06-2003, 17:48:16
Acerca de ese ejemplo que subiste.... es gran parte de lo que necesito, agradezco tu atención. De todas maneras voy a seguir buscando, en realidad necesito las fuentes.... es para mi trabajo de grado.... estudio ingeniería eléctrica y estoy haciendo un simulador de flujos de carga. Es algo así como armar un circuito eléctrico en tiempo de ejecución y darle solución.

Gracias por su colaboración... reitero... en lo que puedan ayudarme... muchas gracias ;)

madriles
26-06-2003, 21:16:58
bueno no se si te servira mi idea y si es eso lo que quieres, pero trabajando con el canvas del objeto y aprovechando la propiedad color puedes hacer, creo, lo que quieres. he hecho una pequeña demostracion. pones un boton en un form y el codigo siguiente
pruebalo a ver si es lo que quieres o por lo menos te da una idea

procedure TForm1.Button1Click(Sender: TObject);
begin
self.Canvas.Pen.Color:=$FF0080;
self.Canvas.LineTo(50,50);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if (IntToHex(self.Canvas.Pixels[x,y],1)) = 'FF0080' then
begin
self.Cursor:=crHandPoint;
end
else
self.Cursor:=crDefault;
end;

delphi.com.ar
26-06-2003, 21:56:19
Bueno, me voy a extender un poco mas en como esta hecho ese programita:

Cada objeto X o O, que son los "dibujos" en cuestión, para mi son items de la colección que te nombré anteriormente, esta colección tiene un método Paint, que es donde se dibuja y una propiedad Region que es donde guarda el Handle de la región creada (HRGN) y las propiedades de la posición del objeto. Cuando se dibuja el objeto, se crea la región de la forma del objeto, si anteriormente tenía una región la libera y luego crea la nueva. Para crear y dibujar las regiones utilizo las de que puedes leer en el capítulo Regions del win32.hlp.
La implementación de esto es sencilla, en el MouseMove de componente voy recorriendo todas las regiones de la colección, preguntando si el cursor está sobre el ítem y dibujo el ítem seleccionado con otro color, luego todos los otros eventos del mouse se tratan del mismo modo.

Te recomiendo que investigues estos temas, y cualquier duda consultes.

Saludos!

Majo
27-06-2003, 20:30:05
:) :)

Voy a ponerme en la tarea de consultar tus consejos.... de seguro esto acerca de las regiones me va a servir bastante

Solo espero comprender bien el tema, y si tengo alguna duda espero puedas ayudarme.

Gracias a todos por sus aportes :) :) :)

Madriles Tu idea no me resolvió el problema pero me dió una idea para resolver otro que ya tenía.. te lo agradezco;) ;)

Majo
05-07-2003, 19:23:41
Lei acerca de regiones en win32.hlp como me dijiste; ya tengo claro esto. Pero tengo varias dudas acerca de la implementación:

Primero no se como acceder a estas funciones (como por ejemplo la de crear y llenar las regiones, entre otras).

estas funciones donde las tengo que utilizar?. En el código de mi pseudo-objeto? o en el código donde hago llamada a mi pseudo-objeto?

No tengo bien entendido lo de crear una colección que tenga el método paint y la propiedad región (esta colección la creo yo? o ya existe el delphi?).Lo que te entiendo por colección ordenada es el orden en que los Pseudo-objetos se sobreponen uno al otro.

acerca del método paint y la propiedad región que nombraste, dijiste que son parte de la colección ordenada que se supongo se debe crear. Acerca de esta colección ordenada, de que tipo deben ser sus elementos? y si esta propiedad y evento las debo crear yo, de que tipo las debo crear?.

En realidad no tengo idea de como hacer que una región creada tome la forma de mi pseudo-objeto o visceversa.

Perdonarás mi ignorancia y la cantidad de incognitas que tengo, pero la verdad es que soy muy nuevo en delphi. Me gusta la programación, sin embargo, mi experiencia en ella, por lo que veo, es escasa.

Gracias por su atención, espero puedan ayudarme

hgiacobone
03-09-2003, 21:20:49
Posteado originalmente por Majo
Lei acerca de regiones en win32.hlp como me dijiste; ya tengo claro esto. Pero tengo varias dudas acerca de la implementación:
Primero...


Eso, eso... yo también quiereo saber lo mismo.

Majo
04-09-2003, 05:49:41
He aprendido algo acerca de regiones y la forma de utilizarlas en delphi... la verdad no es tan dificil.... solo se trata de clarificar algunos tipos de variables....si deseas saber algo específico, pregúntalo! que en lo que pueda ayudarte lo haré.

No soy un experto..... también estoy aprendiendo... y con los aportes de todos... seguro aprenderemos más... Suerte :D :D

hgiacobone
04-09-2003, 16:07:18
Posteado originalmente por Majo
....si deseas saber algo específico, pregúntalo! que en lo que pueda ayudarte lo haré.
Seguro amigo Majo por ello te recomiendo (para no explicar todo el tema nuevamente) que veas mi hilo en:
http://www.clubdelphi.com/foros/showthread.php?s=&threadid=3325
PD: Yo llegué a este hilo gracias a delphi.com.ar y ahora los redirecciono otra vez a mio :)