Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-04-2019
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Grabar y recuperar imagen de Simplegraph

Hola.

Este mensaje es una petición dirigida principalmente a Neftali, Germán. Aún así, cualquier aportación de otra persona sería bienvenida.

Buscando información sobre el componente Simplegraph, que lo utilizo en un programa que estoy haciendo, encontré este comentario tuyo:

Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
(2) En mi caso lo que hago es olvidarme del formato que trae para guardar en fichero. Al salir recorro todos los objetos creados "dentro" de éste componente y almaceno en Base de Datos sus características (posicion, color, Tipo,...). Al recuperar el diseño hago el paso contrario.
y en este comentario dices que grabas la información de los gráficos de Simplegraph sin basarte en las opciones que ofrece el componente.

Me interesaría conocer la forma en que lo haces, ¿Sería posible que mostraras un pequeño ejemplo acerca de cómo lo haces al grabar y al leer la información del gráfico?.

El enlace en el que aparece este texto citado está en el comentario #5 en: https://www.clubdelphi.com/foros/sho...ht=simplegraph

Uso Delphi 7 en Windows 7.

Muchas gracias de antemano.

Saludos.
Responder Con Cita
  #2  
Antiguo 30-04-2019
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.279
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
Bueno la idea es sencilla.
SimpleGraph te da opciones de recorrer los objetos y acceder a todas sus propiedades y también te da opciones por código para crear nuevos elementos.

La idea es que al guardar, puedas recorrer los objetos que existen en el grafo y sus propiedades y almacenarlas en una tabla (posición, colores,...). En mi caso almacenaba sólo algunas porque los objetos eran siempre del mismo tiupo y con algunas variaciones.

Para recuperar
, debes realizar el caso contrario. Recorrer la tabla e ir creando objetos dinámicamente según las propiedades almacenadas.

Te adjunto un código sencillo que funciona para que cojas la idea de cómo hacerlo.


Código Delphi [-]

procedure TMainForm.btnGrabarClick(Sender: TObject);
var
  i, oc:Integer;
  o:TGraphObject;
  FIni:TIniFile;
begin

  // Crear un  INI
  FIni := TIniFile.CReate(ChangeFileExt(Application.ExeName, '.ini'));
  try
    oc := SimpleGraph.ObjectsCount;
    // Recorrer los objetos creados en el grafo
    for I := 0 to (SimpleGraph.Objects.Count - 1) do begin
      o := SimpleGraph.Objects.Items[i];
      // Es un nodo
      if (o is TGraphNode) then begin
        // Acceder à la clase
        FIni.WriteString('OBJ'+IntToStr(i), 'Clase', TGraphNode(o).ClassName);
        // posicion del objeto
        FIni.WriteString('OBJ'+IntToStr(i), 'Left', IntToStr(TGraphNode(o).Left));
        FIni.WriteString('OBJ'+IntToStr(i), 'Top', IntToStr(TGraphNode(o).Top));
        FIni.WriteString('OBJ'+IntToStr(i), 'Ancho', IntToStr(TGraphNode(o).Width));
        FIni.WriteString('OBJ'+IntToStr(i), 'Alto', IntToStr(TGraphNode(o).Height));
        // Color de fondo
        FIni.WriteString('OBJ'+IntToStr(i), 'Color', IntToStr(TGraphNode(o).Brush.Color));
        // ...

      end;
    end;
  finally
    FreeAndNil(FIni);
  end;
end;

procedure TMainForm.btnRecuperarClick(Sender: TObject);
var
  i, oc:Integer;
  o:TGraphObject;
  FIni:TIniFile;
  secc:TStringList;
  str:String;
  Rect:TRect;

  // Obtener la clase del Nodo
  function GetNodeClass(AClass:string):TGraphNodeClass;
  begin
    if (AClass = 'TRectangularNode') then
      Result := TRectangularNode;
  end;

begin

  // Commando por defecto
  SimpleGraph.CommandMode := cmInsertNode;
  // Fichero de objetos
  FIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  secc := TStringList.CReate;
  try
    // Leer la lista de nodos a crear
    FIni.ReadSections(secc);
    // Recorerr los nodos a crear
    for i := 0 to (secc.Count - 1) do begin
      // Clase del nodo
      Str := FIni.ReadString('OBJ' + IntToStr(i), 'Clase', 'TRectangularNode');
      // Definir la clase
      SimpleGraph.DefaultNodeClass := GetNodeClass(Str);
      // Posicion del objeto
      Rect.Left := FIni.ReadInteger('OBJ' + IntToStr(i), 'Left', 10);
      Rect.Top := FIni.ReadInteger('OBJ' + IntToStr(i), 'Top', 10);
      Rect.Width := FIni.ReadInteger('OBJ' + IntToStr(i), 'Ancho', 100);
      Rect.Height := FIni.ReadInteger('OBJ' + IntToStr(i), 'Alto', 50);
      // Crear el nodo
      o := SimpleGraph.InsertNode(Rect);
      // color de fondo..
      TGraphNode(o).Brush.Color := FIni.ReadInteger('OBJ' + IntToStr(i), 'Color', 0);
      // Otras propiedades...
    end;
  finally
    FreeAndNil(FIni);
    FreeAndNil(secc);
  end;
end;
__________________
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 30-04-2019
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Smile

Hola.

Muchas gracias, Germán.

Aunque no lo he probado aún; este ejemplo es lo que buscaba.

Ahora lo adaptaré para el programa que realizo.

Espero que también le sirva a otras personas.

De nuevo gracias y un saludo.
Responder Con Cita
  #4  
Antiguo 30-04-2019
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Bueno, ya lo probé con Delphi 7.

Hice algunos cambios y añado algunos comentarios por si le puede ser de utilidad a otras personas:

