Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-03-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
Hola neftali, primero pedir disculpas si he abierto demasiados post distintos (pense que aunque todas mis dudas estan encaminadas hacia la misma aplicacion, cada una de ellas se centra en algo distinto ,drag and drog, dibujado de lineas seleccionables y modificables... y para alguien que tenga una duda en concreto sobre alguno de estos temas es mas facil de encontrar un post especifico de ello, no uno generico, en el que por el titulo del tema es dificil de averiguar de que temas se estan tratando).

Segundo darte las gracias por tu atencion y tu ayuda.

Miré por enciima el componente TsimpleGraph, pero la verdad que me asuste un poco, ya que a priori me parecio muy dificil de entender y de usar. Pero creo que voy a dedicarle desde ahora un tiempo a comprenderlo y a hacer pruebas con el.

La aplicacion que quiero desarrollar es muy similar a esta http://www.symetrixaudio.com/repository/snd_v801.exe.
Si alguien fuera capaz de echarle un ojo y decirme que rumbo deberia tomar para realizar algo asi, le estaria muy agradecido, ya que soy muy nuevo con delphi y ando aun algo (por no decir) muy perdido.
Responder Con Cita
  #2  
Antiguo 13-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por astwin Ver Mensaje
Miré por enciima el componente TsimpleGraph, pero la verdad que me asuste un poco, ya que a priori me parecio muy dificil de entender y de usar. Pero creo que voy a dedicarle desde ahora un tiempo a comprenderlo y a hacer pruebas con el.

La aplicacion que quiero desarrollar es muy similar a esta http://www.symetrixaudio.com/repository/snd_v801.exe.
Si alguien fuera capaz de echarle un ojo y decirme que rumbo deberia tomar para realizar algo asi, le estaria muy agradecido, ya que soy muy nuevo con delphi y ando aun algo (por no decir) muy perdido.
Hola astwin.
La verdad es que parece una contradicción. Quieres hacer un programa similar al que me propones, pero un simple componente que te facilitaría el trabajo (no te lo hará por completo) ya te parece difícil de usar y de entender. ?¿?¿?
No quiero desanimarte ni mucho menos, es un buen reto a afrontar, pero debes pensar que ese componentes es sólo una herramienta que te permitará realizar de forma más sencilla ese programa. Deberás entenderla y modificarla si quieres usarla.
Si no quieres o puedes usarla (esta u otra similar), creo que aun la cosa se torna más negra, ya que la mayoría de cosas de las que hace ese componente deberás programarlas tú.

Un componente como SimpleGraph o algun otro similar que hay ya te proveen de lo siguiente:

(1) En primer lugar de la más básico de un programa como este; Tu espacio de trabajo; La "hoja/papel" sobre el que posicionas los componentes. No es poco, ya que ese simple espacio posee muchos métodos; Todos los de movimiento (pan) y zoom; Todos los de tratamiento de los objetos; Añadir, eliminar, guardar, imprimir, exportar; Te gestiona la selección/multiselección de objetos. Te provee los métodos para recorrer los objetos y sus diferentes tipos; Gestión del Grid, bloqueo de objetos,...
A priori tal vez no lo has pensado, pero en un programa de este estilo todo eso antes o después es necesario.

(2) En segundo lugar te provee de los objetos. SimpleGraph posee programados los objetos básicos; Rectángulos, círculos, líneas,... Tu trabajo será extender esos objetos (derivarlos) para conseguir los que tú necesitas. Al igual que el punto anterior, eso no es poco. No son simple objetos, sino que ya tienen programados muchos métodos y propiedades que te harán falta. Selección, redimensionado, Añadir texto a los objetos, gestionar marcas de lección, pintado, Brush,... Para el tema de los links entre objetos también tines algo hecho, ya que programa deterinada lógica para "enganchar" diferentes objetos.



A partir de ahí posiblemente tengas que programar el comportamiento que se ve en el ejemplo de "unir" bloques por determinados puntos.

Como ya he dicho, no me parece algo trivial, ni sencillo. Creo (y yo lo haría así) que para centrarte en la funcionalidad del programa debes usar algun componente que te evite perder tiempo y esfuerzo en cosas que a priori paracen superfluas (como las que te he comentado).

Un saludo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 13-03-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
Hola, no es que no quiera usarlo. Soy muy nuevo en esto de Delphi, y cuando me lo propusiste y empece a intentar entenderlo, pues claro, se me hizo un mundo. Consideré mas adecuado empezar a realizar una version muy simplificada por mi cuenta y asi poder coger soltura y aprender mucho mas. Ten en cuenta que partia casi de cero y enfrentarse asi a un componente asi de potente, pues daba impresion. Ahora creo que ya tengo muchos mas conceptos claros y que soy capaz de enfrentarme a la comprension, utilizacion y ampliacion de este componente. Desde ya me pondré con el. Espero no haber sido muy pesado y agradecerte toda la ayuda y consejos que me estas brindando.
Un saludo.
Responder Con Cita
  #4  
Antiguo 23-03-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
Hola, ya me he puesto a fondo con TsimpleGraph. Voy poco a poco comprendiendo como funciona.

