2012-04-05 25 views
5

Dieses Problem tritt nur bei Anwendungen auf, die zuvor unter Delphi 7 entwickelt und nach Delphi 2007 unter WinXP migriert wurden.Topendialog zeigt keine Dateierweiterungen an

Ich habe ewig versucht, dieses Problem ohne Glück zu sortieren.

Soweit ich weiß, der Topendialog ist ein Win32-Dialog-Wrapper und es sollte die Windows-Ordner-Optionen erben, die in meinem Fall eingestellt ist, um die Dateierweiterungen aller Dateien anzuzeigen.

Jetzt, wenn ich eine neue Anwendung erstellen und einen Topendialog darauf ablegen, wenn es ausgeführt wird, zeigt es die Dateierweiterungen wie erwartet.

Wenn ich den gleichen Dialog auf eine vorhandene Anwendung ablegen und ausführen, werden die Dateierweiterungen nicht angezeigt.

Wenn ich eine Dateiname Zeichenfolge in die Eigenschaft Dateiname vor dem Aufruf des Dialogfelds a la 'Myfile.txt' schreiben, wenn der Dialog angezeigt wird, wird der Dateiname als 'Myfile' angezeigt, die Erweiterung wird nicht angezeigt und auch nicht Mach irgendwelche Dateien in der Liste.

Hat sonst jemand dieses Verhalten?

Hat jemand irgendwelche Workarounds?

Bearbeiten: Bilder hochgeladen, um Unterschiede zwischen Topendialog bei einem neuen Projekt und bestehenden Projekt angezeigt.

As shown on new project

As shown on existing project

+0

Ich bin nicht sicher, ob das verwandt sein könnte, aber ... "D7 zu D2007 migriert" könnte zu einem Unterschied in Bezug auf Windows-Themen hinweisen. Haben Sie ein Manifest in Ihrer Anwendung (über XPMan oder "Runtime-Designs aktivieren" in den Projektoptionen)? –

+0

Was passiert, wenn Sie 'TOpenDialog' auf einem neu erstellten Formular in Ihrer vorhandenen Anwendung ablegen? Was passiert, wenn Sie zur Laufzeit ein TOpenDialog-Objekt erstellen? – splash

+0

@Andy k: Es wäre etwas hilfreich, wenn Sie Screenshots zur Veranschaulichung des Problems gepostet haben. (Die geöffneten Dialoge können je nach Faktoren ein wenig anders aussehen. Das könnte helfen, das Problem zu erkennen, was mir ehrlich gesagt sehr komisch klingt ...) –

Antwort

3

OK, habe ich eine Abhilfe für dieses Problem.

Es stellt sich heraus, dass das Aufrufen von SHGetSettings an der richtigen Stelle das Problem tatsächlich verhindert.

Also die Problemumgehung ist, es in die Projektquelle gleich zu Beginn zu setzen.

zB

Programm Blah;

verwendet

Forms, shlobj,

blah,
.... etc

{$ R * TLB}

{$ R * .RES}

var ShellFlags: TShellFlagState;

beginnen
SHGetSettings (ShellFlags, SSF_SHOWEXTENSIONS); .....

Ich habe keine Ahnung, warum dies funktioniert, sollte es keinen Unterschied machen, da es nur eine Abfrage ist, aber es funktioniert.

Also, dank Justmade für den Vorschlag, API-Aufruf.