El código tal como está, debe probarse usando solo rectángulos porque, aunque graba todos los tipos de nodos, al leerlos da error si no son rectángulos.
  • Dado que RECT no tiene las propiedades Width ni Heigth (y tiene Rigth y Button), hice un pequeña adaptación del código en 2 líneas.
  • En el código tal como está, al crear un archivo INI, se sobreescribe el anterior. Si grabamos más nodos que los que había en el archivo INI, no hay problema.
    Aunque, si en un archivo INI creado anteriormente habían datos de 6 nodos y nosotros grabamos una imagen con 2 nodos, los datos de los 4 últimos nodos seguirán existiendo. Por ello, hice un pequeño añadido al código para que, antes de grabar un archivo INI, borre el archivo anterior (si existe).
  • Y hay que acordarse de añadir INIFILES en el USES:
Código Delphi [-]
  uses inifiles, ...

Incluyo aquí el código de Germán, con esos pequeños cambios hechos en Delphi 7:


Código Delphi [-]
procedure TForm1.btnGrabarClick(Sender: TObject);
var
  i, oc:Integer;
  o:TGraphObject;
  FIni:TIniFile;
begin

  // Borra INI anterior, si existe
  if FileExists( ChangeFileExt(Application.ExeName, '.ini') )
    then DeleteFile(  ChangeFileExt(Application.ExeName, '.ini') ) ;
  // Crear un  INI
  FIni := TIniFile.CReate(ChangeFileExt(Application.ExeName, '.ini'));
  try
    oc := SimpleGraph.ObjectsCount;
    // Recorrer los objetos creados en el grafo
    for I := 0 to (SimpleGraph.Objects.Count - 1) do begin
      o := SimpleGraph.Objects.Items[i];
      // Es un nodo
      if (o is TGraphNode) then begin
        // Acceder à la clase
        FIni.WriteString('OBJ'+IntToStr(i), 'Clase', TGraphNode(o).ClassName);
        // posicion del objeto
        FIni.WriteString('OBJ'+IntToStr(i), 'Left', IntToStr(TGraphNode(o).Left));
        FIni.WriteString('OBJ'+IntToStr(i), 'Top', IntToStr(TGraphNode(o).Top));
        FIni.WriteString('OBJ'+IntToStr(i), 'Ancho', IntToStr(TGraphNode(o).Width));
        FIni.WriteString('OBJ'+IntToStr(i), 'Alto', IntToStr(TGraphNode(o).Height));
        // Color de fondo
        FIni.WriteString('OBJ'+IntToStr(i), 'Color', IntToStr(TGraphNode(o).Brush.Color));
        // ...

      end;
    end;
  finally
    FreeAndNil(FIni);
  end;

end;

procedure TForm1.btnRecuperarClick(Sender: TObject);
var
  i, oc:Integer;
  o:TGraphObject;
  FIni:TIniFile;
  secc:TStringList;
  str:String;
  Rect:TRect;

  // Obtener la clase del Nodo
  function GetNodeClass(AClass:string):TGraphNodeClass;
  begin
    if (AClass = 'TRectangularNode') then
      Result := TRectangularNode;
  end;

begin

  // Commando por defecto
  SimpleGraph.CommandMode := cmInsertNode;
  // Fichero de objetos
  FIni := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
  secc := TStringList.CReate;
  try
    // Leer la lista de nodos a crear
    FIni.ReadSections(secc);
    // Recorerr los nodos a crear
    for i := 0 to (secc.Count -1) do begin
      // Clase del nodo
      Str := FIni.ReadString('OBJ' + IntToStr(i), 'Clase', 'TRectangularNode');
      // Definir la clase
      SimpleGraph.DefaultNodeClass := GetNodeClass(Str);
      // Posicion del objeto
      Rect.Left := FIni.ReadInteger('OBJ' + IntToStr(i), 'Left', 10);
      Rect.Top := FIni.ReadInteger('OBJ' + IntToStr(i), 'Top', 10);
      Rect.Right  := Rect.Left + FIni.ReadInteger('OBJ' + IntToStr(i), 'Ancho', 100);
      Rect.Bottom := Rect.Top + FIni.ReadInteger('OBJ' + IntToStr(i), 'Alto', 50);
      // Crear el nodo
      o := SimpleGraph.InsertNode(Rect);
      // color de fondo..
      TGraphNode(o).Brush.Color := FIni.ReadInteger('OBJ' + IntToStr(i), 'Color', 0);
      // Otras propiedades...
    end;
  finally
    FreeAndNil(FIni);
    FreeAndNil(secc);
  end;

end;
Responder Con Cita
  #5  
Antiguo 30-04-2019
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.279
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


De todas formas, esto es sólo un ejemplo, una prueba de concepto.
En mi caso, toda la información la grababa en Base de Datos. Como bien dices, faltan muchas cosas, pero la idea está ahí.
__________________
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 07-05-2019
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Hola.

Finalmente he conseguido leer y grabar las imágenes en la base de datos Firebird utilizando el formato de texto con los valores de cada una de las propiedades que utilizo de nodos y links de las imágenes de Simplegraph.

Gracias Germán por el ejemplo de código que incluiste. Me sirvió de base para mi código.

Saludos.
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
Guardar y recuperar imagen en bd Lizette Varios 17 26-11-2009 15:49:59
SQL Server - Grabar / Recuperar Imagen _Willa MS SQL Server 1 17-12-2008 13:37:30
Grabar imagen spia Tablas planas 4 12-03-2008 20:47:53
Recuperar IMAGEN de un QUERY natalinuyo Gráficos 31 12-02-2007 23:22:22
Cargar y recuperar imagen en bd MySQL??? burasu MySQL 2 22-08-2004 22:40:18


La franja horaria es GMT +2. Ahora son las 09:42:30.


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