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 17-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Proyecto MDI, error al crear form hija

Hola a todos, perdon si vuelvo con mi problema de siempre, pero esta vez necesito una solucion definitiva porque sino pierdo el trabajo (o mejor dicho, al no encontrar solucion al problema voy a tener que dejar el proyecto). El problema es el siguiente: Tengo un proyecto del tipo MDI, tengo varias form hijas, de todas las form hijas hay una que necesito que se repita, es decir tengo un form del tipo fsMDIChild que lo guarde con distintos nombres, despues agrego los forms al proyecto teniendo por ejemplo forms adetallada, agendadetallada1, agendadetallada2, agendadetallada3, etc. El codigo que crea los forms es el siguiente:

Código Delphi [-]
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.CreateForm(TAboutBox, AboutBox);
  Application.CreateForm(Tagendadetallada1, agendadetallada1);
  Application.CreateForm(Tagendadetallada2, agendadetallada2);
  Application.CreateForm(Tagendadetallada3, agendadetallada3);
  Application.CreateForm(Tagendadetallada5, agendadetallada5);
  Application.CreateForm(Tagendadetallada6, agendadetallada6);
  Application.CreateForm(Tagendadetallada7, agendadetallada7);
  Application.CreateForm(Tagendadetallada8, agendadetallada8);
  Application.CreateForm(Tagendadetallada9, agendadetallada9);
  Application.CreateForm(Tagendadetallada11, agendadetallada11);
  Application.CreateForm(Tagendadetallada12, agendadetallada12);
  Application.CreateForm(Tagendadetallada13, agendadetallada13);
  Application.CreateForm(Tagendadetallada14, agendadetallada14);
  Application.Run;

El tamaño del ejecutable es de 5 mb aprox., el form agendadetallada tiene cientos de componentes tedits. Al proyecto tengo que agregarle 6 forms agendadetallada mas, pero no puedo ni agregarle uno mas porque aparece el error: 'system error. code: 14 Espacio de almacenamiento insuficiente para completar esta operacion.'
Se que no es un problema ni de disco ni de memoria porque tengo lo suficiente, 40 gb en disco libre y la memoria del sistema es de 1gb. Al ejecutar el programa con la funcion F8 (paso por paso) en el momento que se ejecuta la instruccion Application.CreateForm(Tagendadetallada15, agendadetallada15); aparece el mismo error.

Otra forma de crear el proyecto fue la siguiente: el form agendadetallada lo puse en el repositor de objeto con la funcion adecuada "Add to Repository", despues creo otro proyecto MDI y le adiciono los forms de la siguiente forma: File -> New -> Other..., despues selecciono el form agendadetallada y selecciono, cambio la opcion de "Copy" a "Inherit". Realizo estos pasos con la cantidad de forms que necesito, al compilar la aplicacion el tamaño del ejecutable llega a 1 mb, entonces pense que ahora si funcionaria pero el error sigue apareciendo.
Quizas el problema no es de mi aplicacion sino del mismo sistema operativo windows, o algun tipo de configuracion especial de windows para que me permita utilizar mas recursos del sistema (memoria, disco, etc). Un dato mas que les puedo dar es que cuando aparece el error y la aplicacion esta mostrando el error, no puedo abrir ningun otro programa (por ejemplo el internet explorer), el internet se empieza a cargar pero queda colgado, lo que me hace suponer que realmente es un problema de memoria o de configuracion de memoria, lo mismo ocurre cuando ejecuto una version del proyecto que funciona, es decir con la cantidad de forms necesario para que se ejecute, pero si quiero ejecutar otra instancia de la aplicación me aperace el mismo error. La solucion a mi problema se podria realizar de dos formas o por lo menos es lo que me parece:
1- Configurar al sistema operativo para que mi aplicacion utilice mas memoria que la que se le asigna a cada programa por defecto.
2- En mi aplicación crear los forms no de la forma por defecto (createform) sino mediande otra forma (getmem, memalloc o algo parecido), de tal forma que se le asigne la memoria necesaria a mi aplicacion desde el principio.

