Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 2013
-
3 mars 2007 à 17:32
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 2013
-
5 mars 2007 à 19:25
Bonjour tout le monde ,
Vu que j'ai commencé la programmation oriente object millieu de Janvier a l'ecole ( applique en Java ) me suis dit qu'il etait peut etre temps de s'y mettre en Delphi ...
Alors je me suis fait les premiers objects habituels (genre Rectangle,Television ,... )
Apres j'ai pense a autre chose : faire un lecteur mp3 (comme ceux qui pullulent sur DelphiFr (!) ms en OO (et pas un lecteur se basant sur TmediaPlayer ms sur Bass(j'aime bien Bass !!!) ).
J'ai commence l'ecriture de ma classe sonObj et j'aimerai bien savoir si vs pensez que c'est bien comme ca qu'il faut faire ...
J'ai un probleme (enfin je pense) quand je ferme mon application je demande que mon object soit detruit (je pense que c'est normal ca , non? )
Mais a cause de ca , mon application prend bien 2 sec pour se fermer ( et ca je pense pas que ca soit normal ? )
Enfin je vous mets le code , je ne demande pas de me le corriger ms bien de le regarder pour me dire tout de suite ce qui ne va pas Comme ca ,cela m'evite de me prolonger dans mes erreurs .
function getName():string;
function getError():string;
function getPlayed():boolean;
function getloaded():boolean;
function getLenght():integer;
function getPosition():integer;
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
begin
erreur:='mauvaise version de DLL';
exit;
end;
if not BASS_Init(-1, 44100, 0, Handle, nil) then
erreur:='impossible d''initialiser bass';
end;
destructor Tson.Destroy;
begin
Bass_StreamFree(stream);
Bass_Free();
inherited;
end;
function Tson.getError():string ;
begin
result:=erreur;
end;
function Tson.getName():string;
begin
result:=name;
end;
function Tson.getPlayed():boolean;
begin
if(Bass_ChannelIsActive(stream)=BASS_ACTIVE_PLAYING) then
result:=true
else
result:=false;
end;
function Tson.getloaded():boolean;
begin
result:=Loaded;
end;
function Tson.getLenght():integer;
begin
result:=Bass_ChannelGetLength(stream);
end;
function TSon.getPosition():integer;
begin
result:=Bass_ChannelGetPosition(stream);
end;
procedure TSon.load(nameSon:string);
begin
if(Loaded=true) then Bass_StreamFree(stream);
isPlaying:=false;
Loaded:=false;
stream := BASS_StreamCreateFile(False, PChar(nameSon), 0, 0, 0);
if(stream=0)then
begin
erreur:='impossible de charger le son';
exit;
end;
name:=nameSon;
Loaded:=true;
end;
procedure TSon.play;
begin
Bass_ChannelPlay(stream,True);
isPlaying:=true;
end;
procedure Tson.stop;
begin
isPlaying:=false;
Bass_ChannelStop(stream);
end;
procedure Tson.resume;
begin
isPlaying:=true;
Bass_ChannelPlay(stream,False);
end;
mieux vaux faire : procedure Load(const SoundName : string);
le parametre Const permet d'augmenter les performances quand on passe les chaines en argument de methodes.
les identifiants respectent la meme convention d'ecriture que les identifiants de methode (voir plus haut).
On essaye toujours de traduire correctement en anglais et non faire du franglais ... par contre on peu coder en anglais et commenter en francais.
pour la creation c'est bien comme cela qu'il faut proceder, d'autre methode existe, plus complete, mais l'important c'est d'avoir la base ...
pour la methode :
function Tson.getPlayed():boolean;
begin
if(Bass_ChannelIsActive(stream)=BASS_ACTIVE_PLAYING) then
result:=true
else
result:=false;
end;
tu peu raccourcir tout cela en faisant :
function TSon.Played : boolean;
begin result :Bass_ChannelIsActive(stream) BASS_ACTIVE_PLAYING;
end;
rappel : il y a aussi une convention pour le nom des methodes et propriétés, on doit eviter de mettre des verbes conjugués ou des phrase non-sens.
GetPlayed ne veux rien dire.
le mieux est Played (ça c'est correct) ou PlayProgress
mais le mieux serait encore de condenser comme cela :
type
TPlayerState = (psPlay, psStop, psPause, psStreamReady, psStreamError);
et on change la valeur de fPlayerState dans les methodes Play, Stop, Pause, Load, Create ...
cela permettras d'ajouter en souplesse et possibilitée de control interne et externe pour securisé l'utilisation et limiter les erreur d'actions.
tu peu aussi initialiser le stream de cette façon :
regarde l'aide pour le parametre BASS_STREAM_PRESCAN, il me semble si je me rappel que ça limite les erreurs et que ça augmente un peu les performances. (a verifier)
par contre, tu as une trés grosse erreur de liberation de stream :
le BASS_StreamCreateFile doit etre dans la methode Play et le BASS_StreamFree dans la methode Stop.
pense egalement a verifier l'etat du player avant d'appeler les methodes.
Stop : uniquement si psPlay
Play : uniquement si psStreamReady, psPause ou psStop
Pause : uniquement si psPlay ou psPause (inversion de l'etat et reprise de la lecture)
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 4 mars 2007 à 05:15
merci beaucoup pour les renseignements foxi ... ca me sera tres utiles.
c est deja grace a ta source balls version object que j'ai apris en delphi comment faire un constructeur,destructeur etc ... et la c est encore grace a toi que j apprends de nouvelles choses ...
tu es vraiment l'meilleur ;)
Allez j'applique tt ca et j'espere que pr de nouvelles question tu seras tjs la .
Merci
Ciao
PS : pour tt ce qui ressemble a du "c++ like", normal c est pcq j'ai appris le C : question d'habitude...
D'ailleurs j'ai une autre question , en delphi comment fait t on ceci
void mafonction(void)
{
...
}
comment traduit on le void de retour avec
function maFonction: ???
Re ! avec procedure ?
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 5 mars 2007 à 16:43
Salut,
Au fait j'aurais besoin , s'il vs plait , d'une autre explication .
Le destructeur est-il obligatoire ?
A la fin du programme qd on quitte la form , tt les object qu'elle utilise ne sont-ils pas libere ?
Donc faire
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
MonObject.destroy
end;
est -ce vraiment utiles ?
J'ai lancé le gestionnaire des taches pour en etre bien sur et qe je le mette ou non a la fermeture de ma Form , je retrouve la charge dedié initiale (juste avant le lancement de mon appli)
Prq je demande ca : pcq qd j'appel MonObject.destroy , il lui faut 2 sec pour quitter le prog et cela sans gain.
Merci
ds mon destructeur
destructor Tson.Destroy;
begin
Bass_Free(); // bon c plus l'code ms j'ai d'abbord teste si Bass etait init avant de faire ca ...
// j'ai essayer en testant et sans teste et aucune difference, tjs 2 sec pr quitter ...
inherited;
end;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 5 mars 2007 à 17:41
oui le destructeur est obligatoire!
de plus, ne l'appel pas avec Objet.Destroy mais Objet.Free ou FreeAndNil(Objet)
bien que FreeAndNil ne soit pas réellement necessaire a la fin d'un programme puisqu'il serait plutot utile quand on libere des objet pendant l'utilisation du programme.
ensuite, Bass_Free peut etre appeler sans verification il me semble puisqu'il verifie logiquement si Bass est chargée.
si ton objet mets du temps a se liberer c'est qu'il y a un probleme quelque part ou que ton PC n'est pas puissant.
si tu veux, tu peu uploader ta source complete et m'envoyer le liens par MP, je regarderais le code dans son ensemble comme cela,
et pourrait te dire quoi corriger.
Nicolas___
Messages postés992Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention24 avril 20131 5 mars 2007 à 19:25
Merci de ta propo Foxi ,
j'rentre chez moi et je fais ca alors .
Pour le pc si il es deja plus assez puissant , j'me suicide ! j'ai achete debut du mois de septembre
(Enfin je sais bien que ce n'est pas ca ! ou alors jouer du son c'est vraiment un truc de fou )