Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Accder a propiedad Text de un label de otro form! (https://www.clubdelphi.com/foros/showthread.php?t=31718)

XaRz 16-05-2006 08:56:05

Accder a propiedad Text de un label de otro form!
 
Hola,

Hay una cosa que no hago bien y querria compartilo con vosotros a ver que hago mal. Quiero acceder a la propiedad text de un label de otro form, para ello he creado un procedure publico para llamarlo des de fuera...pero vayamos por pasos:

Quiero mostrar un splashScreen que vaya canviando el texto segun los segundos que yo decido para abrir la aplicación mdi principal. Para ello tengo en el form del splash el siguiente còdigo:

Código:

procedure TwinFormSplash.ExecLoop();
var
x,y:int32;
begin
      for x:=0 to 1000000 do
        begin
          if x=500000 then
            label2.Text:='Obrint Fitxers...';
          if x=800000 then
            label2.Text:='Carregant Interfície...';
          Progressbar1.PerformStep;
          y:=x;
        end;
      Self.Close;
end;

Lo que hago desde el proyecto es:
Código:

var
splash: WinformSplash.TWinFormSplash;
[STAThread]
begin
  splash:=WinformSplash.TWinFormSplash.Create; //form del splash
  Splash.Show;
  Splash.Update;
  Splash.ExecLoop; //procedure que va canviando valores del label;
  Splash.hide;
  Splash.free;
  Application.Run(Main_Window.TWinForm_Principal.Create);//ventana principal del programa

Pues con ese código la propiedad "text" de label2 nunca es modificada...como lo hago, alguna sugerencia?

Utilizo bds2006 y programo con .NET i BDP.NET

Hala saludos,

DarKraZY 16-05-2006 09:43:55

Hola XaRz!

El tiempo que tarde en mostrarse el splash va a depender de la velocidad del procesador, ya que tardará "1000000" vueltas. Esto en un PC lento tardará mucho, y en un PC rápido, pues será rápido.

Yo te recomiendo algo como esto:
Código Delphi [-]
procedure CargarPrograma;
var
  Splash: WinformSplash.TWinFormSplash;
begin
  Splash := WinformSplash.TWinFormSplash.Create; // form del splash
  try
    Splash.Show;
    Splash.Update;
    Splash.SetTextoCargandoForms; // procedure que va canviando valores del label;
    CargarForms; // procedure que carga los forms
    Splash.SetTextoCargandoInterfaces; // procedure que va canviando valores del label;
    CargarInterfaces;
    { ... } // Aquí iría todo lo que quieras cargar, primero actualizas el splash, y después lo ejecutas
    Splash.Hide;
  finally
    Splash.Free;
  end;

  Application.Run(Main_Window.TWinForm_Principal.Create); // ventana principal del programa
end;

XaRz 16-05-2006 12:02:40

Ok, pero no veo como retrasas con pausas el splash. de acuerdo que es muy chapucero como lo he hecho yo pero almenos puedo mostrar el splash según vaya aumentado el valor del for. Como lo haces para que el splash se mantenga lo suficiente para que se pueda ver?

Además veo que tienes los procedures de cargar forms y cargar interfaces...yo nunca cargo nada en el main (programa principal) simplemente el main carga el contendor MDI y por menus voy cargando cada form cada vez. Hay alguna forma de pre cargar los procesos? cómo?

(lo siento soy muy novatillo en esto...)

DarKraZY 16-05-2006 13:53:27

Lo de las pausas y retrasos... como usuario y también programador no te lo recomiendo. ¿Por qué esperar más de lo necesario a que un programa se cargue? Porque no es que quieras mostrar una información, sino que se está cargando el programa.

Imagina que Borland hubiese decido que el tiempo de carga es de 1 minuto para Delphi 7, en los tiempos en que sacaran la versión. Y ahora con equipos muchos más potentes, mejor sistema operativo, etc. el tiempo de carga fuese el mismo. ¿No te daría rabia estar esperando?

Yo he sugerido "CargarForms" y "CargarInterfaces" porque pensaba que era lo que hacías. Pero es mucho mejor ir creando, como bien haces, en los menús.

XaRz 16-05-2006 16:22:10

Al fin he logrado algo parecido a lo que tenia en mente.
Dejo que el còdigo "hable":

Código:

try
    splash:=WinformSplash.TWinFormSplash.Create ;
    Splash.Show;
    Sleep(100);
    Splash.ExecLoop(0);
    Splash.Update;
    sleep(1000);
    Splash.ExecLoop(1);
    Splash.Update;
    sleep(1000);
    Splash.close;
    Splash.Hide;

  finally
    Splash.Free;
  end;
  Application.Run(Main_Window.TWinForm_Principal.Create);

Eso es lo que llama al formulario del Splash, después implemento el splash cómo sigue:

Código:

procedure TwinFormSplash.ExecLoop(integ:integer);
begin
  Sleep(100);
  Progressbar1.PerformStep;
  if integ=0 then
    begin
        Progressbar1.PerformStep;
        label2.Text:='Llegint dades...' ;
    end;
  Progressbar1.PerformStep;
  if integ=1 then
    begin
        Progressbar1.PerformStep;
        label2.Text:='Inicialitzant Raport Expert';
    end;
  Progressbar1.PerformStep;
end;

Con esto sólo quiero dejar espacio a los procedures que se encargarán de comprovar que la base de datos de la red està disponible y que la configuración se ha leído. Aún dichos procedures no están implementados por lo que los sleep y los strings hacen de "fake" a lo grande. Lo suyo será más tarde cuando el programa verifique las dos condiciones expuestas antes...

Pero grácias de todos modos :)


La franja horaria es GMT +2. Ahora son las 08:27:33.

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