Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Componente a partir de Diseño GUI? (https://www.clubdelphi.com/foros/showthread.php?t=75462)

maunix 25-08-2011 21:10:13

¿Componente a partir de Diseño GUI?
 
Buenas tardes, he buscado en varios foros y googleando y no encuentro un ejemplo que responda a mi inquietud, tal vez he usado las palabras claves inadecuadas pero la verdad es que siempre prefiero buscar la respuesta antes que preguntar, para no hacer perder tiempo a nadie si es que la respuesta es obvia y está en varios sitios.

El tema es el siguiente, hace tiempo que codifico en Delphi, he creado muchisimos componentes visuales y no visuales, y no he tenido problemas hastsa ahora.

Cuando son visuales, el diseño lo suelo hacer en algún formulario y luego tomo referencia de los componentes que componente a mi "futuro componente", tomo referencia de las coordenadas X e Y relativas, y codifico lo mismo. El resultado es idéntico, pero debo escribir a mano la creación de cada TLabel, TEdit, TSpinEdit y la lista sigue de componentes que forman parte de mi componente; luego debo indicar el parten,el left, el top, y todas todas las propiedades de cada uno de los componentes que no son las por defecto al crear el mismo.

En la actualidad me encuentro frente al desafío de crear un componente bastante complejo el cual segun el análisis deberá ser un Tpanel ya que podrá haber varios dentro de un formulario; ahora bien quisiera ahorrarme tener que diseñarlo gráficamente para luego copiar todas las propiedades y codificarlas a mano.

He aquí la pregunta

¿Hay alguna práctica o truco para diseñar gráficamente un componente y luego poder acceder al código y coordenadas de sus partes componentes? El elemento que debo diseñar es la copia de un formulario que ya tengo pero que contiene numerosos tabs (pero ahora deberá ser un Tpanel), posee algo asi como 1000 componentes que reflejan la complejidad del objeto y realmente me quisiera evitar tener que codificar a mano semejante cantidad de código para crear el mismo.

Lo que suelo hacer es hacer alt+f12 para acceder directamente al codigo de creación del formulario pero no me sirve para lo que quiero hacer ahora ya que no escapo de tener que copiar y pegar cada propiedad y demases.

Espero se haya entendido mi inquietud, desde ya muchas gracias.


Saludos

fjcg02 25-08-2011 22:29:44

Has probado con frames ?

Saludos

Lepe 26-08-2011 09:33:41

No lo entiendo. Algo se me escapa.

Si es "la copia de otro form", ¿por qué no copias el archivo .dfm y pas?

Sea de la manera que sea, yo entraría por parsear el código delphi y dfm (cargarlos en TStringLists) y a partir de ahí, generar el código fuente del Form resultado.

ejem... a ver si me explico:
Código Delphi [-]
// crea archivo
ts := TStringList.Create;
ts.Add('unit duplicada;');
ts.Add('');
ts.Add('uses Windows, Classes, ComCtrls ....');
ts.savetofile('c:\archivo.pas');
y después harías el .dfm también.

Saludos

duilioisola 26-08-2011 10:45:43

Creo que GExperts tiene exactamente lo que necesitas:

Components to Code

maunix 26-08-2011 13:18:37

Cita:

Empezado por fjcg02 (Mensaje 410136)
Has probado con frames ?

Saludos

Gracias por tu respuesta, no no he probado porque justamente pensaba en un Tpanel y no en una ventana dentro de otra, no tengo experiencia en frames, pero echaré un vistazo a ver si se adapta a mis necesidades.

Cita:

Empezado por lepe
No lo entiendo. Algo se me escapa.

Si es "la copia de otro form", ¿por qué no copias el archivo .dfm y pas?

Actualmente la información está en formularios TForm, pero cada formulario muestra la información de un dispositivo (estoy monitoreando hardware), ahora bien en cuanto al nuevo diseño del soft, la idea es que cada elemento dispositivo sea un Tpanel porque la complejidad se ha aumentado y un dispositivo 1 puede ser del tipo A pero a su vez un dispositivo 2 puede a su vez estar formado por varios dispostivos A y B... entonces para mostrar en forma más uniforme la información había pensado en componentes heredados de Tpanels donde cada uno maneje la complejidad de su dispositivo en sí y el resto es acomodar la info en la pantalla.

Por eso es que digo que hoy por hoy es un form, pero me parece quedaría mejor siendo un Tpanel (lo puedo inhabilitar, hacer invisible, mover, etc). No tengo experiencia en frames como me mencionó fjcg pero por ahí se resuelve por ese lado con algun form sin bordes ni nada.

Lo que propones suena razonable aunque quería ver si había alguna forma más directa y automática


Cita:

Empezado por duilioisola
Creo que GExperts tiene exactamente lo que necesitas

Echaré un vistazo, gracias por el dato.


Gracias a todos por su ayuda, ahora me pondré a ver el tema más en detalle y a hacer algunas pruebas, cuando lo pueda resolver, volveré comentando cómo lo hice porque seguro a alguno le servirá como camino a seguir o como camino a no seguir :D

fjcg02 26-08-2011 14:05:25

Tema formularios:
Se me ocurre que puedes generar el formulario 'al vuelo'. Además, puedes ponerle el parent que quieras, y de esa manera puede quedar 'incrustado' dentro de otro formulario.

Para generar el formulario 'al vuelo'

InstanciaFormulario1:= Application.CreateForm(TFormBusqueda, FormBusqueda);
InstanciaFormulario2:= Application.CreateForm(TFormBusqueda, FormBusqueda);

Previamente tienes que definir las variables
var InstanciaFormulario1, InstanciaFormulario2: TFormBusqueda;

Luego les asignas el parent ( aunque en este caso no tengo total seguridad de que la llamada sea así )

Tema Frames:
Los frames los puedes crear 'al vuelo', tantos como quieras. Un frame puede constar de un TPanel y los controles que quieras dentro de él, así como el código asociado a los mismos.

Espero haberte ayudado.

Saludos

fjcg02 26-08-2011 14:53:27

Te paso un cutreejemplo de frames con un TPanel. Espero que te sirva.

Saludos

Chris 26-08-2011 18:18:41

Lo que yo te recomiendo para tu caso es que utilices formularios empotrados. O en su defecto TFrames a cómo te lo han dicho. Creo que es lo mejor que puedes hacer. Son como un componente, pero tienes la posibilidad de hacerle cambios visualmente.

Saludos,
Chris

roman 26-08-2011 18:51:07

Cita:

Empezado por Chris (Mensaje 410190)
Lo que yo te recomiendo para tu caso es que utilices formularios empotrados. O en su defecto TFrames

Yo lo diría alrevés:

Lo que yo te recomiendo para tu caso es que utilices TFrames. O en su defecto formularios empotrados

:)

