comdlg32.dll-Dateidialog: so für 64bit anpassen

Moderator: ModerationP

comdlg32.dll-Dateidialog: so für 64bit anpassen

Beitragvon micmen » 02. Mai 2020, 00:11

Weil ich im Netz viele Fragen dazu gefunden habe, wie man den Dateidialog Function APT_GetOpenFileName Lib "comdlg32.dll" unter Access 64bit benutzen kann, aber nirgendwo eine vollständige und funktionierende Lösung, will ich die mal wo posten.
Und weil die meisten Texte zu diesem Thema recht alt sind, will ich das mal hier in einem neuen Thread tun.
In meinen Augen ist die Qualität speziell dieses Dateidialogs es wert, diese Anpassung vorzunehmen, statt auf etwas anderes umzusteigen.

Meine hier gezeigten Anpassungen beziehen sich auf die Version des Dateidialogs von Karsten Pries (http://www.mvps.org/access, jetzt http://www.theaccessweb.com), wie er in der KnowHow-MDB 30 drin war. Er scheint mehr oder weniger identisch zu sein mit diesem: Acc2003 - Dateipfad ohne Dateiname - MS-Office-Forum.
Und sie laufen nur unter Access ab 2007, weil ich ältere Versionen nicht unterstützen muß. Ansonsten müßte man bedingte Kompilierung einbauen, damit unter älteren Versionen der Originalcode benutzt wird.

Im Deklarationsbereich müssen unter Private Type TOpenFileName 3 Variablen einen anderen Typ bekommen:
hwndOwner As LongPtr
hInstance As LongPtr
lpfnHook As LongPtr
und die Funktion APT_GetOpenFileName muß deklariert werden:
Private Declare PtrSafe Function APT_GetOpenFileName ..............

In der Funktion ShowOpen() muß im Block With OpenDlg an 2 Stellen die Len-Funktion gegen die LenB-Funktion getauscht werden:
.lStructSize = LenB(...)
.nMaxFile = LenB(...)

Ich hoffe, ich habe jetzt nix vergessen :D , aber definitiv war nur sehr wenig anzupassen, das war ruckzuck erledigt (nachdem ich über Monate mit sehr viel Zeiteinsatz gesucht hatte...).

Und original beinhaltete der Code 4 Funktionen, außer APT_GetOpenFileName noch APT_GetSaveFileName, SHBrowseForFolder und SHGetPathFromIDList, die ich aber nie benötigt habe.
Ich vermute aber mal, daß die Anpassungen dort ähnlicher Art sind.


Ich bin großer Fan dieses Dateidialogs, hatte mich lange Zeit mit der Krückenlösung s.u. rumgeärgert, die onboard dabei ist, und dann nochmal Energie reingesteckt, eine Lösung für meinen "guten alten" Dialog zu finden. Erstens ist er sehr leistungsfähig, vor allen Dingen durch seine vollständige Filterfunktion, zweitens arbeitet er sauber, z.B. ohne irgendwelche verwirrenden Strings im Feld für den gewählten Dateinamen, und drittens arbeitete er jahrelang zu 100% ohne Fehler.
Bei den ersten beiden Punkten versagt die integrierte Lösung, zu erkennen an etwas wie
Dim fd As Office.FileDialog
und
Set fd = Application.FileDialog(DialogTyp)

Wenn die Situation es erfordert, daß der Dialog nur Dateien abcde.pdf akzeptieren darf, dann zeigt dessen Filter auch nichts anderes an, und wenn die Dateien dem Muster *Rechnung*.do* entsprechen müssen, dann nimmt er auch diesen Filter und wendet ihn an. Bei der Krückenlösung muß man immer eine Dateinamen-Überprüfung einbauen und die User mit einer Schleife nerven "Sie haben eine ungültige Datei gewählt, es dürfen nur Dateien XXX gewählt werden", bis sie eine erlaubte Datei gewählt haben.

lg
micmen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 41
Registriert: 20. Apr 2010, 15:58
Wohnort: Frankfurt am Main

Re: comdlg32.dll-Dateidialog: so für 64bit anpassen

Beitragvon mmarkus » 02. Mai 2020, 17:53

Hallo micemen,
schön dass du hier was beitragen möchtest.

Dabei gilt zu bedenken:
In so einem Forum bewegen sich hauptsächlich CPP's (Copy & Paste Programmierer).
Die verstehen im Gegensatz zu dir nur in den seltensten Fällen was ein Pointer ist und
können daher mit dieser Abhandlung wohl recht wenig anfangen.
Die anderen brauchen höchstens eine Minute um die Definition der Struktur und der Funktion aus der Doku von Microsoft zu kopieren.

Mein Vorschlag: Du kopierst das ganze rein, dann haben auch die Kopierer was davon.
Übrigens lt. Doku hat die OpenFileName Struktur mehr als drei Pointer.
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2096
Registriert: 16. Apr 2012, 16:07
Wohnort: Oberösterreich

Re: comdlg32.dll-Dateidialog: so für 64bit anpassen

Beitragvon micmen » 03. Mai 2020, 10:52

Hi mmarkus,
kann sein, daß Du damit richtig liegst.

Ich habe mich für diese Info-Variante entschieden, weil
  • ich selbst meine Kopie des Codes im Lauf der Jahre an vielen Stellen abgeändert hatte, meiner also nicht mehr so ganz universell ist
  • ich das speziell gedacht hatte für User, die den Dialog schon lange nutzen und plötzlich merken, daß er Anpassungen benöigt für 64bit-Office, und die evtl. ebenfalls individuell was verändert hatten und daher am ehesten das Delta benötigen
  • ich vermute, daß es von dieser Lösung inzwischen aktuellere Varianten gibt, und ich es nicht für sinnvoll hielt, wenn Betroffene durch meinen Beitrag auf eine ältere Variante wechseln.
Aber klar, ich kann mal schauen, wo ich die neueste "offizielle" Version davon finde, und die dann anpassen, testen und komplett posten - das hätte noch den Vorteil, daß ich DANN sicher weiß, was geändert werden muß, und was nicht.
micmen hat geschrieben:Übrigens lt. Doku hat die OpenFileName Struktur mehr als drei Pointer.
Ich hatte im letzten Anlauf gem. Tipps, die ich gefunden hatte, einige Stellen geändert, und als das ganze danach zu meiner Freude tatsächlich wieder funktionierte, so viel wieder rückgängig gemacht, bis es "gerade so eben wieder nicht gestört" war - könnte das eine Erklärung sein?

Eigentlich wollte ich so eine Info wie das hier sofort wo posten, nachdem ich den Dialog zum Laufen gebracht hatte, und auch die Links angeben, woher ich Scheibchen für Scheibchen meine Infos hatte - aber dann hatte ich erstmal keine Zeit gehabt, und danach einiges nicht mehr in Erinnerung gehabt...
micmen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 41
Registriert: 20. Apr 2010, 15:58
Wohnort: Frankfurt am Main

Re: comdlg32.dll-Dateidialog: so für 64bit anpassen

Beitragvon x-man117 » 22. Jun 2021, 14:17

Hallo micmen,

herzlichen Dank für deine Hinweise. Danach habe ich bei der Umstellung meiner Anwendung ewig gesucht. Der Dateidialog funktioniert nun unter Access 64bit einwandfrei.
x-man117
 

Re: comdlg32.dll-Dateidialog: so für 64bit anpassen

Beitragvon micmen » 24. Jun 2021, 12:22

x-man117 hat geschrieben:herzlichen Dank für deine Hinweise. Danach habe ich bei der Umstellung meiner Anwendung ewig gesucht.
danke für die Rückmeldung - und freut mich!

Ich will bei der Gelegenheit aber noch etwas anmerken zum letzten Absatz in meinem Eröffnungspost, weil das war nicht ganz unmißverständlich formuliert:
Einer der großen Vorteile dieses Dateidialogs ist die konsequent lückenlose Filtermöglichkeit. Die gibt es in dem direkt davor genannten, von MS gestellten Dateidialog nicht.
Dazu (und nicht etwa zum MS-Dateidialog) sind meine Beispiele gedacht
... er nur Dateien abcde.pdf akzeptieren darf, dann zeigt dessen Filter auch nichts anderes an, und wenn die Dateien dem Muster *Rechnung*.do*
Man hat mit diesem Dateidialog die volle Freiheit und die volle Kontrolle darüber, Dateien welchen Musters von Namen und Dateikennung er (der Dialog) dem User anzeigt und entspr. auch zurückliefern kann/darf oder nicht.

Und zu der Anregung noch, zur Unterstützung für CPP's den kompletten Code hier zu posten:
Erstens bin ich auch in solcher Hinsicht extremst gegen Redundanzen. Ob Mitgliederlisten oder Code oder was auch immer, ich ziehe es immer vor, ein Original zu haben und dann nur noch Deltas zu diesem Original. Wenn es mal 2 "Originale" werden, ein älteres und ein neueres, ist das noch halbwegs sicher handhabbar, aber wenn es schon Kopien gibt, dann vermehren die sich erfahrungsgemäß auch bald weiter.
Und ich finde entgegen des gebrachten Einwands doch, daß mein Text relativ leicht verständlich ist und auch ohne Kenntnisse der Materie für so einen Umbau gut brauchbar wäre. Und was ein Pointer ist, muß man zum Umsetzen ja auch nicht wissen. Es sind insgesamt 6 extrem kleine (einmal ein Wort, sonst sogar nur Buchstaben) Änderungen erforderlich, und die auch nur in 3 verschiedenen Varianten.
Ich möchte meinen Lösungsvorschlag schon lieber so belassen (abgesehen von Zeitgründen, weil ich meinen Dialog ja verändert hatte).

SCHLAAAAND
micmen
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 41
Registriert: 20. Apr 2010, 15:58
Wohnort: Frankfurt am Main


Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste