Olá pessoal,
quando comecei a programar em Clipper, adorava o espaço cargo existente no tbrowse.
Ele possibilitava o armazenamento de informações necessárias no próprio objeto, sem a necessidade de criação de variáveis e programação extra para tratar as mesmas.
Então, a partir da pergunta de um amigo, achei interessante lembrar os companheiros da existência o espaço cargo nos objetos da Minigui (label, textbox, etc.).
O tsbrowse não tem esse espaço vinculado ao próprio objeto, mas apenas às colunas de dados.
Para exemplificar, tomemos como base um combobox que exibe o nome de clientes para seleção.
Por questões estéticas ou praticidade é interessante exibir apenas o nome.
Mas uma vez escolhido o cliente, eu preciso na verdade é do código vinculado ao mesmo.
Tudo bem, há diversas maneiras de se obter isso, inclusive com uma nova consulta ao banco de dados.
Mas utilizando o espaço cargo, isso fica fácil, fácil...
Como?
É só inicializar o cargo como uma matriz vazia.
formulario.combobox.cargo := {}
E, na rotina que atualiza o seu conteúdo, utilizar algo do tipo
...
formulario.combobox.additem(nomedocliente)
aadd(formulario.combobox.cargo,codigodocliente)
Assim, quando quiser o nome do cliente corrente/ selecionado utilize
formulario.combobox.item(formulario.combobox.value)
E quando quiser o código do cliente corrente/ selecionado utilize
formulario.combobox.cargo[formulario.combobox.value]
Espero ter ajudado.
MarceloG
Controles Minigui
Moderador: Moderadores
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Controles Minigui
Marcelo, você tem algum exemplo disso ? Para podermos visualizar o que vocÊ está dizendo ? Parece-me muito interessante.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
-
MARCELOG
- Usuário Nível 4

- Mensagens: 546
- Registrado em: 15 Mar 2005 16:54
- Localização: Divinópolis/MG
Re: Controles Minigui
Olá Combatente, veja isto...
...
@ 10,10 COMBOBOX C_ESPECIE ;
ITEMS { 'A' , 'B' , 'C' } ;
VALUE 1 ;
ON ENTER {||MSGINFO('O CODIGO E : '+THIS.CARGO[THIS.VALUE])}
JANELA.C_ESPECIE.CARGO := {'01','02','03'}
Conforme se vê, num mesmo controle está armazenado a descrição e o código.
Atenciosamente.
MarceloG
...
@ 10,10 COMBOBOX C_ESPECIE ;
ITEMS { 'A' , 'B' , 'C' } ;
VALUE 1 ;
ON ENTER {||MSGINFO('O CODIGO E : '+THIS.CARGO[THIS.VALUE])}
JANELA.C_ESPECIE.CARGO := {'01','02','03'}
Conforme se vê, num mesmo controle está armazenado a descrição e o código.
Atenciosamente.
MarceloG
Água mole em pedra dura tanto bate que até espirra!
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Controles Minigui
Oi Marcelo, obrigado pelos esclarecimentos. Tenho ainda dificuldades e não sei como fazer atualizar os dados de um combobox que esteja aninhado a um grid. Tem um colega no fórum oficial da HMG que justamente indagou sobre isso. O indiano rathinagiri de lá do fórum tinha dito que isso iria demandar muito código, mas não mostraram os caminhos das pedras... aí como você tocou neste assunto talvez pudesse postar um exemplo. Pois esse exemplo é para o combobox apenas e até imagino que seria factível mas quando é dentro de um grid como faria o refresh dos itens de combobox de cada registro ? Na sua primeira mensagem você menciona "na rotina que atualiza o seu conteúdo" mas pelo minhas tentativas essa rotina não pode ser "mudado" no COLUMNCONTROLS do grid porque ele não atualiza conforme vai mudando de registros. Fiz tentativas baseando-me no C:\hmg.3.0.35\SAMPLES\GRID.15\demo.prg ms não conseguí. Você que acha Marcelo seria possível ? Poderia indicar-me como fazer ? Utilizaria o espaço "cargo" ?
Segue o código exemplo:Parece não ter jeito... Pois na 3ª coluna o combobox assume como "zero" sempre e não muda. Isso deve ser porque o valor do combobox está encapsulado no momento da construção do Grid. Gostaria de saber como dar o pulo do gato para essa questão.
Segue o código exemplo:
Código: Selecionar todos
/*
* HMG Grid Demo
* (c) 2005 Roberto Lopez
*/
#include "hmg.ch"
Function Main
Local aRows [20] [3]
Private fColor := { || if ( This.CellRowIndex/2 == int(This.CellRowIndex/2) , { 0,0,255 } , { 0,255,0 } ) }
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 640 ;
HEIGHT 400 ;
TITLE 'Mixed Data Type Grid Test' ;
MAIN
DEFINE MAIN MENU
DEFINE POPUP 'File'
MENUITEM 'Set Item' ACTION SetItem()
MENUITEM 'Get Item' ACTION GetItem()
END POPUP
END MENU
aRows [1] := {113.12,date(),1,1 , .t. }
aRows [2] := {123.12,date(),2,2 , .f. }
aRows [3] := {133.12,date(),3,3, .t. }
aRows [4] := {143.12,date(),1,4, .f. }
aRows [5] := {153.12,date(),2,5, .t. }
aRows [6] := {163.12,date(),3,6, .f. }
aRows [7] := {173.12,date(),1,7, .t. }
aRows [8] := {183.12,date(),2,8, .f. }
aRows [9] := {193.12,date(),3,9, .t. }
aRows [10] := {113.12,date(),1,10, .f. }
aRows [11] := {123.12,date(),2,11, .t. }
aRows [12] := {133.12,date(),3,12, .f. }
aRows [13] := {143.12,date(),1,13, .t. }
aRows [14] := {153.12,date(),2,14, .f. }
aRows [15] := {163.12,date(),3,15, .t. }
aRows [16] := {173.12,date(),1,16, .f. }
aRows [17] := {183.12,date(),2,17, .t. }
aRows [18] := {193.12,date(),3,18, .f. }
aRows [19] := {113.12,date(),1,19, .t. }
aRows [20] := {123.12,date(),2,20, .f. }
@ 10,10 GRID Grid_1 ;
WIDTH 620 ;
HEIGHT 330 ;
HEADERS {'Column 1','Column 2','Column 3','Column 4','Column 5'} ;
WIDTHS {140,140,140,140,140} ;
ITEMS aRows ;
EDIT ;
COLUMNCONTROLS { ;
{'TEXTBOX','NUMERIC','$ 999,999.99'} , ;
{'DATEPICKER','DROPDOWN'} , ;
{'COMBOBOX',Rotina()} , ;
{ 'SPINNER' , 1 , 20 } , ;
{ 'CHECKBOX' , 'Yes' , 'No' } ;
} ;
COLUMNVALID { ;
{ || This.CellValue > 100 } , ;
{ || This.CellValue = Date() } , ;
Nil , ;
Nil , ;
Nil ;
}
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
Function Rotina()
/* Digamos que aqui é feito uma pesquisa em outro dbf para retornar os
itens de cada registro da coluna 3, conforme for mudando de ponteiro
no Grid.
Para sintetizar fiz apenas registro 1 e demais registros só para ver se faz o
refresh dos dados no Combobox.
*/
If IsControlDefined(Form_1,Grid_1)=.F.
Return {"Zero","Zero","Zero"}
Endif
nRegistro:=GetProperty( "Form_1", "Grid_1", "Value")
If nRegistro=1
aNovosItens:= {'One','Two','Three'}
Else
aNovosItens:= {'Four','Five','Six'}
Endif
Return aNovosItens
PROCEDURE SETITEM()
Form_1.Grid_1.Item (2) := { 123.45 , date() , 2 , 10 , .T. }
RETURN
PROCEDURE GETITEM()
local a
a := Form_1.Grid_1.Item (2)
msginfo ( str ( a [1] ) , '1' )
msginfo ( dtoc ( a [2] ) , '2' )
msginfo ( str( a [3] ) , '3' )
msginfo ( str ( a [4] ) , '4' )
msginfo ( if ( a [5] == .t. , '.t.' , '.f.' ) , '5' )
RETURNUm clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
-
MARCELOG
- Usuário Nível 4

