Um pouco sobre "Tag"

0 views
Skip to first unread message

Riceman

unread,
Nov 21, 2007, 6:17:55 PM11/21/07
to Equipe Clica-Aí
Srs.,

A pedido do Passarin, estou postando algumas informações sobre a
propriedade "Tag", existente nos objetos do Gambas.

Para definir em poucas palavras, a propriedade Tag não serve pra nada
em relação ao objeto. Me explico:
Todas as propriedades em um objeto se referem ao seu visual ou ao modo
como o objeto irá se compotar, exceto a Tag. Esta propriedade não
altera nada nem no visual nem no comportamento de um objeto. É, como o
nome diz, apenas um "Tag" ou uma identificação. Ela está lá pra uso do
programador da maneira que bem entender. Trata-se apenas de um texto
ou um número (ou seja lá o que for) para identificar aquele objeto.

Aproveitando a existência desta propriedade e as 2 poderosas
ferramentas do Gambas, a saber:
- a propriedade "Group", que permite definir a mesma função para
eventos de vários objetos
- e o comando LAST, que permite acessar as propriedades do objeto que
gerou o último evento

É possível reduzir drásticamente o código com fiz com algumas partes
do Clica-ai. Vou explicar como otimizei o controle de visualização dos
Tabs do FormPrincipal que envolve exatamente estas 3 ferramentas. No
FormKTerminalServer usei o mesmo método.

No início o Passarin havia criado várias funções idênticas para os
vários botões apenas alterando quem era visível e quem não era com
TRUE e FALSE em lugares diferentes para cada função. Essa metodologia,
apesar de funcionar, não e a melhor em termos de manutenção de código,
pois ao alterar um detalhe em uma delas terá que sair caçando as
outras e fazendo as mesmas alterações manualmente.
Se for utilizar um mesmo pedaço de código (apenas alterando algumas
variáveis) mais de uma vez, sempre vale a pena criar uma sub-função
que recebe as variáveis como argumento. Facilita a manutenção
posterior, pois caso altere ou corrija alguma coisa, haverá apenas um
lugar para fazê-lo.

O que eu fiz no Clica-ai foi definir o mesmo Tag para cada Botão e seu
Tab correspondente (além do valor Tag ser o texto exibido no label -
mas isso é frescura). E no código ficou assim: (vide mais abaixo
comentários sobre os pontos numerados)

PUBLIC SUB MainToolBtns_Click()
'Chama TabsVisible para todos os botões do Grupo MainToolBtns
informando o Tag do Botão pressionado
TabsVisible(LAST.tag) <---- 1
END

PUBLIC SUB TabsVisible(SelectedTab AS String)

'Acerta do Tag do Kcontrol para o último Tab selecionado
TbnKcontrol.Tag=SelectedTab <---- 2

'Define qual Tab será exibido comparando seu Tag com o do Botão
pressionado
PanInstalarkurumin.Visible=(SelectedTab=PanInstalarkurumin.Tag)
<---- 3
TbsHardware.Visible=(SelectedTab=TbsHardware.Tag)
TbsServidores.Visible=(SelectedTab=TbsServidores.Tag)
TbsIconesMagicos.Visible=(SelectedTab=TbsIconesMagicos.Tag)
TbsAparenciaTemas.Visible=(SelectedTab=TbsAparenciaTemas.Tag)
TbsConectarInternet.Visible=(SelectedTab=TbsConectarInternet.Tag)
TbnVoltarinicio.Visible=(SelectedTab<>TbnVoltarinicio.Tag)

'Define o título do Tab como sendo o Tag do botão pressionado
LblTitulo.Text=LAST.Tag <---- 4

'Define qual botão terá borda comparando seu Tag com o do Botão
pressionado
TbnInternet.Border=(SelectedTab=TbnInternet.Tag) <---- 5
TbnHardware.Border=(SelectedTab=TbnHardware.Tag)
TbnServidores.Border=(SelectedTab=TbnServidores.Tag)
TbnTemas.Border=(SelectedTab=TbnTemas.Tag)
TbnIconesMagicos.Border=(SelectedTab=TbnIconesMagicos.Tag)
TbnKcontrol.Border=FALSE

END

----> 1) Chama a função de controle de visualização dos Tabs e passa
como argumento o Tag do botão pressinado.

----> 2) Para melhor entendimento siga lendo do ponto 3 em diante e
veja a explicação para este item ao final.

----> 3) Define a propriedade Visible de cada Tab como o resultado da
comparação entre o Tag do botão pressionado e o Tag de cada tab. Como
apenas um tab corresponde ao Tag do botão, apenas uma das comparações
resultará em TRUE (a do tab que deve ser exibido), e as demais serão
FALSE.

----> 4) Apenas define o valor do Label igual ao Tag (frescura)

----> 5) Da mesma forma explicada no item 3, define qual botão terá
borda. No caso do Kcontrol é sempre FALSE, pois ele não aciona um tab
no Clica-ai, mas sim um programa externo.

Explicação:
----> 2) Como Kcontrol abre um programa externo (e não tem um tab
correspondente), para poder se beneficiar da mesma função ele precisa
assumir o Tag do último botão pressionado, assim ao clicá-lo o
Kcontrol se abrirá e o menu permanecerá com o último tab visualidado
ativo, ao invés de ficar vazio (o que seria um comportamento
extranho). Então você pergunta, mas e se o usuário não pressionar
nenhum botão logo após abrir o Clica-ai e clicar direto no Kcontrol. E
eu respondo, não há problema, pois se você observar no código da
função Form_Open(), vai ver ao abrir o Clica-ai o programa, via
código, clica no botão "Voltar ao Início" (que também faz parte do
Grupo), assim sempre haverá um botão anterior para o Kcontrol assumir.

Basicamente é isso. Caso tenham mais alguma dúvida não deixem de
perguntar

Um abraço,

Riceman

Passarin Jr.

unread,
Nov 21, 2007, 8:27:49 PM11/21/07
to Equipe Clica-Aí
Muito bom! Acho que entendi alguma coisa...mas como me disse um amigo
outro "programar só se aprende programando". Vou ver cosigo usá-las
(as tags) quando tiver oportunidade...
Abraços!

Riceman escreveu:

> Srs.,
>
> A pedido do Passarin, estou postando algumas informa��es sobre a
> propriedade "Tag", existente nos objetos do Gambas.
>
> Para definir em poucas palavras, a propriedade Tag n�o serve pra nada
> em rela��o ao objeto. Me explico:
> Todas as propriedades em um objeto se referem ao seu visual ou ao modo
> como o objeto ir� se compotar, exceto a Tag. Esta propriedade n�o
> altera nada nem no visual nem no comportamento de um objeto. �, como o
> nome diz, apenas um "Tag" ou uma identifica��o. Ela est� l� pra uso do
> programador da maneira que bem entender. Trata-se apenas de um texto
> ou um n�mero (ou seja l� o que for) para identificar aquele objeto.
>
> Aproveitando a exist�ncia desta propriedade e as 2 poderosas
> ferramentas do Gambas, a saber:
> - a propriedade "Group", que permite definir a mesma fun��o para
> eventos de v�rios objetos
> - e o comando LAST, que permite acessar as propriedades do objeto que
> gerou o �ltimo evento
>
> � poss�vel reduzir dr�sticamente o c�digo com fiz com algumas partes
> do Clica-ai. Vou explicar como otimizei o controle de visualiza��o dos
> Tabs do FormPrincipal que envolve exatamente estas 3 ferramentas. No
> FormKTerminalServer usei o mesmo m�todo.
>
> No in�cio o Passarin havia criado v�rias fun��es id�nticas para os
> v�rios bot�es apenas alterando quem era vis�vel e quem n�o era com
> TRUE e FALSE em lugares diferentes para cada fun��o. Essa metodologia,
> apesar de funcionar, n�o e a melhor em termos de manuten��o de c�digo,
> pois ao alterar um detalhe em uma delas ter� que sair ca�ando as
> outras e fazendo as mesmas altera��es manualmente.
> Se for utilizar um mesmo peda�o de c�digo (apenas alterando algumas
> vari�veis) mais de uma vez, sempre vale a pena criar uma sub-fun��o
> que recebe as vari�veis como argumento. Facilita a manuten��o
> posterior, pois caso altere ou corrija alguma coisa, haver� apenas um
> lugar para faz�-lo.
>
> O que eu fiz no Clica-ai foi definir o mesmo Tag para cada Bot�o e seu
> Tab correspondente (al�m do valor Tag ser o texto exibido no label -
> mas isso � frescura). E no c�digo ficou assim: (vide mais abaixo
> coment�rios sobre os pontos numerados)
>
> PUBLIC SUB MainToolBtns_Click()
> 'Chama TabsVisible para todos os bot�es do Grupo MainToolBtns
> informando o Tag do Bot�o pressionado
> TabsVisible(LAST.tag) <---- 1
> END
>
> PUBLIC SUB TabsVisible(SelectedTab AS String)
>
> 'Acerta do Tag do Kcontrol para o �ltimo Tab selecionado
> TbnKcontrol.Tag=SelectedTab <---- 2
>
> 'Define qual Tab ser� exibido comparando seu Tag com o do Bot�o
> pressionado
> PanInstalarkurumin.Visible=(SelectedTab=PanInstalarkurumin.Tag)
> <---- 3
> TbsHardware.Visible=(SelectedTab=TbsHardware.Tag)
> TbsServidores.Visible=(SelectedTab=TbsServidores.Tag)
> TbsIconesMagicos.Visible=(SelectedTab=TbsIconesMagicos.Tag)
> TbsAparenciaTemas.Visible=(SelectedTab=TbsAparenciaTemas.Tag)
> TbsConectarInternet.Visible=(SelectedTab=TbsConectarInternet.Tag)
> TbnVoltarinicio.Visible=(SelectedTab<>TbnVoltarinicio.Tag)
>
> 'Define o t�tulo do Tab como sendo o Tag do bot�o pressionado
> LblTitulo.Text=LAST.Tag <---- 4
>
> 'Define qual bot�o ter� borda comparando seu Tag com o do Bot�o
> pressionado
> TbnInternet.Border=(SelectedTab=TbnInternet.Tag) <---- 5
> TbnHardware.Border=(SelectedTab=TbnHardware.Tag)
> TbnServidores.Border=(SelectedTab=TbnServidores.Tag)
> TbnTemas.Border=(SelectedTab=TbnTemas.Tag)
> TbnIconesMagicos.Border=(SelectedTab=TbnIconesMagicos.Tag)
> TbnKcontrol.Border=FALSE
>
> END
>
> ----> 1) Chama a fun��o de controle de visualiza��o dos Tabs e passa
> como argumento o Tag do bot�o pressinado.
>
> ----> 2) Para melhor entendimento siga lendo do ponto 3 em diante e
> veja a explica��o para este item ao final.
>
> ----> 3) Define a propriedade Visible de cada Tab como o resultado da
> compara��o entre o Tag do bot�o pressionado e o Tag de cada tab. Como
> apenas um tab corresponde ao Tag do bot�o, apenas uma das compara��es
> resultar� em TRUE (a do tab que deve ser exibido), e as demais ser�o
> FALSE.
>
> ----> 4) Apenas define o valor do Label igual ao Tag (frescura)
>
> ----> 5) Da mesma forma explicada no item 3, define qual bot�o ter�
> borda. No caso do Kcontrol � sempre FALSE, pois ele n�o aciona um tab
> no Clica-ai, mas sim um programa externo.
>
> Explica��o:
> ----> 2) Como Kcontrol abre um programa externo (e n�o tem um tab
> correspondente), para poder se beneficiar da mesma fun��o ele precisa
> assumir o Tag do �ltimo bot�o pressionado, assim ao clic�-lo o
> Kcontrol se abrir� e o menu permanecer� com o �ltimo tab visualidado
> ativo, ao inv�s de ficar vazio (o que seria um comportamento
> extranho). Ent�o voc� pergunta, mas e se o usu�rio n�o pressionar
> nenhum bot�o logo ap�s abrir o Clica-ai e clicar direto no Kcontrol. E
> eu respondo, n�o h� problema, pois se voc� observar no c�digo da
> fun��o Form_Open(), vai ver ao abrir o Clica-ai o programa, via
> c�digo, clica no bot�o "Voltar ao In�cio" (que tamb�m faz parte do
> Grupo), assim sempre haver� um bot�o anterior para o Kcontrol assumir.
>
> Basicamente � isso. Caso tenham mais alguma d�vida n�o deixem de
> perguntar
>
> Um abra�o,
>
> Riceman
Reply all
Reply to author
Forward
0 new messages