PDA

Ver la Versión Completa : Algo complicado.... Creo...


craven
14-05-2003, 19:58:39
Hola de nuevo amigos. Tengo una dudilla acerca de cómo hacer una cosa, a ver si podeis ayudarme. Intentaré explicarme lo mas claro posible.
En el programa que estoy haciendo tengo dos ventanas, podemos decir que una de ellas es la principal y la otra una ventana de información. Pues bien, el programa permite crear objetos de un determinado tipo, por ejemplo, cuadrados en 2D, y quiero visualizarlos en la ventana de información. Hasta ahi todo bien, no tengo ningún problema con esto. El problema surge debido a mi deseo de que dichos dibujos de la ventana de información, cada uno independientemente de los demas, responda a eventos del ratón; es decir, si he creado 3 cuadrados, en la ventana de información habrá 3 cuadrados dibujados y yo puedo pinchar sobre cada uno de ellos y moverlos a mi antojo. ¿Cómo podría hacer esto? Si no hay una forma simple de hacerlo, a ver si podeis orientarme. Gracias de antemano. Un saludo.

delphi.com.ar
15-05-2003, 01:56:39
Hace mucho yo hice algo con una funcionalidad similar a lo que vos querés hacer, se trataba de un editor de consultas donde sobre un panel, que era una clase propia, iban tirando tablas de modo drag and drop, y establecían las relaciones entre estas, con el drag and drop de los campos. Como no puedo pasarte los fuentes, porque pertenecen a la empresa para la que trabajo, te voy a contar como lo hice:

El panel contenedor era una clase propia, que tenía todos los métodos de “brodcast” para todos los objetos contenidos. Las tablas y otros objetos, heredaban de una clase que heredaba de un TCustomPanel, estas clases exigían tener como Parent un componente del tipo del “contenedor”.y en los eventos MouseDown, MouseMove, MouseUp, se encontraba la lógica para que se muevan dentro del contenedor. Para las líneas de las relaciones entre las tablas, manejaba regiones irregulares para saber cuando el ratón estaban sobre la línea, creo que lo vas a tener que hacer para tus figuras.

Bueno, eso fue solo una intro, si te interesa, porque se asemeja a lo que querés hacer, te puedo dar una mano. Lamento no poder pasarte los fuentes, pero de a partecitas todo es posible.
Te cuento que todo esto lo hice, con casi sin conocimientos del lenguaje, así que muy difícil no creo que sea.

Saludos!

andres1569
15-05-2003, 02:46:26
Hola:

Si sólo son cuadraditos lo que quieres mostrar, puedes hacer uso de los TShape, interceptas los eventos del Mouse (OnMouseDown OnMouseMove y OnMopuseUp) para conseguir tu objetivo. Aquí va un ejemplo del código que acabo de probar, debes enlazar todos los Shapes a estos eventos:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
IniP, IniPos : TPoint;
Pressed : Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with TShape(Sender) do
begin
IniP := ClientToScreen (Point(X, Y));
IniPos := Point (Left, Top);
end;
Pressed := TRUE;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
P : TPoint;
begin
if Pressed then
with TShape(Sender) do
begin
P := ClientToScreen (Point(X, Y));
Left := IniPos.X + P.X - IniP.X;
Top := IniPos.Y + P.Y - IniP.Y;
end;
end;

procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Pressed := FALSE;
end;

end.


A ver si te sirve