// Saludos

Osorio 27-08-2011 16:53:39

Otra opción
 
La otra alternativa que tienes es lo que muestra Marteens en este hilo.


http://www.marteens.com/trick2a.htm


pero personalmente creo que con Frames es suficiente.

maunix 07-09-2011 14:38:23

Gracias a todos por sus sugerencias, finalmente luego de probar los Tframes y los TForm empotrados (o no), me he decidido por los Tforms. El tema es que con los Tframes se me armaba un lío enorme con declararlos en tiempo de ejecución (seguro mis habilidades no son las mejores, no le hecho la culpa a Delphi pero la verdad con TForm se me hizo 100 veces más sencillo).

Los TFrames me marearon con eso de Crearlos en el repositorio de Delphi y luego a partir de allí usarlos, etc. Me es más cómodo tener TForms en código y crearlos en tiempo de ejecución, sobre todo porque no quiero lidiar con tener que instalar esos TFrames que defino en todas las PCs donde lo vaya a compilar. El tema es que uso JediVCS como sistema de control de versiones y programo desde 2 o 3 PCs diferentes por diversas cuestiones entonces si hago cambios en paleta de componentes se me hace muy tedioso migrar eso a las demás instalaciones; si lo tengo en código es cuestion de sincronizarme con el repositorio y listo, ya lo tengo en todas las PCs.

Y a los formularios los puedo ver en tiempo de diseño y rediseñarlos; algo que es importante es que si bien todos los formularios tienen una info en común, he notado que gran parte de eso corresponde a la lógica del negocio por lo tanto lo tengo en otra clase.

No obstante si alguno tiene más sugerencias al respecto, estaría bueno que las expongan porque seguro a algún otro usuario tal vez le resulte más cómodo o mejor la opción de los TFrames.

roman 07-09-2011 15:46:22

No entiendo qué tiene que ver el repositorio. No necesitas guardar ahí los frames para usarlos, sólo debes incluirlos como cualquier otra unidad en tu proyecto.

Tampoco entiendo eso de que a los formularios los puedes ver y rediseñar en tiempo de diseño. Exactamente lo mismo puedes hacer con un Frame e incluso más: por un lado, el frame en sí lo puedes diseñar en su propia ventana, exactamente como haces con un formulario; pero, además, una vez que insertas una copia del frame en un formulario, dicha copia la puedes personalizar visualmente como cualquier otro componente visual del formulario.

Finalmente, crear un frame durante la ejecución no tiene ninguna dificultad mayor que la de un formulario:

Código Delphi [-]
var
  F: TMiFrame;

begin
  F := TMiFrame.Create(Self);
  F.Left := 8;
  F.Top := 40;
  F.Parent := Self;
end;

// Saludos

maunix 08-09-2011 00:13:10

Roman, gracias por tu sugerencia, la verdad no lo probé mucho, vi que no tenia mucha diferencia con los formularios y use los formularios

No digo que el frame no pueda diseñarlo en el IDE, simplemente que para embeber un formulario en mi aplicacion no noto grandes diferencias con el frame (no tendré que heredar formulario de otro formulario). Entonces debido a eso y a que ya tengo las interfaces hechas en formulario, simplemente le agrego el código de la gestión del negocio en una clase asociada y listo.

Con respecto a crear el frame en tiempo real, como dije antes no tuve el tiempo (tal vez tampoco la paciencia) para hacerlo y por eso me decidí por el formulario, no obstante es posible, pensandolo ahora, que tenga un frame para una parte de mis formularios que es en todos igual; ahí si ya le veo más sentido práctico.

Muchas gracias


La franja horaria es GMT +2. Ahora son las 08:31:52.

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