Quizas todo lo que digo esta mal, pero en este momento nose que otra cosa hacer mas que esperar alguna ayuda de ustedes. Muchas gracias.

Última edición por dec fecha: 17-06-2007 a las 22:23:28.
Responder Con Cita
  #2  
Antiguo 18-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
No he visto un caso como ese, pero de seguro si te estas quedando sin recursos debes "ahorrarlos" para eso te recomiendo que no crees todos los formularios al cargar la aplicación, mas bien ve creando los formularios a medida que los necesites y los destruyes al concluir.

Lo otro que puedes usar es una directiva de compilador (¿ {$M} ?) que permite indicar la cantidad de memoria asignada a la aplicación, ahora no tengo delphi a mano para conirmarlo pero la directiva existia en turbo pascal 7.

Tambien trata de evitar usar componentes devoradores de memoria (grandes colecciones de datos, arreglos, imagenes, etc).
__________________
Sitrico
Responder Con Cita
  #3  
Antiguo 18-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Epa

Cita:
Empezado por nfrfabian
...form agendadetallada tiene cientos de componentes tedits...
En definitiva es por escaces de memoria física y memoria virtual! al principio me parecia que era más "lindo" hacer formularios con N TEdits modificados por mi que me permitian visualizarlos como "Flats", era alucinante tener un pseudo-grid que reaccionaba de lujo con el movimiento del ratón...

Pero me di cuenta que consumia DEMASIADOS recursos hacer tal cosa... acaso no es posible que cambies tus centenares de TEdits por un DBGrid o algo por el estilo, pues para cada componente insertado en un formulario debe asignar un espacion en memoria y eso es algo costoso si lo multiplicas.

(Para confirmar reduce a la mitad los componentes TEdit creados luego de hacer backup, si funciona debes SIoSI cambiarte a DBGrids), Borralos la mitad, si fueron creados en tiempo de diseño, si fue en tiempo de ejecucion reduce la creacion al 50%. Ademas que debes meter en tu ideologia de diseño un aprovechamiento de los recursos, no digo que no uses nada, pero no exajeres.

PD: Fijate en el "Administrador de tareas" cuánta memoria utiliza tu proyecto.
No dejes de comentarnos pues el tema es interesante.
Saludos!
Responder Con Cita
  #4  
Antiguo 18-06-2007
Avatar de rcarrillom
[rcarrillom] rcarrillom is offline
Miembro Premium
 
Registrado: dic 2004
Ubicación: UK / North Sea / Norway / Golfo de México / Frente a mi Laptop
Posts: 219
Poder: 20
rcarrillom Va por buen camino
Cita:
Empezado por nfrfabian
...tengo varias form hijas, de todas las form hijas hay una que necesito que se repita, es decir tengo un form del tipo fsMDIChild que lo guarde con distintos nombres...
No creo entender muy bien este punto, significa que las muchas forms que generas es la misma EXACTAMENTE pero guardada con nombres de fichero diferentes? Si es así, basta con una sola form diseñada, creas dinámicamente cuantas forms hijas necesites y las destruyes al momento de cerrarlas; claro, debes de implementar un método para guardar los datos de cada agenda por separado. Espero haber sido de ayuda.
__________________
eLcHiCoTeMiDo - Rompecorazones profesional
Yo no soy presumido; ¿Pero de qué sirve mi humilde opinión contra la de los espejos?
Salva a un nylon, usa prendas de piel de foca
Responder Con Cita
  #5  
Antiguo 18-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Hola, gracias por sus consejos. El problema de crear los formularios a medidas que los necesite no me sirve porque necesito todos desde el primer momento porque los uso para mostrar datos de una base de datos, en donde cada formularios muestra informacion de un rango de datos de una tabla: agendadetallada1 muestra registros cuyo campo habitacion esta entre los rangos 1-5, agendadetallada2 registros cuyos campo habitacion esta entre los rangos 6-10, etc.
Utilizo edits y no dbgrid porque ademas de mostrar los datos dependiendo de otros valores de los registros, realizo un formato especial, por ejemplo mostrar los datos de un color diferente dependiendo del valor del campo "ingreso", ademas por cada tedit se disparan ciertos eventos (onchange, onenter, etc.), lo que me obliga a utilizar solo tedits, y no otro tipo de componente (o por lo menos yo no conozco ningun dbgrid que pueda ser formateado de la forma que yo necesito).
Me parece que la solucion podria ser la directiva que mensiono Sitrico {$M} , voy a ver si en la ayuda de delphi aparece algo sobre la misma. Gracias por sus consejos.
Responder Con Cita
  #6  
