Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetOpenFileName() bleibt hängen! (https://www.delphipraxis.net/534-getopenfilename-bleibt-haengen.html)

d3g 6. Aug 2002 11:39


GetOpenFileName() bleibt hängen!
 
Hi Leute,

bei mir häufen sich im Moment die Probleme :(

Also, ich benutze folgende Funktion:
Code:
procedure OpenFile(Handle: hWnd);
var
  Buf: array[0..MAX_PATH] of Char;
  ofn: TOpenFileName;
begin
  ZeroMemory(@Buf, SizeOf(Buf));
  ofn.lStructSize := SizeOf(TOpenFileName);
  ofn.hWndOwner := Handle;
  ofn.hInstance := hInstance;
  ofn.lpstrFilter := 'All playable files (*.wav, *.mid[i], *.rmi, *.mid)|' +
                       '*.wav; *.mid; *.midi; *.rmi; *.mid|' +
                     'Wave files (*.wav)|*.wav' +
                     'Sequencer files (*.mid[i], *.rmi)|*.mid; *.midi; *.rmi' +
                     'Audio CD tracks (*.cda)|*.cda';
  ofn.nFilterIndex := 0;
  ofn.lpstrFile := Buf;
  ofn.nMaxFile := SizeOf(Buf);
  ofn.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES;
  ofn.pvReserved := nil;
  ofn.dwReserved := 0;

  if GetOpenFileName(ofn) then begin
    mciSendString('close sound', nil, 0, 0);
    FileName := Buf;
    mciSendString(PChar('open "' + FileName + '" alias sound'), nil, 0, 0);
  end;
end;
Mein Problem dabei: das Programm bleibt hängen und ich hab keine Ahnung warum. Ich habe bei Luckie nachgeschaut und der macht es nicht sonderlich anders als ich...

Kann mir jemand von euch sagen, was ich falsch mache?

Danke schonmal,
d3g

Luckie 6. Aug 2002 11:46

Nur mit den einen Unterschied, dass ich TOpenFilename global deklariere. Ich hatte es auch mal lokal, da hat er mir den Dialog gar nicht angezeigt. Versuch es mal so und dann meld dich mal wieder.

Empfehlung am Rande: Immer die aktuelle Version der Tutorials benutzen. Zu finden auf einer Webseite ihres vertrauens.

Christian Seehase 6. Aug 2002 11:47

Moin d3g,

was mir sofort ins Auge gesprungen ist:

Du beendest die Filter nicht mit |.


In diesen Zeilen fehlt das jeweils am Ende.
Code:
                     'Wave files (*.wav)|*.wav' + 
                     'Sequencer files (*.mid[i], *.rmi)|*.mid; *.midi; *.rmi' + 
                     'Audio CD tracks (*.cda)|*.cda';
Ausserdem muss die Liste noch zusätzlich mit einem weiteren #00 abgeschlossen werden.
Also so:

Code:
                     'Wave files (*.wav)|*.wav|' + 
                     'Sequencer files (*.mid[i], *.rmi)|*.mid; *.midi; *.rmi|' + 
                     'Audio CD tracks (*.cda)|*.cda|'+#00;
Probier doch mal, ob das schon hilft.

MathiasSimmack 6. Aug 2002 12:46

Zitat:

Zitat von PSDK
lpstrFilter
Pointer to a buffer containing pairs of null-terminated filter strings. The last string in the buffer must be terminated by two NULL characters.

Siehste, Luckie, wieder was zum Korrigieren. Im Beispiel der Tutorials (natürlich immer noch auf der Webseite Ihres Vertrauens :wink:), fehlt die Doppel-Null am Ende.

Aber Pipes, Christian? Nee ... Pipes nur bei den VCL-Versionen der Dialoge. Der Filter "meines" Quälcode-Formatters sieht z.B. so aus:
Code:
[b]const[/b]
  Filter = 'Pascal-Dateien (*.pas, *.dpr, *.inc)'#0'*.pas;*.dpr;*.inc'#0'Alle Dateien (*.*)'#0'*.*'#0#0;

Christian Seehase 6. Aug 2002 12:58

Moin Mathias,

stimmt auch wieder :oops:
Ich hab mir dafür ein Objekt erstellt, und trenne die Filter mit Pipe.
Blöd :mrgreen:

d3g 6. Aug 2002 13:19

Hi Leute,

Danke, das globale Deklarieren war's wohl.

@Luckie: Ich habe auf deiner Website nachgesehen.

Was die Trennstrichre angeht: Mysterien meiner Zwischenablage, Teil 65535. Bei mir stehts nämlich schon lange so. Ich habe angefangen die Frage zu schreiben, ahb was im PSDK nachgeschaut. Da ist mit das #0 statt '|' aufgefallen. Ich habs geändert, kopiert, in das Eingabefeld hier kopiert und weitergeschrieben. Da lag scheinbar noch die alte Version drin :(

@Christian: Ist es nicht so, dass ab Delphi 4 Delphi nullterminierte Strings automatisch mit #00 abschließt (solange man sie nicht als Speicherpointer benutzt), oder verwechsle ich da was?

MfG,
d3g

Christian Seehase 6. Aug 2002 13:38

Moin d3g,

ob das ab D4 der Fall ist könnte ich jetzt nicht mit Bestimmtheit sagen, aber zumindest ab D5 werden Strings automatisch nullterminiert, aber:
Einträge einer Filterliste werden durch #00 getrennt, und das Ende der Liste muss deshalb mit #00#00 beendet werden. Da automtisch nur eine Null hinzugefügt wird, muss man am Ende noch eine hinzufügen.

Wäre es eine Unicodeliste, müsste die Anzahl der Nullen sogar jeweils verdoppelt werden, da hier ja jedes Zeichen zwei Byte belegt.

Die doppelte Null am Ende dürfte wohl bei allen in dieser Art aufgebauten Listen gelten (siehe auch SHFileOperation, oder REG_MULTI_SZ)

Luckie 6. Aug 2002 18:50

@Mathias: Dann fehlt sie bei Nico's Übersetzungen auch, da habe ich es nämlich so gelernt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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