POO

[Résolu]
Signaler
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
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 .

Cette phrase evite aux raleurs de raler ! lol

Merci

CODE :

unit SonObj;

interface

uses  Windows,Bass;

type
  TSon = class (Tobject)
private

  name:string;
  isPlaying : boolean;
  Loaded : boolean;
  stream : HSTREAM;
  erreur: string;

public

  constructor Create(Handle:HWND);
  destructor  Destroy; override;

  function getName():string;
  function getError():string;
  function getPlayed():boolean;
  function getloaded():boolean;
  function getLenght():integer;
  function getPosition():integer;

  procedure play;
  procedure stop;
  procedure resume;
  procedure load(nameSon:string);

end;

implementation

constructor TSon.Create(Handle:HWND);
begin

   Loaded:=false;
   isPlaying:=false;

   erreur:='0';

    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;

7 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
alors, bonne initiative, j'ai deja moi meme coder 2 composant BassPlayer et FModPlayer ...

deja premiere chose, ne fait pas ça :

  function getName():string;

mais
  function GetName : string;

c'est valable pour les autres, ici c'est pas du c++ like, pas besoin de mettre des void ou des parenthese quand il n'y a pas d'arguments.

on utilise egalement la notation en "dos de chameau" et non les conventions de notation des autres langage.
exemple :

incorrect : __get_variable , GET_VARIABLE , getVariable , getvariable , GeTVaRiaBLe , Get_Variable
correct : GetVariable

pour : procedure load(nameSon:string);

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 dans l'objet :

TPlayer ...
private
  fPlayerState : TPlayerState;
public
  property PlayerState : TPlayerState read fPlayerState;
end;

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 :

stream := BASS_StreamCreateFile(False, pchar(SoundName), 0, 0, BASS_STREAM_PRESCAN);

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)

<hr size="2" width="100%" />Croc (click me)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Réponse de Delphiste :
procedure MaFonction;
begin
   //...
end;

Le void du C indique qu'il n'y a pas de valeur de retour. En Pascal, cela correspond à l'utilisation du mot clé Procedure.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.afipa.net/
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
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 ?
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
Merci delphiprog c est bien ce qu'il me semblait
Ciao
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
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;

Bonne journée
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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.

<hr size="2" width="100%" />Croc (click me)
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
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 )

Ciao