Antiguo 18-06-2007
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Bueno,

los dbGrids sí se pueden formatear con distintos colores y fuentes incluso. Sólo tienes que añadir unas líneas de código.
Los eventos que usas en los edits se pueden pasar a las distintas celdas de un dbGrid, aunque sea detectando pulsaciones de tecla (como la tabulación) o los clics que hagas en la rejilla.

En fin, creo que currándotelo un poco podrías lograr que tu programa sea tal como tú quieres usando dbGrids.

Saludos.
Responder Con Cita
  #7  
Antiguo 18-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
...y si no... echamos manos del VirtualTreeView, con éste se hace todo, encima gratuito con fuentes

Yo la verdad, añadiría una sola ventana agenda, que dado dos números, cargase los datos de la base de datos. Solo se trata de 1 Form, pero en ejecución se crearían tantas ventanas como fuera necesario para mostrar todos los datos.

Tal y como lo haces ahora.... por Dios que no tengas que modificar 1 cosa en todas las ventanas .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 18-06-2007 a las 20:12:14.
Responder Con Cita
  #8  
Antiguo 18-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Hola, IxMike, si me podes decir en donde puedo buscar como formatear (o que codigo tengo que poner para poder formatear) el dbgrid para que me muestre los datos del dbgrid con distintos colores. Yo, buscando algunas propiedades de los dbgrid, vi que se puede formatear las coluimnas de los dbgrid (color, font), pero yo necesto que el color de fonde cambie, pero no de toda la columna, sino algunas celdas, por ejemplo en la columna "nombre", puedo tener cinco celdas con un color rojo, despues, 3 sin color, despues 10 con un color verde, y todo esto con todas las columnas, ademas estan los eventos que utilizo: onchange, onclick, onenter, onexit, dobleclick, que son distintos, dependiendo del valor de los campos. Me parece que realizar un formato de esa forma a un dbgrid no es posible, quizas se podria realizar con un dbgrid de tercero pero me parece dificil. Si estas seguro que se puede hacer te agradeciria que me digas como lo hago o donde busco esa informacion. Gracias.
Responder Con Cita
  #9  
Antiguo 18-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Gracias Lepe, acabo de instalar el VirtualTreeView y por lo que dice la pagina del creador del VirtualTreeView, es lo que necesito, ahora estoy viendo los tres componente que incluye el VirtualTreeView y aparentemente, el componente que necesito es el virtualstringtree, pero hasta ahora no he podido hacer que se muestren las filas y columnas (supongo que este componente podria funcionar como un stringgrid mejorado), si sabes cual es la propiedad que tengo que modificar, te lo voy a agradecer, sino no importa seguro con un poco de paciencia lo voy a descubrir.
En este momento tengo esperanza que este componente solucione mis problemas. El camino que me queda es muy largo para poder utilizar este componente en vez de mis cientos de tedits (cambiar toda la parte grafica, y las funciones y procedimientos que utilizo para mostrar, borrar, la informacion con los tedits, eventos, etc.).
Lo mas importante es que tengo un punto de partida para resolver mi problema. Te agradesco mucho la ayuda que me diste, al igual que todos los demas, que me dieron algunos consejos. Gracias a todos.
Responder Con Cita
  #10  
Antiguo 19-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En este hilo tienes un ejemplo con código y enlace a manuales.

Lo primero será acceder a la propiedad Header, dentro de ella tienes ColumnsHeader y definir cuantas columnas quieres, el ancho, etc.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 19-06-2007 a las 00:17:38.
Responder Con Cita
  #11  
Antiguo 19-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Otro detalle: en OOP cuando creas los form de la manera en que lo haces,

