2010-11-09 9 views
6

Estoy utilizando Delphi 2010 para construir una aplicación Win32 GUI se ejecuta en Windows XP/Vista y Windows 7.Interruptor Application.Mainform en tiempo de ejecución e invocar MainformOnTaskBar causa parpadeo en la barra de tareas de Windows

Básicamente, el Application.MainForm es una propiedad de sólo lectura y no se pueden cambiar en tiempo de ejecución una vez que se crea la primera forma a través de Application.CreateForm:

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 

el ejemplo anterior hará que Form1 como MainForm de aplicación. Aparecerá en la vista previa en miniatura de la barra de tareas de Windows 7.

Configurando Application.MainFormOnTaskBar en true en tiempo de ejecución nos permite disfrutar de las características del tema aerodinámico de Windows.

Necesito cambiar la forma principal de la aplicación en tiempo de ejecución. Por ejemplo, configure Form2 como formulario principal. Yo uso siguiente código para que funcione:

procedure SetAsMainForm(aForm:TForm); 
var 
    P:Pointer; 
begin 
    Application.MainFormOnTaskBar := False; 
    try 
    P := @Application.Mainform; 
    Pointer(P^) := aForm; 
    aForm.Show; 
    finally 
    Application.MainFormOnTaskBar := True; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    SetAsMainForm(Form2); 
end; 

Ejecutar Button1.Click hará Form2 como MainForm y actualizar vista previa en miniatura barra de tareas de Windows'. Sin embargo, la barra de tareas puede parpadear en el cambio.

Mis preguntas son:

  1. ¿Hay alguna manera a distancia, tales parpadeo?
  2. ¿Es seguro establecer Application.MainformOnTaskBar: = False y establecerlo en True de nuevo en tiempo de ejecución?

Respuesta

9

La forma principal no es algo que se permita cambiar en Delphi. Usted logró encontrar una forma que parece funcionar a la mitad, pero es un truco. Para de hacer eso.

Una aplicación tiene solo un formulario principal, y es el primer formulario que acaba de crearse a través del CreateForm. Si necesita dos comportamientos radicalmente diferentes para el formulario principal, entonces se puede probar un par de técnicas:

  • definir sus dos formas principales como marcos . Pon toda tu funcionalidad allí. Luego defina un formulario único que actuará como padre de uno de los dos marcos. En lugar de cambiar la forma principal, simplemente destruya el marco y reemplácelo por uno nuevo.

  • Similar a la solución de marco, pero utilice formularios en su lugar. Cree los formularios y configure la propiedad Parent como la forma principal "real". Es probable que esto tenga un costo inicial menor porque ya tiene los dos formularios, pero en mi experiencia, los formularios de reaparecimiento son más frágiles que los marcos, que fueron diseñados como por ser controles secundarios, por lo que prefieren la técnica de marco.

El parpadeo en la barra de tareas viene de una forma que desaparece y otra que aparece. Con cualquiera de las técnicas anteriores, siempre hay una sola forma, nunca dos, por lo que no hay nada que parpadee.

+0

Además también se puede crear dos procesos diferentes e intercambiar datos entre ellos. Eso es, por supuesto, un poco más caro y puede no ser ideal si tiene que compartir datos. –

+0

Eso sería lo contrario de impedir el parpadeo de la barra de tareas, @Jens. La barra de tareas agrupa los botones del mismo proceso, por lo que el código de Chau parece reemplazar un botón por otro: ocupan el mismo lugar en la barra de tareas. Pero si los botones pertenecen a dos procesos diferentes, entonces la barra de tareas no los mantendrá unidos. No solo tendrá botones parpadeantes, sino botones que saltan de un lugar a otro. –

+0

Depende si deben ser visibles al mismo tiempo y si son lo suficientemente separados para dos ejecutables diferentes. La pregunta es por qué Chau necesita cambiar la forma principal de todos modos. Especulaba que podría ser una mejor idea usar dos procesos del mismo ejecutable o incluso dos diferentes. –

5

Otra opción a considerar es la creación de MainFormOnTaskbar=False, a continuación, crear una MainForm oculto durante toda la vida del proceso, y tienen Form1 y Form2 ser formas secundarias que se crean y clasificado de forma dinámica cuando sea necesario, y darles sus propios botones de la barra de tareas de anulando el TForms.CreateParams() método, por ejemplo:

procedure TForm1.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
    Params.WndParent := GetDesktopWindow; 
end; 
+1

Consulte The Old New Thing para saber por qué [está mal convertir el escritorio en el elemento principal de las ventanas de su aplicación] (http://blogs.msdn.com/b/oldnewthing/archive/2004/02/24/79212.aspx). –

Cuestiones relacionadas