Ir al contenido


Foto

Como asociar un Control a un Registro de la BD


  • Por favor identifícate para responder
9 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 06 febrero 2017 - 04:14

Hola a todos

Pues estoy creando un Mapa de Red con controles TImage, que representan a cada dispositivo de la red,  los cuales se adicionan al mapa mediante un clic en un boton

 

Situación

  • Cada vez que se haga clic en un boton, debe agregarse un nuevo dispositivo (TImage) con su etiqueta al mapa

Puedo crear un Control TsImage y un TLabel, pero No se como asociarlos para cuando mueva el TImage la etiqueta se mueva junto con el

 

  • Asociar el Control a un registro en la BD para cargarlo en la misma posicion cada vez q se inicia la aplicación

No se hacer esta parte, el objetivo es guardar todos los dispositivos del mapa, para que cuando se inicie la aplicacion los muestre en la misma posicion, además para saber a que red pertenece, ya que son varias subredes con sus respectivos mapas

 

  • Cuando se haga clic en un TImage resaltarlo de alguna manera para saber cual esta seleccionado

El objetivo es para poder obtener/modificar sus propiedades, que el usuario sepa de cual dispositivo se trata, y por eso tambien lo de asociarlo con el registro en la BD

 

 

Y tambien, como manejare varias subredes, serán varios mapas, alguna idea para saber que mapa pertenece a cada red.

 

Los controles del mapa los almaceno en una lista de objetos, pero no se como asociarlos a un mapa y a la BD

 

 

Parece que hice muchas preguntas en el mismo hilo *-) , pero como todas tienen que ver con lo mismo, separadas no se entenderia bien ;)

 


  • 0

#2 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 07 febrero 2017 - 10:43

Ya solucione la primera situacion

Ya logre asociarle la etiqueta al TImage y moverlos juntos


delphi
  1. //---------------- Procedimientos para el Movimiento de los Controles ----------
  2. procedure TfrmPrincipal.ControlMouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  3. begin
  4. CompCorX:=X;
  5. CompCorY:=Y;
  6. CompMoviendo:=True;
  7. TMovible(Sender).MouseCapture:=True;
  8. end;
  9.  
  10. procedure TfrmPrincipal.ControlMouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
  11. begin
  12. if CompMoviendo then
  13. begin
  14. TImage(Sender).Left:=TImage(Sender).Left - (MouseDownSpot.x - x);
  15. TImage(Sender).Top:=TImage(Sender).Top - (MouseDownSpot.y - y);
  16.  
  17. //--- Mover la etiqueta asociada ---
  18. lblDisp:=TLabel(FindComponent(TImage(Sender).Hint));
  19. lblDisp.Left:=TImage(Sender).Left + 5;
  20. lblDisp.Top:=TImage(Sender).Top + 5;
  21. lblDisp.Top:=TImage(Sender).Top + TImage(Sender).Height + 2;
  22. end;
  23. end;
  24.  
  25. procedure TfrmPrincipal.ControlMouseUp( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
  26. begin
  27. if CompMoviendo then
  28. begin
  29. CompMoviendo:=False;
  30. TMovible(Sender).MouseCapture:=False;
  31. end;
  32. end;
  33.  
  34. function TfrmPrincipal.CrearLabelAsociada(AImage: TImage; Titulo: string):TLabel;
  35. var
  36. lbl :TLabel;
  37.  
  38. begin
  39. lbl:=TLabel.Create(Self);
  40. with lbl do
  41. begin
  42. Parent:=AImage.Parent;
  43. Left:=AImage.Left;
  44. Top:=AImage.Top + AImage.Height + 2;
  45. Caption:=Titulo;
  46. Name:='lbl'+Titulo;
  47. end;
  48. Result:=lbl;
  49. end;
  50. //------------------------------------------------------------------------------

En este caso, me falta como hacer para que se elimine la etiqueta cuando elimine el TImage

 

PD: El código lo obtuve de un post de Neftali en CD y de Delphi al Limite combinandolos


Editado por JoAnCa, 07 febrero 2017 - 10:52 .

  • 1

#3 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 07 febrero 2017 - 12:58

Ya con esto elimino el TImage con su etiqueta asociada


delphi
  1. //----- Eliminar el Control -----
  2. procedure TfrmPrincipal.btn2Click(Sender: TObject);
  3. var
  4. i :Integer;
  5.  
  6. begin
  7. if Assigned (imgSelect) then
  8. begin
  9. // Borrar el TLabel asoaciado
  10. for i:=ComponentCount - 1 downto 0 do
  11. begin
  12. if Components[i] is TLabel then
  13. if Components[i].Name = 'lbl'+imgSelect.hint then
  14. begin
  15. Components[i].Free;
  16. Break;
  17. end;
  18. end;
  19. FreeAndNil(imgSelect);
  20. end;
  21. end;


  • 1

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 07 febrero 2017 - 04:55

El mismo Neftali había comentado tanto en su blog como en CD sobre una suite de componentes que facilita justamente esto de poner objetos, arrastrar, linkear, etc. No le recuerdo bien el nombre, pero me "suena" a que era SimpleGraph de DelphiArea.

Podrías consultarle.

 

Respecto a guardar esta red en la DB el enfoque más simple que yo haría es tener justamente una tabla que tenga esta estructura:

 

ItemDeRed:

------------------------

IDItem: PK

TipoID: FK(Elementos.IDTipo)

PosX: INTEGER

PosY: INTEGER

 

Siendo TipoID una clave foránea hacia el campo IDTipode una tabla TipoDeElementos. Esta tabla permite que uno defina los posibles tipos de objetos. Por ejemplo podría decirse que en tu caso sea Etiquetas, PCs, cables, etc.

PosX y PosY se entienden fácilmente que hacen referencia a la coordenada X,Y dentro del "mapa". En este punto lo que deberías considerar es donde está el punto de origen o referencia. El dilema estará en que luego a esas coordenadas deberás luego llevarlas a la coordenadas en pantalla y deberas tener funciones tipo MapCoordToScreenCoord y ScreenCoordToMapCoord para convertir de una a otra.

¿Porqué? Por dos motivos: 1) resolución de pantalla, y 2) El mapa de red posiblemente exceda visualmente lo que pueda verse en pantalla.

