MusicTone Logic

MusicTone Logic 2024-04-07

Author / Company
www.idlagam.com
Projeto completo

De uma pequena aplicação gui, reescrevi em Xailer, mesma interface e funcionalidades, que demonstra/utiliza:
  • a importância e facilidade de usar OOP (programação orientada a objetos)
  • várias técnicas fundamentais em qualquer aplicação
  • Form Designer, também criar controles visuais via código.
  • compartilhar valores entre forms/rotinas sem criar variáveis PUBLIC/PRIVATE
  • lógica de programação
  • codificar único botão/evento para compartilhar com outros controles e executar de forma personalizada. (Onde o comum é o programador codificar cada controle, duplicando códigos e dificultando o entendimento e as manutenções)
MusicTone - Projeto completo
Exercício: inclua as canções que faltam.
No designer duplique controles, no código chame o método correspondente.

PM_MusicTone.png----MusicTone_Designer.png---- MusicTone_Run.PNG----MusicTone_About.png

MusicTone.prg
C:
#include "Xailer.ch"
REQUEST HB_CODEPAGE_ESMWIN
//REQUEST DBFCDX

Procedure Main()

   Application:cTitle := "MusicTone"
   Application:lSingleInstance := .T.
   Application:oIcon := "headset"
   SysMain()
   Application:Run()

   Return

static function SysMain()
   SET DATE FRENCH
   SET CENTURY ON
   HB_CDPSELECT( 'ESMWIN' )
   SET EPOCH TO 1999
   TFrmMain():New( Application ):Show()
   RETURN NIL
MenuPrincipal.PRG - É possível fazer o Menu via Designer, mas neste caso acho mais funcional e prático construir via código:
C:
#include "Xailer.ch"

function menuMain( oFrm )
   local oMenu

   MENU oMenu OF oFrm
      //oMenu:nStyle := msOFFICE2007EX // msOFFICEXP // msOFFICE2003 // msOFFICE2007

      Menuitem '&Music_A'
      MENU
         Menuitem 'Yankee_Doodle'       ACTION Yankee_Doodle()       BITMAP 'Note'
         Menuitem 'La Cucaracha'        ACTION La_Cucaracha()        BITMAP 'Note'
         Menuitem 'Blue Danube Waltz'   ACTION Blue_Danube_Waltz()   BITMAP 'Note'
         Menuitem 'Humoresque'          ACTION Humoresque()          BITMAP 'Note'
         Menuitem 'Pop Goes The Weasel' ACTION Pop_Goes_The_Weasel() BITMAP 'Note'
         Menuitem 'Symphony_40'         ACTION Symphony_40()         BITMAP 'Note'
         SEPARATOR
         Menuitem 'Exit'                ACTION oFrm:close()  BITMAP 'Exit'
      ENDMENU

      Menuitem '&Music_B'
      MENU
         MENUITEM 'Funeral March'       ACTION Funeral_March()       BITMAP 'note'
         MENUITEM 'Stars_And_Stripes'   ACTION Stars_And_Stripes()   BITMAP 'note'
         MENUITEM 'El_sombrero'         ACTION El_sombrero()         BITMAP 'note'
         MENUITEM 'Sakura'              ACTION Sakura()              BITMAP 'note'
         MENUITEM 'Escalas'             ACTION Escalas()             BITMAP 'note'
         MENUITEM 'Popurry'             ACTION Popurrys()            BITMAP 'note'
         SEPARATOR
         Menuitem 'About'               ACTION frmAbout()            BITMAP 'home'
      ENDMENU

      Menuitem '&Logic+' // Este é um menu extra, para demonstar uma lógica diferente.
      // Através do texto do menu, procurar em outra janela, o nome da música associado ao botão, para executar o evento click
      MENU
         MENUITEM 'Funeral March'       ACTION EvalBtnClick(oSender) BITMAP 'note'
         MENUITEM 'Stars_And_Stripes'   ACTION EvalBtnClick(oSender) BITMAP 'note'
         MENUITEM 'El_sombrero'         ACTION EvalBtnClick(oSender) BITMAP 'note'
         MENUITEM 'Sakura'              ACTION EvalBtnClick(oSender) BITMAP 'note'
         MENUITEM 'Escalas'             ACTION EvalBtnClick(oSender) BITMAP 'note'
         MENUITEM 'Popurry'             ACTION EvalBtnClick(oSender) BITMAP 'note'
      ENDMENU

   ENDMENU

   oMenu:SetMenu()
   return nil
FrmAbout.prg - Código completo (programador), parametrizável, usando único label
C:
METHOD FormInitialize( oSender ) CLASS TFrmAbout
   // 2023-07-27 19:27 Hurricane
   ::oBevel:nClrPane:=RGB(253, 209, 209)
   WITH OBJECT ::oLbTitle

      :cText:='Music Tone - from GUI to Xailer'
      :nLeft:=Int( :oParent:nWidth/2 - :nWidth/2 ) // Centralizando o label em seu container (Bevel)

   END WITH
   AEval( ::aMsg, {|cMsg|::oLbNames:cText+=cMsg + CRLF } )
   RETURN Nil

//------------------------------------------------------------------------------
function frmAbout( aMsg ) // --> NIL
   if Empty(aMsg)
      aMsg:={}
      AAdd( aMsg, ' 1º Composition -> ' + SPACE(1) + 'Anonymous  ' )
      AAdd( aMsg, ' 2º Composition -> ' + SPACE(1) + 'Mexican Traditional Melody' )
      AAdd( aMsg, ' 3º Composition -> ' + SPACE(1) + 'Johann Strauss (1825-1899)' )
      AAdd( aMsg, ' 4º Composition -> ' + SPACE(1) + 'Anton Dvorak (1841-1904)' )
      AAdd( aMsg, ' 5º Composition -> ' + SPACE(1) + 'Anonymous' )
      AAdd( aMsg, ' 6º Composition -> ' + SPACE(1) + 'Wolfgang Amadeus Mozart' )
      AAdd( aMsg, ' 7º Composition -> ' + SPACE(1) + 'Carlos Gounod (1818-1893)' )
      AAdd( aMsg, ' 8º Composition -> ' + SPACE(1) + 'John Philipp Sousa (1854-1932)' )
      AAdd( aMsg, ' 9º Composition -> ' + SPACE(1) + 'Mexican Traditional Melody' )
      AAdd( aMsg, '10º Composition -> ' + SPACE(1) + 'Japan Traditional Melody' )
      AAdd( aMsg, '11º Composition -> ' + SPACE(1) + 'Scal Melody' )
      AAdd( aMsg, '12º Composition -> ' + SPACE(1) + 'Popurry Melody' )
   ENDIF

   WITH OBJECT TFrmAbout() // instanciando o Form sem o construtor, útil para ler parâmetros externos e usá-los na criação ou inicialização
      :aMsg:=aMsg
      :New()               // construtor. É neste momento que todos os controles foram criados
      :cText:=' [ Esc ] <- Cancelar' + SPACE(50) + 'About'
      :ShowModal()
   END WITH
   return nil
O que é Xailer? Tutorial Harbour, Xailer IDE, RAD
Autor
Hurricane
Downloads
49
Visualizações
554
Lançamento
Últ. atualização
Classificação
0,00 estrela(s) 0 avaliações

Latest updates

  1. MusicTone Logic

    O som foi melhorado. As versões console do App usam a função TONE (nativa), a versão GUI do App...
Top