PROBLEMAS COM DTPICKER

LIZANDER 11/01/2010 22:30:50
#331641
Olá pessoal...

Utilizo alguns Dtpicker em meu projeto e estou tendo um probleminha...

No primeiro cadastro, ao receber o foco, o Dtpicker posiciona o foco no dia da data... se o meu usuário digita o dia, move para direita, digita o mês, mais move para direita e digita o ano, no próximo cadastro o dtpicker recebe o foco no ano, ou seja no último que foi usado naquele componente dtpicker...

Como faço para que ao receber o foco, o cursor esteja no dia da data e não no ano, como no exemplo acima.. Já olhei as propriedades do dtpicker, mas não encontrei nenhuma que parecesse algo com tal significado..
WEBMASTER 12/01/2010 11:36:04
#331659
Resposta escolhida
Sera que um sendkey no on focus do comoponente nao ajuda ?
LIZANDER 14/01/2010 17:29:46
#331919
Caro Webmaster...

Depende do Sendkey... Eu já tinha pensado nisso...

O problema é que o usuário pode parar no dia, mês, ou ano... por exemplo: Se a data apresentada (eu sempre preencho com a data atual) é a que o usuário quer, ele não mexe em nada, então o cursor fica no dia. Se neste caso eu der um sendKey com dois Left, ele vai parar no mês (pois o controle dá loop).
Se o cara só alterar o dia, o cursor pula para o mês. Neste caso, o cursor com o mesmo sendkey vai parar no ano.
Somente se o cara alterar dia, mês e ano os dois sendkeys para a esquerda vão deixar o cursor no dia.

Tentei com Home, mas ele não funciona... apenas vai para o primeiro do item selecionado (01 para dia e mês e 1753 para o ano) .

Se existe alguma outra tecla que eu possa usar no sendkey que possa retornar o cursor para o início do campo de data, eu desconheço, mas como não tenho tanto tempo assim de VB, não sou senhor da verdade...

O que eu quero é que independente de onde o cara parou dentro do DTPICKER, no próximo acesso a este campo o mesmo esteja com o cursor parado no DIA, e não no último que foi acessado no item anterior.

Espero que tenham entendido...

Continuo no aguardo de uma alma caridosa....
WEBMASTER 14/01/2010 18:49:27
#331925
Este exemplo nao funcionou como eu queria
Mas deve servir de base para voce ter sucesso na resposta...

Usando a API SendMessage eu envio a mensagem de selstart (que obviamente o componente nao tem por padrao), precisa agora eh pesquisar qual e a constante que DatePicker aceita pra selstart.

Adicione um datepicker e um command button a um form e veja o resultado


Option Explicit

Private Declare Function SendMessage Lib [Ô]user32[Ô] Alias [Ô]SendMessageA[Ô] (ByVal hWnd As Long, ByVal wMsg As Long, ByRef wParam As Long, ByRef lParam As Long) As Long
Private Declare Function GetFocus Lib [Ô]user32[Ô] () As Long

Private Const EM_GETSEL = &HB0
Private Const EM_SETSEL = &HB1
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_LINEINDEX = &HBB
Private Const EM_LINELENGTH = &HC1
Private Const EM_LINEFROMCHAR = &HC9

Private Sub Command1_Click()
Dim lCurPos As Long
Dim hWnd As Long
Dim lStart As Long
Dim lEnd As Long

DTPicker1.SetFocus
hWnd = GetFocus
Call SendMessage(hWnd, EM_GETSEL, lStart, lEnd)
Debug.Print [Ô]Start:[Ô] & lStart
Debug.Print [Ô]End:[Ô] & lEnd
End Sub
LIZANDER 15/01/2010 11:47:32
#331993
Caro Webmaster...

Não entendi onde isso pode me ajudar...

Fiz o exemplo e ele deu Start = 0 e End = 0...

Mas o cursor permanece onde estava no último acesso ao DtPicker... se estava no mês, continua no mês, se estava no ano, continua no ano...

Mas agradeço a tentativa... e o problema segue sem solução...
WEBMASTER 15/01/2010 13:08:37
#332019
Entao...
Isso te ajuda no gotfocus do objeto mandando um sendmessage para [Ô]dizer[Ô] que a selstart do componente deve comecar em zero.
Esse codigo funciona perfeitamente o unico problema eh que date picker nao interpreta a constante usada (a que passei ali se baseia em textbox) tem que procurar pela constante que efetivamente faca a traducao da mensagem para o date picker.
MARCELO.TREZE 15/01/2010 13:17:06
#332023
tente usar um componente de terceiros

tipo esse
http://www.vbmania.com.br/pages/index.php?varModulo=Detalhe&varID=5271
MARCOSLING 15/01/2010 13:29:04
#332024
A forma de digitar no DatePicker não me agrada muito... não é muito produtivo operacionalmente.

Eu prefiro utilizar um textbox mascarado com um botão para [Ô]chamar[Ô] um calendario popup.
LIZANDER 15/01/2010 13:53:45
#332029
Obrigado a todos, mas eu queria uma coisa lógica em um componente nativo do VB.

Já pensei em usar componente de terceiros... não é minha primeira opção.

Me recuso a acreditar que a microsoft tenha desenvolvido um componente nativo que eu não consiga posicionar o cursor onde eu quero...

Em algum lugar do DatePicker ele guarda a posição que estava quando do último acesso a ele, uma vez que reproduz essa posição no componente no próximo acesso. Eu só queria uma maneira de fazer ele voltar ao início do campo, ou seja, o dia.

Não queria e não gosto de usar componentes de terceiros para algo que o VB tem de nativo... é como se eu tivesse saindo pela tangente...

Enfim, se ninguém (além do webmaster), se dispôs a tentar me ajudar com o componente DTPicker, apenas me recomendando trocar o componente, continuarei tentando achar uma solução e, assim que conseguir, posto aqui no fórum.

Agradeço a todos pelas respostas.
WEBMASTER 16/01/2010 11:07:03
#332112
Apesar deste topico nao ser conclusivo, varias pessoas dao ideias para resolver o mesmo problema que outro desenvolvedor tinha igual a voce:

http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_Controls/Q_10324430.html

Realmente chama a atencao o fato do componente nativamente nao entender as constantes de SendMessage sendo necessario implementar uma subclasse nele para descobrir o filho do filho do componente textbox que ele possui no final da cadeia. O que muitos apontam como solucao dada esta falta de inteligencia em interpretar SendMessage eh fazer com que varios SendKeys de forma diferentes sejam tentados.

Se realmente voce nao encontrar solucao, crie voce a sua mesmo. Crie um user control com 3 textbox (dia/mes/ano) e faca os tratamentos que precisar (se nao tem necessidade [ô]mostrar[ô] o calendario, eh simplesmente uma questao de entrada de dados, ajuda bastante)
Tópico encerrado , respostas não são mais permitidas