El problema que tengo es que el linkado entre objetos se realiza mediante lineas que parten desde el centro del objeto, no pudiendose definir un punto fijo del objeto para linkarlo a otros.

Mi solucion ha sido crear cada bloque como un rectangulo, y las entradas y salidas tambien como rectangulos mas pequeños. El problema ahora lo tngo a la hora de mover el bloque grande, que no se como hacer que se puedan mover a la vez los pequeños (ademas el bloque grande esta alineado a la cuadricula y los pequeños no). Haber si alguien puede echarme un cable.

Código Delphi [-]
type
  // Rectangulo que servirá como entrada
  TGraphIn=class(TRectangularNode)
    public
      procedure init();
  end;
  // Rectangulo que servirá como salida
  TGraphOut=class(TRectangularNode)
      procedure init();
  end;
  // Rectangulo que será el cuerpo del bloque
  TGraphBlock=class(TRectangularNode)
    public
      nIn,nOut: integer ; //numero de entradas y de salidas
      vIn: array of TGraphNode;
      vOut: array of TGraphNode;
      IOHeigth: Integer;
      //GraphIORadious: integer; // Altura de las entradas y salidas
      InSelected:integer;
      OutSelected:integer;
      procedure init();
      //function QueryHitTest(const Pt: TPoint): DWORD; override;
      //procedure Draw(Canvas: TCanvas); override;
      //procedure MouseDown(Button: TMouseButton; Shift: TShiftState; const Pt: TPoint);override;
   end;

Type
  TGraphLine=class(TGraphLink)

  end;

const
  // ForEachObject Actions
  FEO_DesactiveIO             = 00;


implementation
uses
  unit1,unit2;





procedure TGraphBlock.init();
var
  I: Integer;
  inc: Integer;
  bound:Trect;
  pt: Tpoint;
begin
  // Opciones del nodo;
  self.NodeOptions:=[gnoMovable,gnoShowBackGround];
  // Imagen del nodo;
  self.Background.LoadFromFile('./images/sos.jpg');
  // Numero de entradas / salidas
    self.Nin:=3;   self.NOut:=4;
  // Creamos las entradas / salidas graficas
  self.IOHeigth:=8;
  setlength(vIn,nIn);
  setlength(vOut,nOut);
    // Entradas
    inc:=trunc((self.height-NIn*IOHeigth)/(Nin+1)); // Espacio entre entradas
    for I := 0 to nIn - 1 do
    begin
      pt.X:=left; pt.y:= Top+(i+1)*inc+i*IOHeigth;
      bound:= Rect(pt, Point(pt.X+IOHeigth, pt.Y+IOHeigth));
      form2.simpleGraph1.SnapToGrid:=False;
      vIn[i]:=form2.simpleGraph1.InsertNode(bound,TGraphIn);
      form2.simpleGraph1.SnapToGrid:=True;
      TGraphIn(vIn[i]).init;
    end;
    // Entradas
    inc:=trunc((self.height-NOut*IOHeigth)/(NOut+1)); // Espacio entre entradas
    for I := 0 to nOut - 1 do
    begin
      pt.X:=left+width-IOHeigth; pt.y:= Top+(i+1)*inc+i*IOHeigth;
      bound:= Rect(pt, Point(pt.X+IOHeigth, pt.Y+IOHeigth));
      form2.simpleGraph1.SnapToGrid:=False;
      vOut[i]:=form2.simpleGraph1.InsertNode(bound,TGraphIn);
      form2.simpleGraph1.SnapToGrid:=True;
      TGraphIn(vOut[i]).init;
    end;

  self.InSelected:=-1;
  self.OutSelected:=-1;
end;

procedure TGraphIn.init;
begin
  NodeOptions:=[gnoShowBackGround];
end;

procedure TGraphOut.init;
begin
  NodeOptions:=[gnoShowBackGround];
end;
Responder Con Cita
  #5  
Antiguo 23-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por astwin Ver Mensaje
Mi solucion ha sido crear cada bloque como un rectangulo, y las entradas y salidas tambien como rectangulos mas pequeños. El problema ahora lo tngo a la hora de mover el bloque grande, que no se como hacer que se puedan mover a la vez los pequeños (ademas el bloque grande esta alineado a la cuadricula y los pequeños no). Haber si alguien puede echarme un cable.
Me parece una buena solución. Si fuera mi caso posiblemente hubiera optado por la misma, ya que los puntos de entrada debes comportarse como elementos individuales, aunque en que los contenga sea el bloque externo.

Para el tema de movimiento, lo que hago yo, es detectar el movimiento del bloque exterior y "mover al mismo tiempo los bloques interiores". En tu caso, tú sabes en qué posición está cada entrada/salida, por lo tanto cuando mueves el bloque exterior lo único que debes hacer el aplicar ese mismo desplazamiento a los bloques interiores.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 23-03-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
el problema es que no comprendo muy bien desde que funcion puedo sobreescribir del bloque 'grande' para que las entradas y salidas sigan el movimiento. mousemove, begindrag,... vamos, que no me aclaro muy bien como hacerlo. Haber si puedes orientarme.
Responder Con Cita
  #7  
