AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetOpenFileName() bleibt hängen!
Thema durchsuchen
Ansicht
Themen-Optionen

GetOpenFileName() bleibt hängen!

Ein Thema von d3g · begonnen am 6. Aug 2002 · letzter Beitrag vom 6. Aug 2002
Antwort Antwort
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#1

GetOpenFileName() bleibt hängen!

  Alt 6. Aug 2002, 12:39
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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 6. Aug 2002, 12: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.
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.116 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 6. Aug 2002, 12: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.
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
MathiasSimmack
(Gast)

n/a Beiträge
 
#4
  Alt 6. Aug 2002, 13:46
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 ), 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;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 6. Aug 2002, 13:58
Moin Mathias,

stimmt auch wieder
Ich hab mir dafür ein Objekt erstellt, und trenne die Filter mit Pipe.
Blöd
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
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#6
  Alt 6. Aug 2002, 14: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 6. Aug 2002, 14: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)
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 6. Aug 2002, 19:50
@Mathias: Dann fehlt sie bei Nico's Übersetzungen auch, da habe ich es nämlich so gelernt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:36 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