ŁF napisał(a)
odtwórz synchronicznie w osobnym wątku. główny wątek możesz spokojnie zamknąć (np. przez Form.Close()), system poczeka na zamknięcie procesu aż każdy z jego wątków zakończy działanie, więc dźwięk odtworzy się do końca.
tylko nie używaj terminate, bo ubijesz cały proces.
zrobilem jak napisales. niestety system nie jest dla mnie laskawy i ubija od razu caly proces :/
/////////////////////
rozwiazanie (tak mniej-wiecej, napisane "na brudno" dla sprawdzenia czy dziala):
procedure PlaySoundExecAndTerminate(filename:String);
var pos, len:array[0..32] of char;
snd:String;
err:MCIERROR;
begin
form1.timer1.Enabled:=false;
snd:=ini.ReadString('sounds', 'execute', '');
mciSendString(PChar('open "'+snd+'" type waveaudio alias myNav'),nil,0,0);
form1.Hide; windows.ShowWindow(form1.hnd, sw_hide);
mciSendString('play myNav', nil,0,0);
shellexecute(0,'open',PChar(filename),nil,nil, sw_show);
repeat
err:=mciSendString('status myNav position', @pos, 32,0);
mciSendString('status myNav length', @len, 32,0);
application.ProcessMessages;
until (String(pos)=string(len)) or (err<>0);
mciSendString('close myNav', nil,0,0);
application.Terminate;
end;