Antiguo 23-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.437
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Para que te hagas una idea de cómo lo hago yo...

Código Delphi [-]
procedure TLeyendaNode.DrawBody(Canvas: TCanvas);
var
  i:Integer;
  obj:TGraphNode;
  _MinWidth:Integer;
begin
  inherited;

  // controlar el estado
  if (Self.State = osDestroying) then begin
    Exit;
  end;

  //- Owner.BeginUpdate;
  // proteccion
  try

    // AutoDimensionar
    if (FAutoSizeHeight) then begin
      Self.Height := DEFAULT_HEIGHT_TITLE +
                  (FTextNodes.Count * DEFAULT_HEIGHT_ELEMENT) +
                  (DEFAULT_HEIGHT_ELEMENT DIV 2);
      // Objeto en sí
      Self.Width := Max(Self.Width, DEFAULT_HEIGHT_ELEMENT);
    end;

    _MinWidth := 0;


    // Recolocar
    for i := 0 to (FTextNodes.Count - 1) do begin
      // Cuadro de color
      obj := TGraphNode(FColorNodes.Objects[i]);
      obj.OwnerNode := Self;
      obj.Left := Self.Left + LEFT_SPACE;
      obj.Top := Self.Top + DEFAULT_HEIGHT_TITLE + (DEFAULT_HEIGHT_ELEMENT * i);
      obj.Width := DEFAULT_HEIGHT_ELEMENT;
      obj.Height := DEFAULT_HEIGHT_ELEMENT - 1;
      obj.Brush.Color := StrToInt(FColorNodes.Strings[i]);
      obj.Pen.Color := clGray;
      obj.CanSelect := False;

      // Texto
      obj := TGraphNode(FTextNodes.Objects[i]);
      obj.Left := Self.Left + LEFT_SPACE + DEFAULT_HEIGHT_ELEMENT + LEFT_SPACE;
      obj.Top := Self.Top + DEFAULT_HEIGHT_TITLE + (DEFAULT_HEIGHT_ELEMENT * i);
      obj.Width := Self.Width - LEFT_SPACE - DEFAULT_HEIGHT_ELEMENT - LEFT_SPACE -
                   (SOMBRA_WIDTH * 2);
      obj.Height := DEFAULT_HEIGHT_ELEMENT;
      obj.Alignment := taLeftJustify    ;
      obj.Text := FTextNodes.Strings[i];

      _MinWidth := Max(_MinWidth, Canvas.TextWidth(obj.Text) + (LEFT_SPACE * 2));

      obj.Pen.Style := psClear;
      obj.CanSelect := False;
    end;

    // No asignado?
    if not Assigned(FTitleNode) then begin
      // Crear el título
      FTitleNode := Owner.InsertNode(nil, TEtiquetaNode{TRectangularNode});
      FTitleNode.OwnerNode := Self;
      FTitleNode.Visible := Self.Visible;
      FTitleNode.Top := Top;
      FTitleNode.Left := Left;
      FTitleNode.Height := DEFAULT_HEIGHT_ELEMENT - (SOMBRA_WIDTH * 2);
      FTitleNode.Width := Width;
      FTitleNode.CanSelect := False;
      FTitleNode.BringToFront;

      FTitleNode.Selected := False;
      FTitleNode.CanSelect := False;
      FTitleNode.Font.Style := FTitleNode.Font.Style + [fsBold];
    end;

    // Titulo
    FTitleNode.Top := Top + 1;
    FTitleNode.Left := Left + (DEFAULT_HEIGHT_ELEMENT div 2);
    FTitleNode.Width := Width - SOMBRA_WIDTH - DEFAULT_HEIGHT_ELEMENT;
    FTitleNode.Text := FTitle;
    FTitleNode.Font.Color := clBlack;

    _MinWidth := Max(_MinWidth, Canvas.TextWidth(FTitleNode.Text) +
                 (DEFAULT_HEIGHT_ELEMENT * 2));


    // AutoDimensionar
    if (FAutoSizeWidth) then begin
      // Objeto en sí
      Self.Width := Max(_MinWidth, DEFAULT_HEIGHT_ELEMENT);
    end;

  finally
    //- Owner.EndUpdate;
  end;
end;

Es un objeto que correspomde a un cuadro de leyenda.



Como ves es un objeto al que se le pasan un número de elementos (Texto + Color); Al mover la leyenda se posicionan de nuevo los elementos interiores.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Generar bloques de números Natasha Nortman Varios 8 30-03-2008 15:47:54
Esquemas de bloques david.rguez Gráficos 1 01-09-2007 00:05:01
Ligado / Interconexión de dos BD/Sesiones _Willa Firebird e Interbase 11 28-06-2007 14:47:02
Bloques De Numeros Consecutivos dany2006 C++ Builder 5 15-11-2006 21:06:16
Interconexión de aplicaciones... adlfv OOP 1 12-08-2005 17:03:02


La franja horaria es GMT +2. Ahora son las 01:34:33.


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
Copyright 1996-2007 Club Delphi