Página 1 de 2
Ajuda na criação de Botões
Enviado: 07 Jan 2026 12:13
por Fernando Almeida
Bom dia Caros colegas. Tenho uma rotina que faz a criaçâo de botões dos grupos e estÁ a funcionar bem. Caso eu selecione um elemento do Grupo, ele apresenta num segundo panel os botoes correspondentes aos artigos desse mesmo grupo.
É aqui que eu não sei porque dá erro e preciso da vossa ajuda porque tento criar o botão e da erro de parametros.
Vejam a rotina:
Código: Selecionar todos
FUNCTION Carrega_Botoes_Artigos( aNomeButton )
LOCAL LinhaBotao, ColunaBotao
PRIVATE xNomeBotao
SELECT('GRUPOS')
IF GRUPOS->(DBSEEK( aNomeButton ))
SELECT("ARTIGOS")
OrdSetFocus('ArtGrupo')
IF ARTIGOS->(DBSEEK( aNomeButton ))
LinhaBotao :=0
ColunaBotao :=0
SELECT('P_MESAS')
LOCATE FOR P_MESAS->Abrevia="BT"
SELECT('ARTIGOS')
DO WHILE .NOT. EOF() .AND. ARTIGOS->Grupo=GRUPOS->Familia .AND. ARTIGOS->SubGrupo==GRUPOS->SubFam .AND. ARTIGOS->SubSubGrup=GRUPOS->SubSubFam
xNomeBotao :=ALLTRIM(ARTIGOS->Codigo)
DEFINE BUTTON &xNomeBotao
ROW P_MESAS->LnIniArtBt + LinhaBotao
COL P_MESAS->CoIniArtBt + ColunaBotao
WIDTH P_MESAS->LargBTArt
HEIGHT P_MESAS->AltuBTArt
ACTION Nil
CAPTION '&'+UPPER(RTRIM(ARTIGOS->Descritivo))
FONTNAME "Arial"
FONTSIZE 8
TOOLTIP ""
FONTBOLD .T.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONGOTFOCUS {|| SetProperty('PanelArtigos', This.Name, 'FONTBOLD', .t.) }
ONLOSTFOCUS {|| SetProperty('PanelArtigos', This.Name, 'FONTBOLD', .f.) }
HELPID Nil
FLAT .F.
TABSTOP .T.
VISIBLE .T.
TRANSPARENT .T.
MULTILINE .T.
PICTURE ARTIGOS->ImageBotao
PICTALIGNMENT LEFT
END BUTTON
ColunaBotao +=(P_MESAS->LargBTArt + P_MESAS->DISTCOBTAR)
IF ColunaBotao>=690 - ( P_MESAS->LargBTArt + P_MESAS->CoIniArtBt )
ColunaBotao :=0
LinhaBotao +=(P_MESAS->AltuBTArt + P_MESAS->DistLnBTAr)
ENDIF
IF LinhaBotao>=700 - ( P_MESAS->LnIniArtBT + P_MESAS->AltuBTArt )
LinhaBotao :=0
ColunaBotao:=0
ENDIF
SKIP
ENDDO
ENDIF
ENDIF
Return
Me digam como posso usar esta instrução ControlExist( "MeuBotao" ). Porque não consigo usar-la para verificar se o botão existe.
Re: Ajuda na criação de Botões
Enviado: 07 Jan 2026 14:14
por ivanil
Olá,
Ao definir um objeto fora da estrutura da janela, é obrigatório informar a propriedade PARENT. Caso contrário, o sistema não saberá onde alocar o objeto.
Outro adendo é: se você estiver criando o objeto acima da criação do formulário ou em módulo diferente, não esqueça de declarar a janela;
at.
Re: Ajuda na criação de Botões
Enviado: 07 Jan 2026 18:07
por Fernando Almeida
Obrigado, tinha me esquecido desse detalhe.
Sr. Ivanil porque não consigo usar o ControlExist(). Essa função faz parte de alguma Dll que tem que ser acrescentada.
Consegue alterar os icones de um formulário desta forma: SetProperty("Form1", "Icon", "xxxxxxxxxxx"). Eu não consigo fazer a alteração dos icones.
Aproveito para o parabenizar sobre a ferramenta que criou, eu nunca a tentei usar, mas pergunto se executa em 32bits ou 64bits.
Tem alguma informação dela para que eu possa consultar?
Re: Ajuda na criação de Botões
Enviado: 07 Jan 2026 20:24
por ivanil
Olá Fernando,
Sugiro que faça uma leitura atenta do manual da MiniGUI, disponível na pasta doc. É possível que existam recursos ali descritos que você ainda não conheça e que possam ajudá-lo.
Em relação à sua pergunta sobre a verificação da existência de um controle, a função correta é:
IsControlDefined (<ControlName>,<WindowName>) --> lBoolean
Quanto à redefinição de um ícone em uma janela em tempo de execução, esse recurso não está documentado e também não está previsto no translate do pré-processador.
O Designer está preparado para ambiente 32 bits; no entanto, ele gera todos os arquivos de configuração do hbmk2 e deixa a disposicao do usuário. Dessa forma, basta copiá-los para um nome diferente e ajustá-los para um ambiente 64 bits, seja utilizando MinGW, Zig ou outro compilador. É importante considerar que todo o ambiente deve ser consistente: se optar por MinGW, por exemplo, o Harbour, a MiniGUI e os pacotes adicionais também devem estar nesse mesmo ecossistema.
Trata-se de um conjunto com diversas variáveis. Quando se adquire domínio sobre esse processo, a configuração torna-se trivial. Não costumo divulgar esse procedimento de forma ampla justamente para evitar a mistura de bibliotecas, o que pode causar conflitos, erros recorrentes e, muitas vezes, frustração ou desistência por problemas simples.
Você ainda pode adicionar seu próprio método de compilação e sobrepor a compilação atual; mas aí requer mais afinidade com a ferramenta.
A ferramenta está no git e sempre atualizada com a última versão da Minigui, e ocasionalmente produzo algum vídeo de demonstração, basta procurar "designer + minigui", deve aparecer no topo da pesquisa.
Re: Ajuda na criação de Botões
Enviado: 08 Jan 2026 18:51
por Fernando Almeida
A instrução IsControlDefined(xNomeBotao, "PanelArtigos") não está a cumprir para o que é determinado.
Vou lhe mostrar a rotina que cria os botões dos artigos correspondentes ao grupo escolhido.
Como não está a fazer o pretendido, dá um erro na verificação da existencia do control.
Imprimi o valor de retorno e só obtenho .F.. Com o control criado ou não.
Código: Selecionar todos
FUNCTION Carrega_Botoes_Artigos( aNomeButton )
LOCAL xNomeBotao, ColunaBotao, LinhaBotao
SELECT('GRUPOS')
OrdSetFocus('Familias')
IF GRUPOS->(DBSEEK( aNomeButton ))
SELECT("ARTIGOS")
OrdSetFocus('ArtGrupo')
IF ARTIGOS->(DBSEEK( aNomeButton ) )
LinhaBotao :=0
ColunaBotao :=0
SELECT('P_MESAS')
LOCATE FOR P_MESAS->Abrevia="BT"
SELECT('ARTIGOS')
DO WHILE .NOT. EOF() .AND. ARTIGOS->Grupo=GRUPOS->Familia .AND. ARTIGOS->SubGrupo==GRUPOS->SubFam .AND. ARTIGOS->SubSubGrup=GRUPOS->SubSubFam
xNomeBotao :=ALLTRIM(ARTIGOS->Codigo)
IF IsControlDefined(xNomeBotao, "PanelArtigos")
IF GetProperty('PanelArtigos', xNomeBotao, 'VISIBLE' ) == .F.
SetProperty('PanelArtigos', xNomeBotao, 'VISIBLE', .T.)
ENDIF
ELSE
DEFINE BUTTON &xNomeBotao
PARENT PanelArtigos
ROW P_MESAS->LnIniArtBt + LinhaBotao
COL P_MESAS->CoIniArtBt + ColunaBotao
WIDTH P_MESAS->LargBTArt
HEIGHT P_MESAS->AltuBTArt
ACTION Nil
CAPTION '&'+UPPER(RTRIM(ARTIGOS->Descritivo)) + TRANSF(ARTIGOS->PrecoUnit, "@E 999,999.99")+' R$ '
FONTNAME "Arial"
FONTSIZE 9
TOOLTIP ""
FONTBOLD .F.
FONTITALIC .F.
FONTUNDERLINE .F.
FONTSTRIKEOUT .F.
ONGOTFOCUS {|| SetProperty('PanelArtigos', This.Name, 'FONTBOLD', .t.) }
ONLOSTFOCUS {|| SetProperty('PanelArtigos', This.Name, 'FONTBOLD', .f.) }
HELPID Nil
FLAT .F.
TABSTOP .T.
VISIBLE .T.
TRANSPARENT .T.
MULTILINE .T.
PICTURE RTRIM(ARTIGOS->ImageBotao)
PICTALIGNMENT TOP
END BUTTON
ColunaBotao +=(P_MESAS->LargBTArt + P_MESAS->DISTCOBTAR)
IF ColunaBotao>=690 - ( P_MESAS->LargBTArt + P_MESAS->CoIniArtBt )
ColunaBotao :=0
LinhaBotao +=(P_MESAS->AltuBTArt + P_MESAS->DistLnBTAr)
ENDIF
IF LinhaBotao>=700 - ( P_MESAS->LnIniArtBT + P_MESAS->AltuBTArt )
LinhaBotao :=0
ColunaBotao:=0
ENDIF
ENDIF
SKIP
ENDDO
ENDIF
ENDIF
Re: Ajuda na criação de Botões
Enviado: 08 Jan 2026 19:40
por ivanil
Ola Fernando;
use a função diretamente conforme abaixo, tem coisas que não deveria existir; a forma que te passei, envolve a variável com aspas desta forma sempre será falso.
_IsControlDefined ( xNomeBotao , "PanelArtigos" )
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 00:50
por Fernando Almeida
Muito obrigado Sr. Ivanil, pergunto-lhe se me permite pedir-lhe aguns conselhos e sugestões porque estou a desenvolver o aplicativo sozinho e não conheço a linguagem de uma forma aprefundada. Não quero abusar do seu tempo e espero que não lhe cause transtorno.
O aplicativo está a funcionar bem. O Módulo de vendas.
Para fazer esta rotina de processo de venda por botões tive que criar alguns processos e gostaria de saber se posso lhe perguntar o que acha desses mesmos processos.
Vou citar aqui a forma como consegui fazer esta gestão e gostaria de saber se acha certo ou podia fazer de uma forma mais consistente.
Como tenho interesse em mudar os botões no panel de artigos quando me desloco nos botões de grupos, usei a propriedade
ONGOTFOCUS() e
ONLOSTFOCUS() no PanelFamilias com este detalhe:
Código: Selecionar todos
ONGOTFOCUS {|| IF(BTAnterior !=Nil, SetProperty('PanelFamilias', BTAnterior, 'FONTBOLD', .f.), Nil),;
SetProperty('PanelFamilias', This.Name, 'FONTBOLD', .t.),;
CFG_Botoes_Artigos( This.Name, BTAnterior ) }
ONLOSTFOCUS {|| BTAnterior :=IF(This.Name==BTAnterior, BTAnterior, This.Name), SetProperty('PanelFamilias', This.Name, 'FONTBOLD', .t.) }
onde aproveito e mudo a fonte para bold para realçar o Caption do botão e envio a uma função 2 parametros, o botão atual e o botão anterior.
Na função de configurção de botões, criei uma matriz
STATIC para poder verificar se já criei o botão. Segue abaixo o código.
Código: Selecionar todos
FUNCTION CFG_Botoes_Artigos( aNomeButton, oldNomeBT )
LOCAL ponteiro
STATIC matriz_Botao_Artigo :={}
IF oldNomeBT !=Nil .AND. aNomeButton !=oldNomeBT &&VAI VERIFICAR SE PODE ANULAR O BOTAO ANTERIOR
ponteiro :=HB_AScan(matriz_Botao_Artigo, { |x,y| ValType( x[1] ) == "C" .AND. x[1] == oldNomeBT } )
IF ponteiro>0
IF matriz_Botao_Artigo[ponteiro,2]=2
AnulaBotoesArtigos( oldNomeBT )
matriz_Botao_Artigo[ponteiro,2] :=1
// HB_ADel( matriz_Botao_Artigo, ponteiro, .T. )
ENDIF
ENDIF
ENDIF
IF aNomeButton !=Nil
ponteiro :=HB_AScan(matriz_Botao_Artigo, { |x,y| ValType( x[1] ) == "C" .AND. x[1] == aNomeButton } ) &&Cria o Botão caso seja novo
IF ponteiro>0
IF matriz_Botao_Artigo[ponteiro,2]>0 .AND. matriz_Botao_Artigo[ponteiro,2]<2
Carrega_Botoes_Artigos( aNomeButton )
matriz_Botao_Artigo[ponteiro,2] :=2
ENDIF
ELSE
AADD(matriz_Botao_Artigo, { aNomeButton, 1 })
ENDIF
ENDIF
Return Nil
Pergunto-lhe, acha que devo fazer um RELEASE aos botões quando mudo de grupo ou familia os simplesmente esconde-los.
Estava para fazer com RELEASE para poupar recursos, como memoria, mas usei o visible==.F. porque com o RELEASE ele só me apaga 2 botões e salta fora do ciclo, e ainda não descobri o porquê. Segue a rotina de anulação abaixo:
Código: Selecionar todos
FUNCTION AnulaBotoesArtigos( oldNomeBT )
LOCAL oButton
SELECT('GRUPOS')
OrdSetFocus('Familias')
IF GRUPOS->(DBSEEK(oldNomeBT))
SELECT("ARTIGOS")
OrdSetFocus("ArtGrupo")
IF ARTIGOS->(DBSEEK(oldNomeBT))
DO WHILE .NOT. EOF() .AND. ARTIGOS->Grupo=GRUPOS->Familia .AND. ARTIGOS->SubGrupo==GRUPOS->SubFam .AND. ARTIGOS->SubSubGrup=GRUPOS->SubSubFam
oButton :=AllTrim( ARTIGOS->Codigo )
IF _IsControlDefined (oButton , "PanelArtigos" )
IF GetProperty('PanelArtigos', oButton, 'VISIBLE' ) == .T.
SetProperty("PanelArtigos", oButton, "Visible", .F.) //DoMethod('PanelArtigos', oButton, 'RELEASE')
ENDIF
ENDIF
SKIP
ENDDO
ENDIF
ENDIF
Return Nil
Está tudo a funcionar mas como tem mais bagagem que eu, gostaria muito da sua opinião.
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 03:08
por alxsts
Olá!
Fernando Almeida escreveu: 09 Jan 2026 00:50Código: Selecionar todos
ONGOTFOCUS {|| IF(BTAnterior !=Nil, SetProperty('PanelFamilias', BTAnterior, 'FONTBOLD', .f.), Nil),;
SetProperty('PanelFamilias', This.Name, 'FONTBOLD', .t.),;
CFG_Botoes_Artigos( This.Name, BTAnterior)
}
ONLOSTFOCUS {|| BTAnterior :=IF(This.Name==BTAnterior, BTAnterior, This.Name), SetProperty('PanelFamilias', This.Name, 'FONTBOLD', .t.) }
Se me permite o aparte, sem entrar na questão da Minigui, que desconheço, gostaria de te mostrar algo que, creio, desconheças.
Trata-se de um recurso muito bom, disponivel tanto no Harbour quanto no xHarbour: codeblocks estendidos. Dentro deles, poderá escrever um Prg inteiro, caso necessite:
Código: Selecionar todos
LOCAL bBlock := { |n|
LOCAL nVar
FOR nVar := 1 To 10
QOut( nVar * n )
NEXT
RETURN nVar
}
// ...
? Eval( bBlock, 7 )
O teu código que destaquei acima ficaria bem mais legível:
Código: Selecionar todos
LOCAL bGotFocus, bLostFocus
bGotFocus := { ||
IF BTAnterior !=Nil
SetProperty('PanelFamilias',BTAnterior , 'FONTBOLD', .f.)
Endif
SetProperty('PanelFamilias', This.Name, 'FONTBOLD', .t.)
CFG_Botoes_Artigos( This.Name, ), BTAnterior )
}
// definir o code block estendido para o evento ONLOSTFOCUS
bLostFocus := { ||
...
}
// Na definição dos botões:
ONGOTFOCUS bGotFocus
ONLOSTFOCUS bLostFocus
Nota:
Em Harbour, um codeblock estendido é delimitado da mesma forma como em Cl*pper: { || ... }. Já no xHarbour, um codeblock estendido é delimitado pelos símbolos menor que e maior que: < || ... >
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 11:05
por Fernando Almeida
Muito obrigado alxsts, não tinha pensado em usar code block, fiz direto. Tem Vantagens ?
Pergunto se acha que a rotina de CFG_BoToes está feita da forma mais certa porque foi a forma que encontrei para apresentar os botões, criando a matriz estática e fazendo uma procura para poder ativar e desativar a visibilidade deles.
Aproveito e pergunto se acha mais conveniente fazer um RELEASE aos botões a serem desativados ou posso simplesmente passar a visibilidade deles para .F.
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 16:26
por ivanil
Ola Fernando;
.. pergunto-lhe se me permite pedir-lhe alguns conselhos e sugestões porque estou a desenvolver o aplicativo sozinho e não conheço a linguagem de uma forma aprofundada...
É basicamente impossível emitir uma opinião para seu sistema sem conhece-lo, olhando pequenos fragmentos não da uma visibilidade real e pode induzir ao erro;
Mas posso te afirmar que um Hide/Show é muito mais eficiente que destruir e reconstruir o botão; na verdade, não ha muito sentido em fazer isso pensando em memoria; quando tiver um tempo dê uma olhada em quanto o navegador usa, seu sistema não chega 1% de consumo do que o browser consome;
Como você mencionou que tudo esta funcionando bem, isso significa que esta no caminho certo; aos poucos as novidades vão surgindo e você vai evoluindo; isso é natural.
Grande abraço.
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 17:14
por Fernando Almeida
Sr. Evanil compreendo.
Agradeço imenso a sua atenção e sempre que tiver dúvidas, pergunto.
Vou usar então o HIDE E SHOW para mostrar os botões, fica mais rápido.
Pergunto como posso usar esta propriedade aControls := Form.Controls porque precisava da matriz de controles associado ao objeto para poder fazer pesquisas.
Forte abraço.
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 17:34
por Fernando Almeida
Sr. alxsts cria as variaveis LOCAIS, bGOTFOCUS e bLOSTFOCUS onde?
E atribuo esse CodeBlock a elas no PRG principal ?
É que pelo conecimento que tenho acho que no arquivo FMG não posso declarar variaveis locais. Faço essa declaração no PRG principal ?
Caso faça no PRG principal, elas são reconhecidas NO Formulário ?
Forte abraço.
Re: Ajuda na criação de Botões
Enviado: 09 Jan 2026 21:00
por ivanil
Ola Fernando;
Para usar bloco estendido basta declarar normalmente;
Código: Selecionar todos
function xx
local b:={||
Local i,b:=100
for i=1 to b
//faca algo
next
return //algo
}
Local blostfocus:={||facaAlgumacoisa()}
Eu o uso apenas em situações muito especiais, por deixar o código pouco legível, e tem um detalhe, só vai funcionar nos controles se você atribuir diretamente a propriedade depois da criação, pois se fizer antes, o pre-processador ira colocar o bloco dentro de outro bloco e provavelmente falhara.
Fernando Almeida escreveu: 09 Jan 2026 17:14
... como posso usar esta propriedade aControls := Form.Controls porque precisava da matriz de controles associado ao objeto...
Re: Ajuda na criação de Botões
Enviado: 10 Jan 2026 00:59
por Fernando Almeida
Vou experimentar. Se tiver alguma duvida, volto a perguntar.
Um abraço.