Por ejemplo, tu podrías estar viendo un rectángulo (supongamos que eso es una PC en tu diagrama) que internamente está en la ubicación (262, 781) pero en pantalla el centroide de éste es en pixel (440, 625).

 

Esto parece complicado, y en parte lo es. Pero también te independiza de que el sistema de coordenadas no sea vea atado a una resolución en particular. Por esto es fundamental que establezcas un punto de referencia (0,0) tanto a nivel de pantalla como a nivel "mapa". Esto además permite que tu puedas moverte por el mapa de forma libremente.

 

Gracias a este diseño de la tabla ItemDeRed tienes listado todos los objetos que tu necesites. Leyendo TipoID puedes identificar que objetos crear, y luego simplemente lo "ubicas" aplicando la conversiones.

 

Deberías buscar una suite como la que te comenté. Seguramente estas, ya manejan internamente algún "mapa" y te pueden facilitar muchas cosas. Es más, hasta existe la posibilidad de que incluso alguna tenga alguna funcionalidad como guardar el contenido en algún formato ya sea propio o utilizar xml (algo muy de moda en estos tipos de casos)

 

Podría sugerirte que explores el proyecto StarUML 1 (versión 5.algo). Es de código libre, está hecho en Delphi y tengo entendido que para concebir los objetos arrastrables y linkearlos hace uso de unos componentes. Es un proyecto ya discontinuado, su versión StarUML 2 es de código cerrado. En su defecto puedes ver los fuentes de WhiteStarUML que es el fork basado en StarUML 1 y donde se intenta mantener activo el proyecto original.

 

Ahora bien, si no consigues la suite que te comento, u otra similar, me parece que lo más acertado es que definas tu diseño de clases que te abstraiga el panorama y te permita tener "internamente" los objetos. Luego visualmente puedes tener TImages, etc. como vienes haciendo. Básicamente lo que te propongo es desatar la lógica de la interfaz. Es la forma más limpia de trabajar.

 

Creo que en otro hilo, hace un tiempo, cuando alguien expuso dudas sobre como representar un grafo, sugerí un diseño de clases para manejar el aspecto interno/lógico.

 

Saludos,


  • 0

#5 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 08 febrero 2017 - 08:00

Muchas gracias Delphius por su gran explicacion, ya estoy enfocado en lo que me comentas con respecto a la BD

 

Estuve revisando el SimpleGraph de DelphiArea, muy bueno para lo que necesito, pero no me permite imagenes con fondo transparente (.png, o .gif), por ese detalle no me gusto, ya que prefiero usar imagenes que representen al dispositivo y no figuras geometricas. Ademas de que no se si me permitira interactuar con la BD

 

