Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Code opdelen in classes

  1. #1

    Question Code opdelen in classes

    Ik ben bezig met een project waar ik verschillende audio/video playlists wil kunnen bewerken, en waar ik voorheen alles in een class had gebouwd wil ik dit nu wat meer opdelen.

    Nu heb ik een aparte class gemaakt die het M3U bestandsformaat kan parsen, en dit wegschrijft naar een class TPlaylist, op deze manier kan ik verschillende parsers maken die allemaal kunnen wegschrijven naar de classe TPlaylist. Dit gaat allemaal prima, maar nu loop ik tegen een paar dingen aan en zou graag jullie advies hebben.

    Ik zou graag naar verschillende formaten kunnen opslaan (bijvoorbeeld .tv bouquets, of JSON). Zou ik dit in de classe TPlaylist moeten/kunnen inbouwen of is het beter om een extra class te maken die het wegschrijven naar een bestand doet? Zo dat ik hierop bijvoorbeeld een class maak die M3U formaat schrijft, en een die naar JSON wegschrijft?

    Ook loop ik tegen hetzelfde aan met een Undo/Redo manager, zou ik dit het best in een losse class zetten of is het verstandig dit in de TPlaylist class zelf te doen? Als ik deze in de TPlaylist class zet lijkt het mij makkelijker om meerdere documenten te kunnen gebruiken omdat elke playlist zo zelf de wijzigingen bij houdt.

    het is namelijk de bedoeling dat ik hierdoor makkelijker kan uitbreiden naar andere formaten, en nieuwe functionaliteit kan toevoegen zonder (zoals voorheen) de hele (TPlaylist) classe te moeten aanpassen.

  2. #2
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Op zich zou ik bovenal adviseren te blijven wat voor jou het best werkbaar lijkt. Maar dat is natuurlijk weinig concreet.
    Ik jouw specifiek geval, lijkt het misschien interessant om alles in de TPlaylist class te hebben, maar als het echt om veel verschillende dingen gaat, krijg je al snel een onhandelbaar beest. En zoals je al zelf aangeeft, begin daar dan nog maar eens aan toe te voegen of grondig aan te passen.
    Ik denk dat je op het goeie spoor zit door een 'recht-toe-recht-aan' TPlaylist class te maken met alleen gewoon de data die een doorsnee gemiddelde playlist kan hebben, en de methods voor de mutaties die je er normaal doorgaans op doet.
    En daarnaast maak je een 'abstracte'* klasses TPlaylistReader en TPlaylistWriter waar je een heleboel afgeleide klasses maakt per bestandsformaat die je ondersteunt. (*: in Delphi heb je niet echt 'class abstract', vanaf een class een method met 'virtual; abstract;' heeft is het in theorie een abstracte classe.)
    Wat ik ten zeerste kan aanraden is dat je eens kijkt bij de units bij Delphi zelf waar soms in de initialization-section onderaan een call 'Register...' staat, die in een centrale unit dan een of andere class registreert in een array. Zo kan je 'dynamisch' de ondersteunde formaten in je finale exe bepalen gewoon doordat het in het dpr/dproj bestand include is of niet. (Ik vind nu niet direct een goed voorbeeld, maar hier heb ik een voorbeeld in een project van mezelf.)
    Ook voor je redo/undo queue kan TObjectList aanraden op basis van een centrale TListOperation (met abstracte procedure Redo en procedure Undo) en een sloot concrete overervende klasses.

  3. #3
    Wow dankjewel wat een antwoord! Daar kan ik enorm veel mee, je maakt m’n dag ! 😁😁

  4. #4
    Dat dynamische registeren doen bijvoorbeeld ook de Tgraphics format in TPicture. Vroeger kon je dan een aparte unit downloaden die TPngImage bevatte. Als je die toevoegde aan je project, kon je ineens magisch png images laden in TPicture en TImage.

    Overigens vind ik zelf dat het geen kwaad kan om zo'n class nog met een regeltje code expliciet te registreren, maar het principe is hetzelfde.
    1+1=b

  5. #5
    Hier nog een basis Lyrics reader voor je Playlist. Is echt beetje basis maar het werkt.
    Ik heb deze zelf omgeschreven voor mijn FinalPlayer.

    Attachment 8234

    Niet nodig? Geen probleem.
    Groetjes.

  6. #6
    Allright cool, dankjewel

    [Edit] is dat deze finalplayer? Cool project!!

  7. #7
    Quote Originally Posted by Reidinga View Post
    Allright cool, dankjewel

    [Edit] is dat deze finalplayer? Cool project!!
    Klopt. Dat is hem. :-)

    Attachment 8238

    Hier is de uitwerking.
    Lastig om te verwerken, denk ik maar de basis is er. Hier werkt het haha :-)
    Last edited by DragonFly; 18-Jun-22 at 18:34.

  8. #8
    Oke tof project hoor, heb m ook eens gedownload straks eens mee spelen Top dankjewel, of ik deze hierin ga gebruiken weet ik nog niet, maar wil toch ook nog een player maken dus wellicht komt deze daarin nog van pas!

  9. #9
    Quote Originally Posted by Reidinga View Post
    Oke tof project hoor, heb m ook eens gedownload straks eens mee spelen Top dankjewel, of ik deze hierin ga gebruiken weet ik nog niet, maar wil toch ook nog een player maken dus wellicht komt deze daarin nog van pas!
    Je kan mij altijd berichten voor eventuele vragen wat betreft sommige source. Voor mij is de FP een beetje op het einde en doe nu wat source verbeteringen. Nope geen Interfaces

    PS: Werkt met BASS codec.

  10. #10
    Oke dankje, ik ben zelf niet echt bekend met het formaat wbt Lyrics, maar wellicht veranderd dat binnenkort Oke oke tof, nou mocht je nog wat dingen willen veranderen GUI gewijs .. Ik ben altijd bereid om wat components voor je te schrijven, of ergens anders mee te helpen.

  11. #11
    Dank je wel. Ik ben niet op zoek naar GUI aanpassingen, te diep al in het programma. Als je de FP draait dan zie je ook dat het een Broadcast optie heeft. Verder de WAVE met afspelen. Kijk maar wat je leuk vindt.

  12. #12
    Of deze, van mijn hand dan, maar dan wel met interfaces, singleton, threading, classes; zoals Uni.Player, Uni.types, Uni.clock.
    De buttons voor de play/stop/pause/next gebruiken wel de basis componenten van Reidinga, maar daar heb ik wel wat code aan aangepast, toegevoegd en wat support aan toegevoegd, zodat ik zelf ook bitmaps erin kan weergeven. (Mode custom bitmap met een custom imagelist). De code van de buttons zal ik nog 'n keer herpubliceren.
    Click image for larger version. 