Re: Ajuda na criação de Botões
Enviado: 10 Jan 2026 11:52
por Fernando Almeida
Bom dia colegas, acho que devo apresentar a função corrigida e mais simplificada de configuração de botões para não induzir a erro.
Código: Selecionar todos
FUNCTION CFG_Botoes_Artigos( aNomeButton, oldNomeBT )
LOCAL ponteiro
STATIC matriz_Botao_Artigo :={}
IF oldNomeBT !=Nil .AND. aNomeButton !=oldNomeBT &&VAI VERIFICAR SE PODE DESATIVAR O BOTAO ANTERIOR
ponteiro :=HB_AScan(matriz_Botao_Artigo, { |x| ValType( x ) == "C" .AND. x == oldNomeBT } )
IF ponteiro>0
AnulaBotoesArtigos( oldNomeBT )
// HB_ADel( matriz_Botao_Artigo, ponteiro, .T. )
ENDIF
ENDIF
IF aNomeButton !=Nil &&ATIVA OS BOTOES DA ESCOLHA CORRENTE
ponteiro :=HB_AScan(matriz_Botao_Artigo, { |x| ValType( x ) == "C" .AND. x == aNomeButton } )
IF ponteiro==0
HB_AIns( matriz_Botao_Artigo, , aNomeButton, .T. )
ENDIF
Carrega_Botoes_Artigos( aNomeButton )
ENDIF
Return Nil
Basta fazer isto com o nome do botão na matriz.
Sr. Ivanil na pasta DOC só encontro arquivos HTML que fazem parte da ajuda do IDE, presumo eu.
Não se referia a estes arquivos?