2010-04-21 5 views
4

Mon application a beaucoup de nombreuses formes mdi et ils sont créés après une connexion réussie de l'utilisateur. Comment puis-je cacher au mieux ce processus de création? Il semble stupide et il prend plus de temps tandis que les formes mdi sont peintes après la création d'une nouvelle forme et ainsi de suite. Jusqu'à présent, j'ai utilisé LockWindowUpdate, qui ne cache pas tout, mais je voudrais utiliser un écran de démarrage montrant la progression de la création, mais je ne peux pas avec LockWindowUpdate.Delphi - Création de formulaire enfant caché MDI

Cordialement Janne

+0

Ne pas les créer au démarrage. Créez-les quand vous en avez besoin. –

Répondre

7

Pour créer des formulaires MDI enfant invisible vous mettre leur propriété Visible-False, et en plus vous devez désactiver le comportement VCL d'entre eux-montrant la force lors de la création. Cela se produit par le FormStyle Setter de propriété de TCustomForm, qui définit Visible à True pour les formulaires enfants MDI.

Si vous définissez FormStyle dans l'inspecteur d'objets, le setter de propriétés sera déjà appelé lors de la création du formulaire et le formulaire ne sera pas affiché immédiatement, mais seulement une fois la construction terminée. Cela vous permet de réinitialiser la demande de montrer la forme, en redéfinissant la méthode AfterConstruction() comme ceci:

procedure TMDIChild.AfterConstruction; 
begin 
    Exclude(FFormState, fsVisible); 
    inherited; 
end; 

Cela va créer une forme d'enfant invisible MDI.

Pour tester cela, vous pouvez créer une nouvelle application MDI dans l'EDI, remplacer la méthode dans la classe sous forme d'enfant comme indiqué ci-dessus, et simulent une longue initialisation:

procedure TMainForm.FileNew1Execute(Sender: TObject); 
var 
    i: integer; 
begin 
    for i := 1 to 10 do begin 
    CreateMDIChild('NONAME' + IntToStr(MDIChildCount + 1)); 
    Update; 
    Sleep(500); 
    end; 
    for i := 0 to MDIChildCount - 1 do 
    MDIChildren[i].Visible := True; 
end; 

Sans la méthode AfterConstruction() substituée il sera créer et montrer un enfant MDI chaque demi-seconde. Avec la méthode surchargée, il les montrera tous après une période occupée de 5 secondes, ce qui vous donnera la chance d'afficher votre écran de démarrage à la place.

Important:

En utilisant LockWindowUpdate() pour réduire le scintillement ou supprimer toute sortie d'écran est faux, faux, faux. Don't do it, lisez la série de Raymond Chen articles sur le sujet pour comprendre pourquoi.

+0

+1 pour un très bien rangé, Delphi seul moyen de le faire. J'ai normalement dû recourir à l'API Win (ShowWindow) pour y parvenir. –

+0

Excellent! C'était exactement ce que je cherchais et avec les conseils de Raymond Chen, je pouvais désactiver le redraw pour le visible: = true loop. Merci beaucoup :) – HeartTune

0

J'ai eu un problème similaire avec les enfants MDI clignotants. Je combinaison de overrinding AfterConstruction et WM_SETREDRAW message de cette astuce: Controlling the placement of fsMDIChild windows in Delphi

SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, False, 0); 
try 
    Child := TChildForm.Create(Self); 
    Child.Left := ...; 
    Child.Top := ...; 
    Child.Show; 
finally 
    SendMessage(Application.MainForm.ClientHandle, WM_SETREDRAW, True, 0); 
    InvalidateRect(Application.MainForm.ClientHandle, nil, True); 
end; 

Et tout fonctionne bien.

0

essayer ce code, il est un travail pour moi

try 
    SendMessage(Application.MainForm.ClientHandle,WM_SETREDRAW,0,0); 
    FormChild:=TBaseChildForm.Create(application); 
    FormChild.Caption:='Form '+IntToStr(n); 
    FormChild.Show; 
finally 
    SendMessage(Application.MainForm.ClientHandle,WM_SETREDRAW,1,0); 
    RedrawWindow(Application.MainForm.ClientHandle, nil, 0, RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_NOINTERNALPAINT); 
end; 
Questions connexes