- Mensagens: 546
- Registrado em: 15 Mar 2005 16:54
- Localização: Divinópolis/MG
Re: Controles Minigui
Olá Pablo,
eu não uso o grid nas minhas aplicações.
Todavia, pelo que entendi, ele faz a avaliação da coluna combobox uma única vez, na inicialização, e exibe o resultado da seleção com base no conteúdo da célula.
Se a célula contém, por exemplo, o nº 3, será exibido o 3º elemento do combobox/array.
Esse é o comportamente normal esperado, e é o que se verifica.
Para ter mais liberdade, é preferível usar o tsbrowse, que tem vários recursos e pode proporcionar a criação de um combobox ou mesmo listbox único para o registro com edição em linha.
Ou então, fazer uma modificação no código fonte do grid para avaliar nas exibições a rotina que gera as opções do combobox.
Como o grid já é lento por natureza, não acho uma boa opção.
Outra alternativa (gambiarra) é exibir e editar os dados numa janela, construindo um combobox exclusivo para a situação.
Nesse caso, não há edição em linha e o campo vai conter a seleção propriamente dita e não uma referência para ela.
Atenciosamente.
MarceloG
Ps: Voce pode criar a janela sobre o próprio grid, simulando uma edição em linha, para dar um "ar" profissional.
eu não uso o grid nas minhas aplicações.
Todavia, pelo que entendi, ele faz a avaliação da coluna combobox uma única vez, na inicialização, e exibe o resultado da seleção com base no conteúdo da célula.
Se a célula contém, por exemplo, o nº 3, será exibido o 3º elemento do combobox/array.
Esse é o comportamente normal esperado, e é o que se verifica.
Para ter mais liberdade, é preferível usar o tsbrowse, que tem vários recursos e pode proporcionar a criação de um combobox ou mesmo listbox único para o registro com edição em linha.
Ou então, fazer uma modificação no código fonte do grid para avaliar nas exibições a rotina que gera as opções do combobox.
Como o grid já é lento por natureza, não acho uma boa opção.
Outra alternativa (gambiarra) é exibir e editar os dados numa janela, construindo um combobox exclusivo para a situação.
Nesse caso, não há edição em linha e o campo vai conter a seleção propriamente dita e não uma referência para ela.
Atenciosamente.
MarceloG
Ps: Voce pode criar a janela sobre o próprio grid, simulando uma edição em linha, para dar um "ar" profissional.
Água mole em pedra dura tanto bate que até espirra!
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Controles Minigui
tsbrowse ? é da HMG Extended. Pelo que eu vi vou ter que gerar a lib que o Fitalov postou, apesar de que foi relatados erros.
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.