Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
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
  #2  
Antiguo 23-03-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
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
  #3  
Antiguo 23-03-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
Muchisimas gracias neftali, gracias a tu ayuda ya lo he conseguido hacer. Te tas ganando unas cuantas cervecillas . Muchas gracias. Espero no ser muy pesao.
Responder Con Cita
  #4  
Antiguo 08-04-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
Hola,
gracias al componente TsimpleGraph tengo el trabajo muy adelantado. Ya consigo linkar bloques con lineas, que estas conexiones de forma gráfica se traduzcan en una serie de estructuras y clases con las que realizar diversas tareas, etc.. Muchas gracias Neftali por sugerirmelo. Ahora estoy liado con el tema de copiar/cortar/pegar.

No me aclaro muy bien con el funcionamiento de esta funcionalidad en simplegraph.

Como ya postee anteriormente, para realizar el bloque cree una clase que hereda de Trectangularnode. Las entradas y salidas las cree mediante otra clase que hereda de Trectangularnode y se encuentran en una lista definida dentro de la clase de bloque. Decir además, que le he añadido en la variable 'data' referencias hacia otras clases, que no tienen nada que ver con la parte grafica.

Ahora para copiar y pegar un bloque no tengo ni idea de como proceder.

Código Delphi [-]
procedure TMainForm.EditCopyUpdate(Sender: TObject);
begin
  EditCopy.Enabled :=(SimpleGraph.SelectedObjects.Count > 0);
end;

procedure TMainForm.EditCopyExecute(Sender: TObject);
begin
  SimpleGraph.CopyToClipboard(True);
end;

procedure TMainForm.EditPasteUpdate(Sender: TObject);
begin
  EditPaste.Enabled := not IsReadonly and Clipboard.HasFormat(CF_SIMPLEGRAPH);
end;

procedure TMainForm.EditPasteExecute(Sender: TObject);
begin
  SimpleGraph.PasteFromClipboard;
end;

Este es el codigo de copiar y pegar que he observado en la demo del simpleGraph. Pero cuando selecciono un bloque grafico, lo copio y lo pego, al pegarlo me da error. Alguien puede orientarme un poco, si debo sobreescribir alguna funcion en mi clase de bloque para que se copie bien al portatapeles o que debo hacer o mirar.

Un saludo.
Responder Con Cita
  #5  
Antiguo 08-04-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
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
Este es el codigo de copiar y pegar que he observado en la demo del simpleGraph. Pero cuando selecciono un bloque grafico, lo copio y lo pego, al pegarlo me da error. Alguien puede orientarme un poco, si debo sobreescribir alguna funcion en mi clase de bloque para que se copie bien al portatapeles o que debo hacer o mirar.

Supongo que SimpleGraph implementa esos métodos, así como un formato nuevo del Clipboard. Al hacer el pegar debe crear los nuevos objetos.
¿Sabes en qué punto está fallando?
¿Lo has "debuggado" paso a paso?

La verdad es que esta funcionalidad no la he utilizado nunca.
__________________
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 15-04-2009
astwin astwin is offline
Miembro
 
Registrado: feb 2009
Posts: 21
Poder: 0
astwin Va por buen camino
ya tengo arreglado lo de copiar y pegar. Al final he pasado de la funcionalidad del simplegraph y lo he realizado por mi cuenta, creando un objeto nuevo del mismo tipo que el que copie y luego copiando todas las propiedades.

Ahora tengo otro problemilla. El programa ejemplo para linkar dos nodos, tienes que pinxar sobre uno de ellos y sin soltar arrastrar hacia el otro. Yo quisiera realizarlo haciendo click sobre el primero, que la linea siguiera el raton, si haces click en cualquier sitio del canvas se añada un breakpoint y cuando hagas click sobre otro nodo se acabe la edicion de la linea, teniendo los dos nodos linkados. Toy tudiando el codigo, pero no encuentro como poder hacerlo. Neftali, haber si me puedes aconsejar algo. muxisimas gracias.
Responder Con Cita
  #7  
Antiguo 15-04-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
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
El programa ejemplo para linkar dos nodos, tienes que pinxar sobre uno de ellos y sin soltar arrastrar hacia el otro. Yo quisiera realizarlo haciendo click sobre el primero, que la linea siguiera el raton, si haces click en cualquier sitio del canvas se añada un breakpoint y cuando hagas click sobre otro nodo se acabe la edicion de la linea, teniendo los dos nodos linkados.
Ahora mismo no tengo el código a mano, pero seguramente deberás utilizar los Links del propio SimpleGraph o un objeto similar/derivado.

Revisa los métodos de ratón del simpleGraph. El el MouseUp verás que se trabaja en base al CommandMode (al menos en la versión actual que yo tengo). Algunos de los valores que admite esta propiedad son referentes a los Links; Creo que modificando el comportamiento de ese procedimiento (y los relacionados -MouseUp y MouseMove-) podrás hacer lo que necesitas.

La idea es que si sueltas/pulsas el botón sobre un lugar dnde no hay ningun objeto se añada un nuevo punto al link actual. Cosa que en los links estandard se hace a posteriori.

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
Respuesta



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 11:43:09.


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