Tambien voy a tener en cuenta lo de las coordenadas que me explicas, no habia pensado que en dependencia de la resolucion de pantalla me podria variar la posicion, pues mi idea es usar las coordenadas relativas al parent donde se depositaran las imagenes


Editado por JoAnCa, 08 febrero 2017 - 08:09 .

  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 08 febrero 2017 - 09:05

Yo lo hubiera resuelto con un hook a la función de tratamiento de mensajes Windows. Aquí tienes un ejemplo aunque se puede escribir una clase que simplifique su uso.

 

Saludos.


  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 febrero 2017 - 10:48

Muchas gracias Delphius por su gran explicacion, ya estoy enfocado en lo que me comentas con respecto a la BD

 

Estuve revisando el SimpleGraph de DelphiArea, muy bueno para lo que necesito, pero no me permite imagenes con fondo transparente (.png, o .gif), por ese detalle no me gusto, ya que prefiero usar imagenes que representen al dispositivo y no figuras geometricas. Ademas de que no se si me permitira interactuar con la BD

 

Tambien voy a tener en cuenta lo de las coordenadas que me explicas, no habia pensado que en dependencia de la resolucion de pantalla me podria variar la posicion, pues mi idea es usar las coordenadas relativas al parent donde se depositaran las imagenes

 

Seguramente hay otras alternativas a SimpleGraph. No creo que sea el único de su tipo.

Respecto a que alguno de eso pueda interactuar con la DB lo veo difícil. Que un componente haga gráficos e interactúe con DB es un tanto absurdo... Son dos funciones dispares... No ha cohesión entre ambas cosas.

 

Si en cambio es de esperar que alguna suite tuviera funcionalidad para guardar y abrir el diagrama en algún archivo. Empleando algún formato propio o utilizando xml. StarUML por ejemplo guarda los proyectos justamente en formato xml. Es más, existe una "extensión" al xml estandarizada para guardar diagramas UML. Si alguna suite ofrece la posibilidad de guardar el "dibujo" en algún formato te evitas disponer de la DB.

 

Si no encuentreas suite, lo mejor es que hagas tu propio diseño de clases que mantenga la estructura del diagrama. Al hacerlo así consigues que tus clases no se vean atadas a componentes gráficos en particular. Si necesitas ayuda en este punto puedes pedirnos ayuda. Luego tu defines como quieres materializar esto físicamente... en algún archivo, en DB, etc. Lo importante es que en términos de LOGICA se gane independencia y no se mezcle con lo estrictamente gráfico.

 

Saludos,


  • 0

#8 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 08 febrero 2017 - 11:10

Seguramente hay otras alternativas a SimpleGraph. No creo que sea el único de su tipo.

Respecto a que alguno de eso pueda interactuar con la DB lo veo difícil. Que un componente haga gráficos e interactúe con DB es un tanto absurdo... Son dos funciones dispares... No ha cohesión entre ambas cosas.

 

El problema de enlazar con la BD es que es un soft de monitoreo de la red, donde tengo almacenado el inventario (de hard y de soft) de cada equipo, estadísticas de funcionamiento y otros datos, así como el tipo de dispositivo (PC, Server. CL, etc.)

 

Ademas de esto quiero mostrarlos en un mapa gráfico mostrando su estado (On/Off) y disponibilidad de algunos servicios, por eso la idea de vincularlos, para q esa información pueda verse de forma grafica o consultandolo en un DBGrid

 

No quiero un Mapa de red que solo me sirva para hacer diagnosticos de una vez, tambien que me almacene los datos para poder sacar las estadisticas de funcionamiento de los equipos y de los servicios.

 

En resumen, el mapa es una funcionalidad mas de un software un poco mas abarcador


  • 0

#9 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 08 febrero 2017 - 11:15

Yo lo hubiera resuelto con un hook a la función de tratamiento de mensajes Windows. Aquí tienes un ejemplo aunque se puede escribir una clase que simplifique su uso.

 

Saludos.

 

A que parte te refieres con lo del hook?

 

Para resaltar el TImage seleccionado ?

O a que?


  • 0

#10 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 09 febrero 2017 - 09:17

Pues parece que al final ya tengo mi problema resuelto con los componentes TSelectOnRuntime para poder mover los dispositivos y TSaveComps para guardar su posición, que son parte de la la libreria GLib de la web del amigo Neftalí

 

Tema resuelto


  • 0




IP.Board spam blocked by CleanTalk.