avaaminen. Miten onnistuisi tehdä ohjelma, joka avaa esim. MediaPlayerin soittamaan jotain teittyä kappaletta, tai selaimen avaamaan jonkun tietyn osoitteen? Olisiko esimerkkejä vaikkapa Pascalille, C :lle tai Windowsin skriptiin?
Kysyvä ei tieltä eksy.
Kysyvä ei tieltä eksy.
Vastaukset 4
Vanhimmat
MS media player + Delphi
tällä yhdistelmällä homma on helppo!
1. importoi MS Media Player Delphiin ActiveX -komponenttina.
HUOM: älä hyväksy oletusnimeä TMediaPlayer (koska se menee päällekkäin Delphin oman TMediaPlayer -komponentin kanssa, mikä aiheuttaa importoinnin epäonnistumisen, koska et voi asentaa 2 samannimistä komponenttia).
Siis muuta nimi vaikka TMsMediaPlayer:iksi.
2. kun olet importoinut nimellä TMsMediaPlayer, voit suoraan pudottaa formille TMsMediaPlayer -komponentin, jolloin Delphi luo koodia näin:
MsMediaPlayer1:TMsMediaPlayer;
en muista ulkoa, mutta menisiköhän suunnilleen näin:
esim Button1Click -metodiin:
MsMediaPlayer1.FileName := 'C:\polkunimi\biisi.mp3';
MsMediaPlayer1.Play;
tuo ei tosin avaa erillistä media playeria, vaan käyttä MS Media Playeria osana omaa Delphi -ohjelmaasi.
Jos välttämättä haluat avata erillisen playerin, googleta netistä: msdn createprocess
huom: jos em. importoimasti TMsMediaPlayer aiheuttaa ongelmia Delphin IDE.ssä tai omassa ohjelmassasi "Access violation" -ilmoitusten muodossa, voi ongelmaa yrittää ratkaista lisäämällä WMDestroy -käsittelijän määreellä:
message WM_Destroy;
tuohon sitten laitat tällasta:
procedure WMDestroy(Message:TWmDestroy);
begin
FreeAndNil(MsMediaPlayer1);
inherited;
end;
Jos Access violation aiheutuu Delphin IDE:ssä, niin silloin kannattaa tehdä näin:
1. Importoi em. TMsMediaPlayer
2. periytä siitä oma luokka TFixedMsMediaPlayer
omassa TFixedMsMediaPlayer -luokassa tee tarpeelliset muutokset/täydennykset, jotta komponentti osaa vapauttaa itsensä oikein
aiheuttamatta poikkeuksia.
em. ongelma johtuu Microsoftin ja Borland Delphin erilaisesta järjestyksestä tehdä komponentin tuhoamiseen ja ohjelman lopettamiseen liittyviä asioita.
Jos et halua tai osaa kikkailla em. ongelmien kanssa, voi 1 ratkaisu olla myös tämä:
ÄLÄ pudota formille TMsMediaPlayeria, vaan luo se omassa koodissasi esim. formin OnCreate -metodissa:
MsMediaPlayer := TMsMediaPlayer.Create(Self);
ja laita sekä em. WMDestroy että OnDestroy -metodiin sama FreeAndNil(MsMediaPlayer);
ensimmäinen kutsu vapauttaa playerin JA asettaa siihen viittaavan formin kentän arvoon NIL.
Jälkimmäinen FreeAndNil ei tee mitään, kun huomaa, että kenttä on jo NIL.
Juuri tästä syystä FreeAndNil on parempi kuin pelkkä Free; pelkkä Free vapauttaa olion, muttei nollaa siihen liityvää muuttujaa, siksi uusi Free -kutsu yrittää vapauttaa toiseen kertaan jo vapautettua oliota, mistä seuraa hankaluuksia (yleensä Access Violation, mutta muitakin harmeja saattaa olla luvassa).
Tässä samalla malliesimerkki siitä, mitä hyötyä on ActiveX:stä: sen avulla saat Microsoftin tekemän Mediaplayerin toimimaan aivan kuin se olisi Delphi -komponenttti (siitä voi jopa periyttää uusia Delphi -komponentteja).
MS Internet Explorer löyty Delphistä valmiina ActiveX -komponenttina: TWebBrowser.
sen käytöstä esim Henri Fournier on kirjoitellut paljon asiaa (googleta).
Vaihtoehtona myös TEmbeddedWB (ei kuulu Delphiin vakiona, mutta googleta tuolla nimellä tai bsalsa).
huom: TEmbeddedWB tunkee omiaan http GET/POST -pyyntöjen useragent -kenttään, ja mikä pahinta, tämä koskee samaan aikaan käynnissä olevaa MS-IE:tä myös !
Onneksi TEmbeddedWB on avointa lähdekoodia (tehty 100% Delphillä), joten tutki koodia, ja korjhaa sen useragent :iin liittyvät muutokset!
helpoin tapa: etsi ja poista kaikki kohdat, joissa kirjoitetaan windows rekisteriin!
varoitus: normaalisti tuo tekee muutokset käynnistettäessä, ja kumoaa tekemänsä muutokset ohjelmaa lopetettaessa.
Jos joudut lopettamaan debugatessa "tapa ohjelma" toiminnolla (tai Delphin Ctrl-F2), niin rekisteri saattaa jäädä muutettuun tilaan.
Tuo useragent -käsittely siis on tehty TEmbeddedWB -komponentissa kirjoittamalla windows rekisteriin ylimääräisiä, jotka muuuttavat MS-IE:n (sekä itsenäisen ohjelman että ActiveX -version) käytöstä.
voit tutkia asiaa vaikkapa ennen/jälkeen testillä vaikkapa ShieldsUp -sivustolla ( http://www.grc.com )
Olipa pitkä ja perusteellinen vastaus. Kiitos paljon! Onnistuin avaamaan selaimen ShellExecute-komennolla. MediaPlayeria en ole viel kokeilut... vielä kysyttävää, mutta teen sen uudella avauksella.
mikä sulla on yh-äitejä vastaan?
Ratkaisu: AccessViolation
Jos importoitu TMsMediaPlayer aiheuttaa AccessViolation -ilmoituksia formille pudotettuna, ratkaisu löytyy tältä... en muistanut, että olen joskus aikoja sitten jo postannut tänne ratkaisun tähänkin ongelmaan...
katsopa allaolevasta linkistä:
http://keskustelu.suomi24.fi/show.fcgi?category=108&conference=652&posting=22000000001757002#22000000001757002