Klar gibt es Result=false... bei einer
Exception.
So ganz falsch ist doch dieser Teil nicht oder? Wenn ich den Stream nicht speichern kann, ist die Abfrage false und es wird dann in der aufrufenden Funktion nicht weiter gemacht. Es nützt ja nichts, wenn keine MP3 Datei da ist, dass ich dann den Mediaplayer anwerfe.
Eben nicht! Da die
Exception innerhalb der Function nicht durch ein except abgefangen wird, gelangt sie an den nächsthöheren try-finally bzw. try-except Block. Damit wird die Auswertung der Funktionsrückgabe gar nicht ausgeführt.
Soll also bei einer auftretenden
Exception lediglich ein false zurückgegeben werden, würde sich dieses Konstrukt anbieten:
Delphi-Quellcode:
//kopiert einen Song als Resource in eine Datei
Function CopyStream2File(ResourceID: string; var fName: String): boolean;
var
ResStream: TResourceStream;
begin
try
ResStream := TResourceStream.Create(HInstance, ResourceID, RT_RCDATA);
try
//MP3 File aus Resource laden und in Filesystem ablegen
fName := TPath.Combine(TPath.GetTempPath, 'tmp.mp3');
ResStream.Position := 0;
ResStream.SaveToFile(fName);
Result := True;
finally
ResStream.Free;
end;
except
result := false;
end;
end;
Roter Kasten: Wie Mavarik korrekt bemerkt.