![]() |
GetOpenFileName() bleibt hängen!
Hi Leute,
bei mir häufen sich im Moment die Probleme :( Also, ich benutze folgende Funktion:
Code:
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...
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; Kann mir jemand von euch sagen, was ich falsch mache? Danke schonmal, d3g |
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. |
Moin d3g,
was mir sofort ins Auge gesprungen ist: Du beendest die Filter nicht mit |. In diesen Zeilen fehlt das jeweils am Ende.
Code:
Ausserdem muss die Liste noch zusätzlich mit einem weiteren #00 abgeschlossen werden.
'Wave files (*.wav)|*.wav' +
'Sequencer files (*.mid[i], *.rmi)|*.mid; *.midi; *.rmi' + 'Audio CD tracks (*.cda)|*.cda'; Also so:
Code:
Probier doch mal, ob das schon hilft.
'Wave files (*.wav)|*.wav|' +
'Sequencer files (*.mid[i], *.rmi)|*.mid; *.midi; *.rmi|' + 'Audio CD tracks (*.cda)|*.cda|'+#00; |
Zitat:
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; |
Moin Mathias,
stimmt auch wieder :oops: Ich hab mir dafür ein Objekt erstellt, und trenne die Filter mit Pipe. Blöd :mrgreen: |
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 |
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) |
@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 01:21 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