AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetFileOpenName funktioniert nicht unter TurboDelphi
Thema durchsuchen
Ansicht
Themen-Optionen

GetFileOpenName funktioniert nicht unter TurboDelphi

Offene Frage von "RGH"
Ein Thema von RGH · begonnen am 30. Sep 2006 · letzter Beitrag vom 30. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
RGH

Registriert seit: 30. Sep 2006
Ort: Nußloch
4 Beiträge
 
Turbo Delphi für Win32
 
#1

GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 14:30
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;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 15:15
Eine andere Frage in dem Zusammenhang: Warum rufst du dieses selber auf? Warum nutzt du keinen TOpenDialog?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 15:31
Herzlich willkommen in der Delphi-PRAXiS, RGH.

Du solltest den Rückgabewert deiner Funktion überprüfen:

Delphi-Quellcode:
if not DoFileOpen(Handle, '', 'do not fear') then
  ShowMessage(IntToStr(CommDlgExtendedError));
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.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 15:52
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?
$2B or not $2B
  Mit Zitat antworten Zitat
RGH

Registriert seit: 30. Sep 2006
Ort: Nußloch
4 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 17:03
Zitat von Muetze1:
Eine andere Frage in dem Zusammenhang: Warum rufst du dieses selber auf? Warum nutzt du keinen TOpenDialog?
Ganz einfach: weil es sich um eine reine Pascal-Anwendung ohne VCL und ähnlichem handelt und ich nicht wegen dieser beiden Dialoge, die mir die Windows-API ja bereits bietet, die Dialog-Unit einbinden möchte.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 17:15
Les dir in meinen WinAPI Tutorials Kapitel 2 "Standarddialoge" durch. Ab Windows 2000 ist die Struktur größer.

Ich habe mir das ganze mal in einer Funktion gekapsetl, da ich das öfters gebraucht habe:
Delphi-Quellcode:
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;
IsNT5OrHigher ist eine eigenen Funktion. Was sie macht sollte klar sein.

Und in den uses moch CommDlg mit aufnehmen. Zu finden auch in meinen MpuTools.pas -> http://www.michael-puff.de/dirindex....phi/Sonstiges/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
RGH

Registriert seit: 30. Sep 2006
Ort: Nußloch
4 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 17:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 17:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 17:41
Moin Roland,

Zitat von RGH:
Ich nehme nun einfach an, daß Windows 95 und 98 diese Felder noch nicht kennen und daher eben den Dialog nicht anzeigen.
So ist es.
Wenn Du Dir mal die Dokumentation zu MSDN-Library durchsuchenGetOpenFilename durchliest, bzw. Luckies Beitrag:
Es geht auch ohne die Unit aus D5. Du musst halt nur die kleinere Strukturgrösse angeben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
RGH

Registriert seit: 30. Sep 2006
Ort: Nußloch
4 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: GetFileOpenName funktioniert nicht unter TurboDelphi

  Alt 30. Sep 2006, 18:47
Zitat von Luckie:
Und wozu soll ein Compilerschalter gut sein? Willst du es jedes mal wieder neu compilieren für Windows 95/98 und Windows 2000/XP?
Natürlich hast Du recht, das war etwas zu kurz gedacht!

Zitat:
Nachtrag: 1 deutet doch daraufhin, dass die Strukturgröße nicht gepasst hat.
Genau das war das Problem!

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz