Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Programa Grafico (https://www.clubdelphi.com/foros/showthread.php?t=19257)

buitrago_listas 09-03-2005 03:51:29

Programa Grafico
 
Necesito confeccionar un programa que me permita colocar objetos en un plano, es más, es para salones de actividades, pero el cliente quiere que se haga graficamente, con objetos, que yo los pinche y los ponga a guusto en un plano, como colocamos los componente en delphi.

¿ Alquien sabe donde encontrar un ejemplo o documentación al respecto ?

Saludos

Fer

roman 09-03-2005 06:30:33

Puedes implementar algo sencillo y funcional aunque quizá no muy vistoso con objetos TShape (paleta "Additional") (cuadrados, rectángulos, círculos y elipses).

Para moverlos pones su propiedad DragMode en dmAutomatic y manejas los eventos OnDragOver y OnDragDrop del objeto sobre el cual coloques las figuras, por ejemplo, un panel.

Aquí te pongo un ejemplo completo:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Superficie: TPanel;
    Mesa: TShape;
    Silla: TShape;

    procedure SuperficieDragOver(
      Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);

    procedure SuperficieDragDrop(
      Sender, Source: TObject; X, Y: Integer);

    procedure ObjetoStartDrag(
      Sender: TObject; var DragObject: TDragObject);

  private
    Ancla: TPoint;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SuperficieDragOver(
  Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := Source is TShape;
end;

procedure TForm1.SuperficieDragDrop(
  Sender, Source: TObject; X, Y: Integer);
begin
  with Source as TShape do
  begin
    Left := X - Ancla.X;
    Top := Y - Ancla.Y;
  end;
end;

procedure TForm1.ObjetoStartDrag(
  Sender: TObject;
  var DragObject: TDragObject);
begin
  Ancla := (Sender as TShape).ScreenToClient(Mouse.CursorPos);
end;

end.

Asocia los eventos SuperficieDragOver y SuperficieDragDrop al panel Superficie y el evento ObjetoStartDrag a los Shape Mesa y Silla (estos deben estar dentro del panel y con su propiedad DragMode en dmAutomatic).

La variable Ancla que se inicializa en el evento OnStartDrag es para saber la posición relativa de la esquina superior izquierda del objeto respecto del punto desde donde se toma el objeto y así colocarlo correctamente al terminar de arrastrarlo.

Como te digo, no es muy vistoso pero bueno para algo esquemático en el que baste indicar los distintos objetos reales con figuras simples (puedes variar su color y pintarlo parejos o con rayitas).

Algo más sofisticado con la misma idea puedes lograrlo usando objetos TImage en lugar de TShape cargándolos con las imágenes que desees.

EDITO:

Amplío un poco la explicación. Los eventos OnDragOver y OnDragDrop los recibe el objeto sobre el cual se arrastran otros. OnDragOver sirve para que el objeto destino (Sender) determine si va a aceptar o no al objeto móvil (Source) y ajuste el parámetro Accept según el caso (en el ejemplo, el panel acepta al objeto móvil sólo si éste es un TShape). El evento OnDragDrop ocurre una vez que se suelta el objeto. En el ejemplo lo aprovechamos para ajustar las propiedades Left y Top del Shape (Source) para que efectivamente se mueva.

// Saludos

buitrago_listas 10-03-2005 02:42:40

Muchas gracias
 
de veras, ahora es la hora de ver si puedo ponerlo a andar
Gracias
Fer

ASAPLTDA 10-03-2005 03:50:15

Componentes en tiempo de ejecucion Ampliar Porfa
 
Ramon lei como colocar los componentes en el panel y me parece fantastico la forma de hacerlo, ahora como guardo la informacion en uba base de datos y como la recupero? disculpa molestarte pero me parecio una solucion buenisima :rolleyes:

Lepe 10-03-2005 13:34:07

Suponiendo que el nº de objetos es fijo y definido anteriormente:

Código Delphi [-]
Var T : Tshape;
begin
for i:=0 to Form1.ComponentCount -1 do
 if Form1.Components[i] is TShape then
 begin
    T := Tshape(Form1.components[i];
    CampoNombre.asstring := T.Name;
    CampoLeft.asInteger := T.Left;
 end;

Creo que es autoexplicativo el codigo,ya sabes ;).

Saludos


La franja horaria es GMT +2. Ahora son las 13:52:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi