- Author / Company
- www.idlagam.com
MusicTone Logic
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)
Exercício: inclua os botões para chamar as canções restantes.
No designer duplique controles, no código chame o método correspondente.




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