Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problema con pagecontrol y tabshet (https://www.clubdelphi.com/foros/showthread.php?t=31944)

Choclito 22-05-2006 21:00:24

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

dec 22-05-2006 21:12:05

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;

esocrates 23-05-2006 00:46:37

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

Choclito 23-05-2006 03:12:48

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

dec 24-05-2006 22:22:15

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. :D

Ruben_Cu 24-05-2006 23:50:54

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

esocrates 25-05-2006 02:54:30

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


La franja horaria es GMT +2. Ahora son las 04:35:56.

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