Cita:
Application.CreateForm(Tagendadetallada1, agendadetallada1);
Application.CreateForm(Tagendadetallada2, agendadetallada2);
Application.CreateForm(Tagendadetallada3, agendadetallada3);
Application.CreateForm(Tagendadetallada5, agendadetallada5);
Application.CreateForm(Tagendadetallada6, agendadetallada6);
Application.CreateForm(Tagendadetallada7, agendadetallada7);
Application.CreateForm(Tagendadetallada8, agendadetallada8);
Application.CreateForm(Tagendadetallada9, agendadetallada9);
Application.CreateForm(Tagendadetallada11, agendadetallada11);
Application.CreateForm(Tagendadetallada12, agendadetallada12);
Application.CreateForm(Tagendadetallada13, agendadetallada13);
Application.CreateForm(Tagendadetallada14, agendadetallada14);
Asignas para cada una los metodos y procedimientos asignas memoria tanto al codigo, como a los datos

Si usaras algo como:
Cita:
Application.CreateForm(Tagendadetallada1, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada2, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada3, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada5, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada6, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada7, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada8, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada9, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada11, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada12, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada13, CustomAgendaDetallada);
Application.CreateForm(Tagendadetallada14, CustomAgendaDetallada);
Necesitarías 1 sóla vez la memoria para los métodos y un juego de propiedades unico para cada instancia del objeto.

es más no necesitas creear al inicio todos los formularios puedes hacerlo en el oncreate del main form

Código Delphi [-]
For i = 0 to CantidadAgendas do
   Begin
   f[i] := tAgendaDetallada.Create(self);
   f[i].SetIdAgendaDetallada(i); 
    // aqui escribes un case qure diferencia los parametros de las agendas
   End;
End;
__________________
Sitrico
Responder Con Cita
  #12  
Antiguo 19-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Hola Sitrico, me parece que la solucion que me das es muy parecida a la variante que hice cuando el form agendadetallada lo puse en el repositor de objetos y despues cree un proyecto nuevo y adicione los forms necesario. Si bien el tamaño del ejecutable bajo de mas de 5mb a 1mb, lo que indicaba que realmente estaba reutilizando el form agendadetallada, pero a la hora de ejecutarse el error volvia a aparecer.
De todas formas voy a probar la variante me me decis, total el implementar lo que me decis es mucho mas simple que cambiar todos los tedits por algunos virtualstringtree.

Lepe, me fije el link que pusiste y me sirvio bastante, aunque al copiar los codigo que pusiste para mostrar los datos en el virtualstringtree, no me esta funcionando, lo que estoy haciendo es modificar el ejemplo que viene con el virtualtreeview, pero tengo una duda: En el evento doble click del virtualstringtree que uso, utilizo la sentencia Node:=VST5.FocusedNode; para determinar el nodo en el que hice el doble click, pero nose como puedo saber a que columna pertenece.
Mañana voy a tratar de hacer lo que me dice Sitrico, si no funciona volvere a
seguir estudiando al virtualstringtree. Gracias.
Responder Con Cita
  #13  
Antiguo 20-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Del {$M} (hoy si tengo delphi a mano)

Buscando en la ayuda de delphi:

Cita:
Type Parameter
Syntax {$M minstacksize,maxstacksize}
{$MINSTACKSIZE number}
{$MAXSTACKSIZE number}
Default {$M 16384,1048576}
Scope Global
Remarks

The $MINSTACKSIZE and $MAXSTACKSIZE directives are used in Windows programming only. For information about the $M ($RESOURCERESERVE) directive in Linux, see Reserved address space for resources.
The $M directive specifies an application's stack allocation parameters. minstacksize must be an integer number between 1024 and 2147483647 that specifies the minimum size of an application's stack, and maxstacksize must be an integer number between minstacksize and 2147483647 that specifies the maximum size of an application's stack.

If there is not enough memory available to satisfy an application's minimum stack requirement, Windows will report an error upon attempting to start the application.
An application's stack is never allowed to grow larger than the maximum stack size. Any attempt to grow the stack beyond the maximum stack size causes an EStackOverflow exception to be raised.
The $MINSTACKSIZE and $MAXSTACKSIZE directives allow the minimum and maximum stack sizes to be specified separately.

