Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 20
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
  #2  
Antiguo 22-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 20
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
  #3  
Antiguo 22-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
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
  #4  
Antiguo 22-06-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 20
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
  #5  
Antiguo 26-06-2007
gabrielkc gabrielkc is offline
Miembro
 
Registrado: jun 2007
Ubicación: Chihuahua Mexico
Posts: 118
Poder: 20
gabrielkc Va por buen camino
Saludos

mmmmm te metiste en un buen problema.

Recuerdo cuando programaba asi , no te preocupes son problemas comunes que comete uno cuando está aprendiendo a programar.


Generalmente ese tipo de proyectos te dejan muchos conocimientos. En cuanto al tema de los edits, cada edit es una ventana y consume recursos, recuerda que aún puedes utilizar labels para mostrar información que el usuario no va a modificar, los label practicamente no consumen recursos.

Y para una de las preguntas de tus primeros post. Como cambiar el formato de un Grid (yo siempre uso StringGrid) En el evento OnDrawCell, puedes cambiar a tu antojo el formato de como se dibujará cada celda, tipo de letra, tamaño, color de fondo, etc.

Cambiando el StringGrid.Canvas.Brush.Color cambias el color de relleno, StringGrid.Canvas.Font.Color el color de la letra, con StringGrid.Canvas.FillRect(Rect) rellenas la celda y con DrawText dibujas el texto.
Responder Con Cita
  #6  
Antiguo 03-07-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 24
sitrico Va por buen camino
Con razón me identificaba con el problema, también estoy haciendo una aplicación para una estetica pero sólo 5 cabinas .

Yo, manejé la lista de espera con Grids (uno por cabina) y las citas con un TimePlanner muy simple hecho por mí.

PD. Usa las etiquetas.

Cita:
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.
Para esto puedes usar la propiedad Tag de los componentes. y un procedimiento publico para asignar el Numero

Cita:
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 operacion
Mira este hilo (ya pase por ahí)
__________________
Sitrico

Última edición por sitrico fecha: 03-07-2007 a las 22:04:12.
Responder Con Cita
  #7  
Antiguo 04-07-2007
nfrfabian nfrfabian is offline
Miembro
 
Registrado: ago 2006
Posts: 55
Poder: 20
nfrfabian Va por buen camino
Hola gabrielkc, gracias por el consejo, en estos momentos estoy utilizando el componente virtualstringtree en lugar de los tedits porque fue la unica solucion que encontre (todavia estoy en proceso de creación de los gabinetes porque este componente es un poco complicado de manejar (nodo, punteros, etc.). Quizas pueda utilizar el stringgrid en otra parte del programa que todavia no pase de tedits a virtualstringtree. Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 07:55:03.


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