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 22-05-2006
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
Post problema con pagecontrol y tabshet

hola amigos del foro..
comentarles q quiero hacer un form para citas medicas q tenga los doctores y mas abajo el listado de pacientes del doctor para eso quiero utlizar un page control y en sus tabshet los nombres de doctores.. entonces el codigo q tengo para crear tabshet por cada doctor q tenga en un dataset lo puse en el oncreate del form y me da un error con numerohexadecimal al momento de ejecutar entonces lo puse en el onshow y da bien pero el problema es cuando quiero volver a abrir el form me sale un error pues todos los datos ya existen

¿como tendria q hacer para eliminar los tabshet (creo q eso tendria q ser en el on close del form)?
que otra opcion puedo tomar en cuenta espero haya sido claro en explicar mi problema y muchas gracias por las respuestas
Responder Con Cita
  #2  
Antiguo 22-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Tal vez tendrías que tratar no tener que hacerlo, pero, para eliminar las "pestañas" de un "PageControl" podrías hacer algo como esto (ignoro si existe un método en concreto o algo más eficaz, por el momento):

Código Delphi [-]
var
  i: integer;
begin
  for i := PageControl1.PageCount-1 downto 0 do
    PageControl1.Pages[i].Free;
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 23-05-2006
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Una variante y pregunta

Luego de leer el código que propuso dec ensayé una variante que permitiría eliminar la página elegida.
Pero no me puedo explicar por qué es necesario usar downto en lugar del método directo, (0 to pagecontrol1.Pagecount -1 do), que de ser usado da un mensaje de error.
Mi variante es la sgte.:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
  for i:= pagecontrol1.PageCount-1 downto 0 do
  begin
  if pagecontrol1.Pages[i].Name='pepe'  then

  PageControl1.Pages[i].Free;
  end;
end;

Un saludo
Responder Con Cita
  #4  
Antiguo 23-05-2006
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
gracias por la respuesta

muchisimas gracias por las respuestas comentarles q aplique las sugerencias en la aplicacion q estoy haciendo y funciona a la perfeccion nuevamente muchas gracias por la grandiosa ayuda
Responder Con Cita
  #5  
Antiguo 24-05-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

esocrates, lo cierto es que no me veo capaz de explicarte, de forma que pueda comprenderse perfectamente, porqué no puedes en este caso realizar la iteración en el bucle como suele hacerse por lo general. Ha de hacerse a la inversa, porque, de otro modo, simplemente, no funciona.

Creo que la cuestión está en cómo se lleva a cabo la cuenta de las iteraciones del bucle. Me parece (por lo que he leído en estos mismos Foros) que los bucles "for" realizan la cuenta en cada iteración, es decir, al contrario que los bucles "while" que lo hacen una vez, al entrarse en ellos.

Ya digo que no sabría explicártelo mejor. De hecho he esperado hoy a ver si alguien se atrevía a ello, y, como veo que no, me pongo yo a intentarlo. Pero, me meto en camisas de once varas. Ayer noche hize algunas pruebas, recorrí los bucles en un sentido y otro, traté de, recorriendo paso a paso la ejecución del código, comprender qué ocurría exactamente.

Seguro que alguien se atreve a darnos una explicación que seamos capaces de entender.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 24-05-2006
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
A ver si...

Hola a todos, trataré de ayudar en este tema, creo que para entender el por qué del uso de downto debemos tener en cuenta lo siguiente:
1º El TPageControl mantiene un arreglo indexado de sus TabSheets.
2º Es imposible acceder al índice de un supuesto elemento que sea mayor que el mayor índice del arreglo, sencillamente no existe (esto es válido para todos los arreglos incluyendo los TStrings toda su descendencia).
Ahora bien en este caso ocurre que:
Cuando se comienza a iterar en el For el valor la variable i desde 0, como sabemos, se incrementa en uno y al ejecutar la declaración de liberar (Free) el TabSheets entonces la propiedad PageCount se refresca a la nueva cantidad de elementos del arreglo, que por supuesto es uno menos que en la iteración anterior.
Y así sucesivamente hasta el momento en que el valor de i sea igual al valor de la propiedad PageCount justo en ese punto vas a querer destruir un TabSheets que no existe, dicho de otra manera un elemento indexado del array que no existe, y por tanto lanzará la excepción.
En el caso del uso del downto este fenómeno no ocurre puesto que siempre la propiedad PageCount tendrá un valor superior a 0 y al destruir la última pestaña será igual a 0. De esta forma se asegura que el error nunca ocurrirá.
Nota que esto solo ocurre en el caso de destrucción de las pestañas, en otros casos se puede usar sin dificultades el For … to … do para el PageControl
Hice un esfuerzo para tratar de explicarme, ya me comentarán si lo logré.
Saludos
Responder Con Cita
  #7  
Antiguo 25-05-2006
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Muchas gracias dec y Ruben_cu por las respuestas.
La explicación de Ruben_cu me aclaró bastante las dudas y por qué el problema se resolvía de este modo:


Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
  for i:= 0 to pagecontrol1.PageCount-1  do
  begin
  if pagecontrol1.Pages[i].Name ='pepe'  then
     break;//interrumpe el ciclo


  PageControl1.Pages[i].Free;

   Button2.Enabled:=false;//Para evitar otro evento que lanzaría un error
  end;

end;

Un saludo

Última edición por esocrates fecha: 25-05-2006 a las 03:38:46.
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
PageControl {El Muy Mencionado} GeoAvila Varios 6 01-03-2007 13:37:19
Uso de PageControl con ImageList sabinajoa OOP 2 16-12-2005 16:01:52
Pagecontrol emiliu Varios 3 02-12-2005 07:59:23
Bordes de un PageControl roman OOP 3 08-09-2004 08:56:49
Pagecontrol Fita Varios 2 21-12-2003 05:07:03


La franja horaria es GMT +2. Ahora son las 18:40:01.


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