The memory allocation directives are meaningful only in a program. They should not be used in a library or a unit.
For portability considerations between Windows and Linux, you should use the long forms of these directives instead of $M.

Note The $M directive is used for a different purpose on platforms other than Windows. See Reserved address space for resources.
Prueba agregar esta directiva:

Código Delphi [-]
{$M 16384,10485760}
// el MAXSTACKSIZE *10

y ejecuta tu aplicación si funciona DEBES BAJAR el MAXSTACKSIZE hasta el mínimo necesario.

Cita:
Hola Sitrico, me parece que la solucion que me das es muy parecida a la variante que hice cuando el form agendadetallada lo puse en el repositor de objetos y despues cree un proyecto nuevo y adicione los forms necesario
Ciertamente, pero la diferencia es que te recomiendo crear el mismo Formulario con distintos parametros y no distintos formularios como mencionaste.
__________________
Sitrico

Última edición por sitrico fecha: 20-06-2007 a las 18:47:22.
Responder Con Cita
  #14  
Antiguo 20-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Hola Sitrico, lamentablemente, el uso de la directiva no funciona, lo probe tal cual lo pusiste:
Primero agregando la directiva solamente.
Despues creando un form con distintos parametros.
Finalmente con las dos formas a la vez, es decir creando un form con distintos tamaños y la directiva.
En todas me aparecio el mismo error.
Por ahora sigo probando si el componente virtualstringtree, a ver si me sirve. Hasta ahora pude verificar que existe eventos que reemplazan a los eventos del tedis onclick y ondblclick, pero no existe el evento onmouseenter y onmouseleave que yo utilizo cuando el mouse se posiciona en el tedit y verifico que se puede agendar en esa posicion. Lo mas parecido que encontre fue el evento onmousemove.
Sitrico, gracias igualmente.
Responder Con Cita
  #15  
Antiguo 21-06-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Acabo de encontrar este hilo, (se me acabaron las ideas)

http://www.clubdelphi.com/foros/show...ghlight=FastMM

Se habla (al final) del gestor de memoria FastMM (no lo conocia) te dejo el enlace:

http://sourceforge.net/projects/fastmm/

Yo lo instale y gané (algo) en velocidad (proyecto e IDE)
__________________
Sitrico
Responder Con Cita
  #16  