Name:	Screenshot 2022-06-21 220243.jpg 
Views:	91 
Size:	103.2 KB 
ID:	8239

    P.S. Ik gebruikt ook een StateMachine om een status bij te houden van een TPlaylist(in code een TClock) of van een TClockItem.CurrentState.State;

    Dan hoef je niet met booleans te klieren, maar kan je gewoonweg de state opvragen:

    Code:
      If (_Player.CurrentState.State in [TPlayer.Playing, TPlayer.Paused]) then
         ....
      
      if (_Clock.CurrentState.State in [TClock.OnAir]) then
         --
    
      // Gebruik een case of een TPredicate e.t.c.
    Last edited by Patjuh; 21-Jun-22 at 23:24.
    Alvast bedankt, Patrick

  13. #13
    Hoi Patrick,

    Ziet er mooi uit.
    Gebruik je ook een AIRLITE DLL CONTROL in je software?
    Ik heb al een begin gemaakt in Delhi maar wie weet heb jij al een complete DLL in Delphi hiervoor?

    Code:
    unit AirLite;
    
    interface
    
    //uses
    //  AirLite_Types;
    
    const
      tagsdll = 'Airlite.dll';
    
    type
      PVersion_st = ^TVersion_st;
      TVersion_st = record
        major,
        minor,
        build,
        revision : integer;
      end;
    
    type
      DWORD = LongWord;
      AIRLITE_HANDLE = DWORD;
    
    // AIRLITE_API char* airlite_library_version(Version_st* version );
    function airlite_library_version(version: PVersion_st): PAnsiChar; stdcall; external tagsdll;
    
    {******************************************************************************/
    /* SETUP                                      															  */
    /******************************************************************************}
    
    function airlite_open(remotehost: PAnsiChar; udp_recv_port, udp_send_port: Word): AIRLITE_HANDLE; stdcall; external tagsdll;
    // AIRLITE_API AIRLITE_HANDLE airlite_open(char*	remotehost,	unsigned short	udp_recv_port,unsigned short	udp_send_port);
    
    function airlite_close(handle: AIRLITE_HANDLE): Integer; stdcall; external tagsdll;
    // AIRLITE_API int airlite_close(AIRLITE_HANDLE	handle);
    
    
    (*
    function airlite_register_callback(handle: AIRLITE_HANDLE; callback: AIRLITE_CB; userdata: Pointer): Integer; stdcall; external tagsdll;
    // AIRLITE_API int	airlite_register_callback(AIRLITE_HANDLE	handle,	AIRLITE_CB  callback,	void * userdata);
    *)
    
    
    {******************************************************************************/
    /* MISCELLANEOUS           															                      */
    /******************************************************************************}
    
    function airlite_get_last_error(handle: AIRLITE_HANDLE): PAnsiChar; stdcall; external tagsdll;
    // AIRLITE_API char* airlite_get_last_error(AIRLITE_HANDLE	handle);
    
    implementation
    end.
    TEST...

    Code:
    procedure TfrmAirLiteProject.Button1Click(Sender: TObject);
    var
      C: Integer;
      S: PAnsiChar;
      V: TVersion_st;
      H: AIRLITE_HANDLE;
    begin
      S := airlite_library_version(@V);
      Label1.Caption := string(S);
    
      // H := airlite_open('127.0.0.1', 19550, 19551);
      H := 0;
      H := airlite_open('127.0.0.1', 19550, 19551);
      Label2.Caption := 'AIRLITE_HANDLE: ' + H.ToString;
    
      S := airlite_get_last_error(H);
      Label3.Caption := 'ERROR: ' + string(S);
    
      if (H <> 0) then C := airlite_close(H) else C := -1;
      Label4.Caption := 'CLOSE: ' + C.ToString;
    end;
    Helaas is de persoon die dit graag wou verdwenen en ik heb geen Airlite mengpaneel
    Nu gewoon met Shortcuts gedaan.

    Groetjes.

  14. #14
    Hoi DragonFly,

    Niet een 'Delphi DLL', maar wel een losse pascal unit. Deze vertaald uit het C voorbeeld.
    Alvast bedankt, Patrick

  15. #15
    Ja is ook origineel C. Je mag sturen als je wilt?

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 2 users browsing this thread. (0 members and 2 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •