2010-01-29 3 views
2

L'application que j'essaye maintenant de soutenir (a former creation of mine) est un désordre complet, et ainsi j'ai programmé une extension à lui comme un exécutable séparé que je lance alors, appelez application.minimize; et WaitForSingleObject (le processus récemment créé). Juste après, j'appelle le application.restore pour me ramener à l'endroit où je m'étais arrêté.Application.Restore ne me permet pas d'où j'étais auparavant, pourquoi?

application.Minimize; 
WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
Application.Restore; 
Application.BringToFront; 
BringToFront; //the topmost form which was used to launch the app 
Show; 

Je peux alors voir (Win XP), comment le décrire ?, le cadre de l'application sauter de la barre des tâches et faire comme si l'application a été lui-même de restaurer à l'écran, mais il ne fonctionne pas montrer réellement. Comme vous pouvez le voir, je suis assez désespéré et combiné app.restore, app.bringtofront, form.bringtofront, form.show ... mais je pense que j'ai besoin d'une sorte d'application.show, activate, focus ... ne peut pas semble trouver ceux-ci.

Aussi, pourquoi est-ce pas assez?

application.Minimize; 
WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
Application.Restore; 

EDIT

La principale forme est wsMaximized, cela appelle anotherform.showmodal; qui tente alors de minimiser éventuellement l'application, lancez l'autre processus, et restaurer l'application. Je pense que l'astuce est avec la MODALité de la forme la plus haute.

exemple de code pour l'autre forme (le plus haut), qui est représenté comme modal:

function ExecAndWait(const FileName, Params: string; 
    WindowState: Word): Boolean; 
var 
    SUInfo: TStartupInfo; 
    ProcInfo: TProcessInformation; 
    CmdLine: string; 
begin 
    { Enclose filename in quotes to take care of 
    long filenames with spaces. } 
    CmdLine := '"' + FileName + '" ' + Params; 
    FillChar(SUInfo, SizeOf(SUInfo), #0); 
    with SUInfo do 
    begin 
    cb := SizeOf(SUInfo); 
    dwFlags := STARTF_USESHOWWINDOW; 
    wShowWindow := WindowState; 
    end; 
    Result := CreateProcess(nil, PChar(CmdLine), nil, nil, False, 
    CREATE_NEW_CONSOLE or 
    NORMAL_PRIORITY_CLASS, nil, 
    PChar(ExtractFilePath(FileName)), 
    SUInfo, ProcInfo); 
    { Wait for it to finish. } 
    if Result then 
    begin 
    application.Minimize; 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    Application.Restore; 
    Application.BringToFront; 
    end; 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    ExecAndWait('C:\Windows\system32\mspaint.exe' , '' , SW_NORMAL); 
end; 
+0

Juste minimiser suivi par la restauration fonctionne pour moi. Avez-vous essayé Application.ProcessMessages? –

+0

oui. n'a pas aidé. –

+0

Et vous n'avez aucun moyen de déboguer? –

Répondre

6

ShowModal provoque toutes les formes de l'application pour être désactivé, à l'exception de la forme modale. Vous ne pouvez pas minimiser, restaurer une fenêtre désactivée à volonté. Essayez sth. comme;

if Result then 
    begin 
    EnableWindow(Application.MainForm.Handle, True); 
    application.Minimize; 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    Application.Restore; 
    EnableWindow(Application.MainForm.Handle, False); 
    Application.BringToFront; 
    end; 
+0

merci pour une réponse, il y avait trop de commentaires empiler ci-dessous la question. Je vais essayer ça maintenant. –

+0

superbe! Cela a fait l'affaire! Je ne savais pas que "ShowModal provoque la désactivation de toutes les formes de l'application". C'est un aperçu très utile. ta –

+0

De rien! Pour éviter un malentendu, plutôt qu'une cause, ShowModal désactive les formulaires (en appelant DisableTaskWindows). Quoi qu'il en soit, ce qui est fait ici est en quelque sorte contre la conception de TApplication, donc vous surveilleriez l'anomalie, par exemple s'il y a plus de formulaires. –

Questions connexes