Antiguo 21-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Para el VirtualStringTree existen unos editores (en la web se llaman vtAddons), son un edit, un edit con un boton, un combobox y un editor numérico que se sitúan en la celda elegida con el ratón. El evento que se lanza es OnCreateEditor (y obviamente se puede modificar cualquier columna que se muestre en el VT. Se mostrará el edit en la columna y fila donde se haga clic o se pulse la tecla F2.

También se dispone de los eventos OnEditing (justo cuando se va a editar el valor de una columna) donde se puede cancelar la edición de esa celda, OnEdited cuando se acaba de editar y OnNewText cuando se quiera asignar el nuevo valor a la columna actual.

Al margen de todo esto, yo dudo de que sea un desbordamiento de pila, ya que diría StackOverflow, es más, pocas veces he tenido que modificar ese parámetro (solo cuando he usado recursividad).

Lo más probable, es que al usar el mismo Form copiado varias veces, haya "algo" incoherente. Ten en cuenta que al copiar el mismo archivo .dfm y .pas varias veces todo el código se repite, por ejemplo la variable que te propone delphi:
Código Delphi [-]
var agendadetallada :TagendaDetalle;
No solo tendrías que copiar y pegar los archivos dfm sino modificarlos con el bloc de notas fuera de delphi.

Desde luego, lo mejor que haces es tener una sola ventana TagendaDetalles en tu programa y después, en ejecución, crear tantas como necesites.

Yo al menos no veo la necesidad de tener 15 ventanas abiertas al mismo tiempo.... ¿el usuario va a verlas todas al mismo tiempo? lo dudo, porque son muchas y una ventana tapa a la otra. Lo lógico sería crear una sola ventana AgendaDetalle (o dos como mucho) y con un par de botones hacer que avance en los datos, (si está viendo los registros 1-6, al pulsar un botón "adelante", que muestre en la misma ventana los datos del 7-13).

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #17  
Antiguo 22-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Hola a todos.
Sitrico, probe el FastMM y tampoco funciona, por la informacion que brindaba en la pagina talvez me podria servir, pero el error sigue apareciendo. Seguro el FastMM servira para otras cosas, pero no especificamente para este caso. Gracias igual.

Lepe, tenes razon en todo lo que decis. Tené en cuenta que soy un programador novato, que se puso a trabajar en un proyecto muy grande (por lo menos para mi).
Te explico porque no use un solo form y despues lo repito en tiempo de ejecucion, como dijo Sitrico (o alguna variante que permite crear los forms en tiempo de ejecucion):
For i = 0 to CantidadAgendas do Begin f[i] := tAgendaDetallada.Create(self); f[i].SetIdAgendaDetallada(i); // aqui escribes un case qure diferencia los parametros de las agendas End;Me parece que de esta forma todos los eventos de todos los forms seran los mismos y si es asi yo no tengo forma de saber en que gabinete se esta realizando alguna opèracion.
Para que entiendas mejor te comento para en donde se utilizara el sistema. El sistema es para una empresa que brinda servicios de SPA (sesiones de masajes, esteticas, hidroterapias, etc.). Hay clientes que dicen "quiero tener un dia de SPA". Entonces actualmente existe una agenda manual (papel), en donde existen todos los gabinetes disponibles hasta ahora (en total 20). Como las personas encargadas de realizar las reservas y organizar las sesiones que puede tomar un cliente (varias sesiones de estetica facial, corporal, etc.), NECESITAN tener una vision de todos los gabinetes para organizar las sesiones (actualmente les lleva algunos segundos organizar por ejemplo para un cliente varias sesiones, mentalmente por lo menos, diciendo por ejemplo: entra al establecimiento a las 10:00hs, 10:15 clase de relajacion en gabiente 4, 11:30hs hidroterapia en gabinete 12, 12:30hs almuerzo en gabiente 18, 14:00hs estetica facial en gabiente 2, etc.
Este tipo de operacion se realiza constantemente lo que me obliga a tener en todo momento todos los gabinetes, por esta razon yo opte por mostrar en cada form 5 gabinetes, con un total de 20 gabientes en 4 forms en donde se brindan sesiones de un determinado tipo, otro form con 10 gabientes en donde se brindan sesiones de otro tipo que no es necesario mostrar tanta informacion por lo que pude poner 10 gabinete, 2 form mas en donde puse 8 gabiente en cada uno. "Un total de 46 gabinetes".
De estos 46 gabinetes los que mas se usan son los primeros 20, los cuales se pueden llegar a mostrar en la pantalla organizandola en forma de mozaico horizontal (gracias al ser los forms del tipo fsMDIChild).
Los forms no solo muestran las reservas, sino que tambien permiten agregar reservas, muestra el estado de la reserva (por ejemplo de color verde si el cliente ya esta en el establecimiento, amarillo si todavia no llego, tambien muestra un color verde si la sesion ya fue pagada o un color rojo si falta pagar la sesion; al tener que mostrar mucha informacion en un espacio muy chico, opte por una codificacion de colores para brindar mucha informacion), tambien permite agendar sesiones con un solo click, algo muy similar a elegir un cliente, y despues de una lista de sesiones elegir una sesion y arrastarla hasta un gabinete, y de esta forma el cliente queda agendado en un gabinete dado, a una hora especifica.
Por esta razon yo utilizo varios forms, para que por ejemplo para agendar una sesion en un gabinete xx de un formx se produzca el siguiente evento:

procedure Tagendadetallada4.Edit314Click(Sender: TObject);
begin
enhor := 25;
engab := 11;
agendarsesion;
end;

Ya en el procedimiento "agendarsesion" determino que el gabiente es 11 y la hora es 25, ya despues disparo la instruccion que actualiza la tabla de reservas, con la informacion necesaria, finalmente actualizo la pantalla, con la reserva dada mediante una instruccion (simplificada):
procedure mostrarreservaenpantalla;
begin
pla[engab,enhor,1].Text := agen[cli].nombre + ' ' +agen[cli].nombre2;
pla[engab,enhor,1].color := xcolor;
pla[engab,enhor,2].Text := agen[cli].numsesio[nrosesion].servisio;
pla[engab,enhor,2].color := xxcolor;
end;

siendo "pla" un array de punteros a tedits:
pla: array[1..46,1..96,1..2] of ^Tedit;
siendo 1..46 los gabinetes disponibles,
1..96 la hora: 1 representa la hora 00:00hs, 2 representa la hora 00:15hs, 3 representa la hora 00:30hs,etc.

El array se carga con la direccion de memoria de los tedits cuando se crea el form:

procedure Tagendadetallada4.FormCreate(Sender: TObject);
begin
...
pla[11,1,1] := @edit117;
pla[11,2,1] := @edit118;
pla[11,3,1] := @edit119;
pla[11,4,1] := @edit120;
pla[11,5,1] := @edit121;
pla[11,6,1] := @edit176;
pla[11,7,1] := @edit122;
...

end;


Lepe, si pudiste leer todo lo anterior te daras cuenta que si bien todos los archivos agendadetalladasxxxx.dpr son iguales, lo unico que cambia son los archivos agendadetalladasxxx.pas, mas precisamente todos los eventos. (oncreate del form; onclick, ondblclick, onmouseenter, onmouseleave de los tedits, en la mayoria solo cambia el valor de la variable "engab", que guarda el gabinete.

Cuando estuve realizando las agendadetalladas me di cuenta que era demasiado desperdicio de recursos, pero fue la unica forma que encontre de realizar lo que yo necesitaba.
Si existe alguna forma de crear en tiempo de ejecucion todos los forms y que en los eventos de los tedis pueda determinar a que gabinete pertenece seguro seria "mucho meyor".
Responder Con Cita
  #18  
Antiguo 22-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Lepe, la utilizacion de los edits (vtAddons), no utilizaran demasiado recursos del sistema (en este momento le tengo miedo a los tedits)?
Probablemente los edis estaran optimizados para ser utilizados sin ningun problema, pero por ahora no los he visto. Ahora tengo otro inconveniente que paso a comentarte:
Yo pensaba usar un virtualstringtree con 3 columnas: hora, nombre, servicio.
Este virtualstringtree representaria un gabinete.
Te pido si podes analices el siguiente codigo y me digas que esta mal:

type
ptgabinete = ^ttgabinete;
ttgabinete = record
hora: string[7];
nombre: string[25];
servisesi: string[10];

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
xxx.NodeDataSize := SizeOf(ptgabinete);
end;


procedure TForm1.xxxInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var data: ptgabinete;
begin
Data := Sender.GetNodeData(Node);
data.hora := '00:00hs'; //hora de prueba
data.nombre := 'Juan'; //nombre de prueba
data.servisesi := 'Masaje'; //servicio de prueba
end;

procedure TForm1.xxxGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var data: ptgabinete;
begin
Data := Sender.GetNodeData(Node);
case column of
1:
begin
celltext := data.hora;
end;
2:
begin
celltext := data.nombre;
end;
3:
begin
celltext := data.servisesi;
end;
end;
end;

El problema es el siguiente:
Cuando a la propiedad "rootnodecount" del virtualstringtree le pongo 1 y ejecuto la aplicacion funciona perfectamente. Es decir en el virtualstringtree veo la hora, el nombre y la sesion.
Pero cuando a la propiedad "rootnodecount" le pongo un numero mayor se produce el siguiente error:
Proyect MDIAPP.exe raised exception class EaccessViolation with message "Access Violation at address 700A2DEE in module MDIAPP.exe". Read of address 0000000B.

Una variante que realice es la siguiente:
A la propiedad "rootnodecount" del virtualstringtree le pongo 0, depues en un boton pongo la siguiente instruccion:

procedure TForm1.Button4Click(Sender: TObject);
var
node: PVirtualNode;
begin
node := xxx.AddChild(NIL);
end;

La primera vez que presiono el boton se ejecuta bien, es decir veo la hora, nombre y sesion:

HORA NOMBRE SERVICIO
00:00hs Juan Masaje


Pero la segunda vez me empieza a mostrar datos corruptos (basura), hasta que vuelve a aparecer el error que te dije anteriormente:

HORA NOMBRE SERVICIO
00:00hs Juan Masaje
00:00hs xxx9´´´´3333d¡¡¡¡¡¡¡¡¡¡¡dsd¡¡¡¡¡¡¡
00:00hs sdlffj333''''¡¡¡¡¡¡¡'000'0''''''
00:00hs Juan Masaje

Probablemente algun evento estara mal, yo lo que hice fue modificar algunos ejemplos que vino el el manual del vt y tambien del ejemplo que viene con el vt.

Tambien hice lo que pusiste en otro post:

// definimos el registro:
TRecBase = record
Nombre:string[50];
direccion :string[80];
Nivel: Integer;
end;
PTrecBase = ^trecbase;

procedure TForm1.xxxInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var data: ptgabinete;
begin
Sender.CheckType[Node] := ctTriStateCheckBox;
Sender.CheckState[Node] := csCheckedNormal;
end;


procedure TForm1.xxxGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
var data: ptgabinete;
begin
Data := Sender.GetNodeData(Node);
case column of
1:
begin
celltext := data.hora;
end;
2:
begin
celltext := data.nombre;
end;
3:
begin
celltext := data.servisesi;
end;
end;


procedure TForm1.Button5Click(Sender: TObject);
var
prec: ptgabinete;
i:integer;
node: PVirtualNode;
begin
for i:= 0 to 3 do
begin
node := xxx.AddChild(NIL);
prec := xxx.GetNodeData(node);
prec.hora := 'n ' + inttostr(i);
prec.nombre := 'direc ' + inttostr(i);
prec.servisesi := '2222';
// prec.hora2 := i;
end;
end;


En este caso el error no se produce, pero igual te muestra los datos basura o no te muestra nada en algunos nodos.


Si tenes alguna idea del problema te lo voy a agradecer.
Responder Con Cita
  #19  
Antiguo 22-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Aqui hay un error:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
xxx.NodeDataSize := SizeOf(ptgabinete);
end;

El parámetro a SizeOf no debe ser de tipo puntero, sino el propio tipo registro.

Sustituye Ptgabinete por ttgabinete. Al darle información errónea al crear el nodo, es normal que muestre basura. Haciéndolo bien, no da problemas y es rapidísimo.

Tu mensaje anterior (el tocho) no lo he leído, edita el mensaje y añade las etiquetas delphi:
[ delphi ]

tu codigo fuente aqui

[ / delphi ]

(sin los espacios dentro de los corchetes)

Es normal empezar un proyecto y tomar una decisión (porque se desconoce otra forma), algunas veces se queda como está y otras se cambia (depende del tiempo y beneficio que obtengas, en $$ jeje).

Los recursos que toma los editores no lo he mirado mucho, pero es UN solo TEdit el usado. Por otra parte lo que en realidad se crea y destruye al entrar y salir del modo edición, es un objeto que enlaza el VT con el Edit en cuestión).
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #20  
Antiguo 22-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 18
nfrfabian Va por buen camino
Hola Lepe, tenias razón. Ahora funciona bien. Voy a probar el componente. Cualquier otra duda que tenga les voy a volver a consultar. Gracias a todos.
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
Crear proyecto cliente / servidor Aprendiendo Conexión con bases de datos 1 02-01-2006 15:28:49
Crear Instalador para proyecto en Delphi mieltxo Varios 1 14-12-2005 12:05:38
En mi aplicacion MDI quiero crear una ventana hija desde otra ventana hija Durbed Varios 8 05-07-2005 11:51:54
Error en proyecto? danytorres Varios 1 05-12-2003 15:35:29
Como pasar parametros de una forma hija a otra forma hija luisreg OOP 3 17-09-2003 18:18:50


La franja horaria es GMT +2. Ahora son las 15:51:37.


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