2013-05-22 1 views
4

Dans une petite application, je souhaite afficher une boîte de dialogue ouverte avant la création du formulaire principal. Je le fais comme ça dans le * .dpr:Création de boîtes de dialogue Vista + avant la création de la forme principale

begin 
    Application.Initialize; 
    Init; // <========================================= 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

Lorsque j'utilise la procédure suivante Init:

procedure Init; 
var 
    OpenDialog: TOpenDialog; 
begin 
    TheFileName := '(nix)'; 

    OpenDialog := TOpenDialog.Create(nil); 
    try 
    if OpenDialog.Execute then 
     TheFileName := OpenDialog.FileName 
    else 
     Exit; 
    finally 
    OpenDialog.Free; 
    end; 
end; 

il n'y a pas de dialogue montré sous Windows 7. Je peux résoudre ce problème en mettant à UseLatestCommonDialogs Faux mais j'aimerais éviter cela. Modification de la procédure Init à

procedure Init; 
var 
    OpenDialog: TOpenDialog; 
begin 
    TheFileName := '(nix)'; 

    CoInitialize(nil); 
    try 
    OpenDialog := TOpenDialog.Create(nil); 
    try 
     if OpenDialog.Execute then 
     TheFileName := OpenDialog.FileName 
     else 
     Exit; 
    finally 
     OpenDialog.Free; 
    end; 
    finally 
    CoUninitialize; 
    end; 
end; 

fonctionne. Cependant, je ne sais pas si je suis le droit CoInitialize/CoUninitialize, .: par exemple

  • Dois-je gâcher quelque chose en appelant CoUninitialize si tôt? Avoir à "connaître" le fait que TOpenDialog utilise en interne (parfois) COM sent comme une fuite d'abstraction que je préfère éviter.

Edit: J'ai trouvé un peu mieux: Si j'ajoute ComObj-uses clause que je peux omettre les appels CoInitialize/CoUninitialize du DPR. Le problème de l'abstraction qui fuit tient toujours, bien sûr.

+0

Je ne peux pas reproduire ce que vous décrivez. Cela ne sonne pas non plus vrai car 'CoInitialize' est appelée dans' Application.Initialize'. –

+0

Je l'aurais pensé aussi. Mais les faits sont différents. :-) –

+0

FWIW: InitProc est nul dans l'appel à 'Application.Initialize'. –

Répondre

3

Il semble que le problème est que COM n'est pas en cours d'initialisation. Cela se produit normalement dans Application.Initialize en raison de la procédure d'initialisation qui est ajoutée en utilisant ComObj. Mais vous signalez dans un commentaire que InitProc est nil à l'intérieur Application.Initialize qui indique que ComObj n'est pas inclus dans votre projet. Vous pouvez donc résoudre le problème facilement en incluant ComObj dans votre projet. Ou si vous voulez être explicite à ce sujet, appelez CoInitilize(nil) au tout début de votre fichier .dpr.

+0

C'est ce que je ferai pour l'instant. Par curiosité: Vous n'avez pas à faire cela sur votre système? Utilisez-vous D2007? Emba a probablement fixé Dialogs.pas pour configurer toutes les exigences par lui-même après D2007. –

Questions connexes