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.
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'. –
Je l'aurais pensé aussi. Mais les faits sont différents. :-) –
FWIW: InitProc est nul dans l'appel à 'Application.Initialize'. –