![]() |
GetFileOpenName funktioniert nicht unter TurboDelphi
Hallo,
folgende Funktion läuft unter Delphi 5 völlig problemlos mit allen Windowsversionen und zeigt den Dialog zu Dateiauswahl an. Unter TurboDelphi funktioniert es plötzlich nur noch unter Windows 2000/XP und nicht mehr unter Win 95/98. Da wird der Dialog einfach nicht angezeigt. Zur Funktion: In Filter steht entweder ein einfacher Filter (etwa '*.pas') oder ein komplexer Filter, wobei anstelle der Nullbytes je ein '|' steht. (Im Programm wird der Filer per Tastatur eingegeben.) Die '|' werden also zunächst in #0 umgewandelt. Char255 = Array[0..255] of Char. Ich bin für jeden Hinweis dankbar! Gruß Roland
Delphi-Quellcode:
function DoFileOpen(Window:Hwnd;Filter,Caption:PChar):Boolean;
Var FN, FI:Char255; P :LongInt; ES: String; DIR: Char255; filedlg : TOpenFileNameA; Begin StrCopy(FI,Filter); If StrPos(FI,'|') <> NIL Then Begin StrCat(FI,'|'); For P:=0 To StrLen(FI) Do If Fi[P] = '|' Then Fi[P] := #0; StrCopy(FN,PChar('')); End Else Begin StrCopy(FN,Filter); End; GetDir(0,ES); StrCopy(DIR,PChar(ES)); With filedlg do begin lStructSize := sizeof(filedlg); hwndOwner := Window; hInstance := 0; lpstrFilter := Fi; lpstrCustomFilter := NIL; nMaxCustFilter := 0; nFilterindex := 1; lpstrFile := FN; nMaxFile := 255; lpstrFileTitle := NIL; nMaxFileTitle := 0; lpstrInitialDir := DIR; lpstrTitle := Caption; nFileOffset := 0; nFileExtension := 0; lpstrDefExt := '*.*'; lCustData := 0; Flags := OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST or OFN_EXPLORER; end; DoFileOpen := GetOpenFileName(filedlg); StrCopy(Filter, filedlg.lpstrFile); End; |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Eine andere Frage in dem Zusammenhang: Warum rufst du dieses selber auf? Warum nutzt du keinen TOpenDialog?
|
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Herzlich willkommen in der Delphi-PRAXiS, RGH.
Du solltest den Rückgabewert deiner Funktion überprüfen:
Delphi-Quellcode:
Bei 0 hat der Benutzer den Dialog abgebrochen, sonst Windows. Vermutlich ist der Rückgabewert 1 = CDERR_STRUCTSIZE. Eventuell findest du im Quelltext der Unit (bei mir CommDlg) eine Konstante, mit der du das Problem beheben kannst.
if not DoFileOpen(Handle, '', 'do not fear') then
ShowMessage(IntToStr(CommDlgExtendedError)); Freundliche Grüße vom marabu |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Ich hätte jetzt zwar GetLastError vorgeschlagen, darüber bekommt man ja auch so'ne Info wie falsche Strukturgröße, aber wenn es da 'ne besserere Funktion gibt .... um so besser :)
(bei mir hatte GetLastError bei 'nem ähnlichen Fall auch ganz gut geholfen) PS: solange man nicht versucht die UnicodeFunktion (GetOpenFileNameW, TOpenFileNameW) zu verwenden, sollte es eigentlich "immer" funktionieren. PS2: muß lpstrFilter und lpstrFile nicht mit #0#0 abgeschlossen werden? |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Zitat:
Das Problem ist ja, daß es mit Delphi 5 100%ig funktioniert und mit TurboDelphi nur noch unter Windows XP bzw. Windows 2000. Ich finde es reichlich seltsam, daß der Fehler betriebssystemabhängig bzw. Delphi-Versions-abhängig auftaucht. |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Les dir in meinen
![]() Ich habe mir das ganze mal in einer Funktion gekapsetl, da ich das öfters gebraucht habe:
Delphi-Quellcode:
IsNT5OrHigher ist eine eigenen Funktion. Was sie macht sollte klar sein. ;)
function OpenFile(hParent: THandle; Filter: string): string;
var ofn : TOpenFilename; Buffer : array[0..MAX_PATH - 1] of Char; begin result := ''; ZeroMemory(@Buffer[0], sizeof(Buffer)); ZeroMemory(@ofn, sizeof(TOpenFilename)); if IsNt5OrHigher then ofn.lStructSize := sizeof(TOpenFilename) else ofn.lStructSize := OPENFILENAME_SIZE_VERSION_400; ofn.hWndOwner := hParent; ofn.hInstance := hInstance; ofn.lpstrFile := @Buffer[0]; ofn.nMaxFile := sizeof(Buffer); ofn.Flags := OFN_EXPLORER; ofn.lpstrFilter := PChar(Filter); { Datei-Öffnen-Dialog aufrufen } if GetOpenFileName(ofn) then result := ofn.lpstrFile; end; Und in den uses moch CommDlg mit aufnehmen. Zu finden auch in meinen MpuTools.pas -> ![]() |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Hallo,
ich habe es jetzt hinbekommen: Ich habe einfach mal die commdlg.pas aus Delphi 5 (es zahlt sich eben doch aus, wenn man in die Pro-Version mit Quellcodes investiert) in mein Projektverzeichnis kopiert und siehe da, jetzt klappt es auch mit der Nachbarin, äh ... bzw. deren Windows 95 und 98! Zuvor hatte ich natürlich die Units verglichen: DIe TOpenFile-Struktur hat in TurboDelphi ein paar Felder, 3 um genau zu sein, mehr. Der ganze Rest ist, bis auf einige Definitionen für andere Betriebssysteme, identisch. Ich nehme nun einfach an, daß Windows 95 und 98 diese Felder noch nicht kennen und daher eben den Dialog nicht anzeigen. BTW: der CommDlgExtendedError war unter Win 9x "1", während GetLastError "0" ergab. Kurz: Hier wäre vielleicht im Quellcode der Unit ein Compilerschalter angebracht gewesen, der zwischen Win 9.x und NT/XP unterscheidet. Gruß Roland |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Und was waren das für Fehler? Und wozu soll ein Compilerschalter gut sein? Willst du es jedes mal wieder neu compilieren für Windows 95/98 und Windows 2000/XP? Sinnvoller wäre es hier die Fehler zu benennen und wie man sie behebt. Und natürlcih das ganze an Borland zu melden, damit die es korrigieren können.
Nachtrag: 1 deutet doch daraufhin, dass die Strukturgröße nicht gepasst hat. Siehe dazu auch meinen Code. Versuch den mal mit der CommDlg.pas von Turbo Delphi auszuführen. Ich habe leider kein Turbi Delphi da. |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Moin Roland,
Zitat:
Wenn Du Dir mal die Dokumentation zu ![]() Es geht auch ohne die Unit aus D5. Du musst halt nur die kleinere Strukturgrösse angeben. |
Re: GetFileOpenName funktioniert nicht unter TurboDelphi
Zitat:
Zitat:
Jetzt frage ich mich natürlich, ob Microsoft auch noch anderswo Strukturgrößen geändert hat und Probleme auftauchen können. Gibt es irgendwo eine Liste derartiger Änderungen? Aber zuerst mal Herzlichen Dank für die Hilfe und ich kann mit meinem Projekt weitermachen! Gruß Roland |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz