CONVERSAO DE VARIAVEIS
Estou criando uma rotina para validação de dados de usuários. Criei uma tabela aonde armazeno os campos e a descrição. Nesta tabela, também armazeno o nome do controle que irei validar.
Em sÃntese: pesquiso no banco de dados o campo que desejo validar. No código em questão, o campo Nome. Associo ao campo nome o nome do controle que o representa no Form: Text1. Quando tento setar (Set Controle = CampoValidar) da erro, claro, pois os tipos são incompatÃveis. Aqui está minha dúvida: tem como eu converter uma variável texto em Objeto, ou em qualquer outra coisa que possa ser intanciada em um controle (um TextBox, por exemplo)?
Uso Access com VB6.
Dim tbCamposR As New ADODB.Recordset
Dim Controle As Control
Dim CampoValidar As Variant
tbCamposR.Open [Ô]SELECT * FROM campos WHERE Origem=1[Ô], Conn, adOpenForwardOnly, adLockOptimistic
tbCamposR.Find [Ô]Campo=[ô]Nome[ô][Ô]
CampoValidar = tbCamposR!Text1
Set Controle = CampoValidar
Em sÃntese: pesquiso no banco de dados o campo que desejo validar. No código em questão, o campo Nome. Associo ao campo nome o nome do controle que o representa no Form: Text1. Quando tento setar (Set Controle = CampoValidar) da erro, claro, pois os tipos são incompatÃveis. Aqui está minha dúvida: tem como eu converter uma variável texto em Objeto, ou em qualquer outra coisa que possa ser intanciada em um controle (um TextBox, por exemplo)?
Uso Access com VB6.
Hum... macro-substituição. (Sou Clippereiro mesmo!)
Amigo,
Veja se isso pode lher ajudar:
[ô]Solução em VB para macro-substituição (para qualquer componente do Form ativo)
Public Function MacroObjectControl(ByVal sControlName As String) As Object
Dim oControlTemp As Object
Set MacroObjectControl = Nothing
For Each oControlTemp In VB.Screen.ActiveForm.Controls
If (UCase(Trim(oControlTemp.Name)) = UCase(Trim(sControlName))) Then Exit For
Next oControlTemp
Set MacroObjectControl = oControlTemp
End Function
[ô]Uso:
Dim oCtrl As TextBox [ô]ou: Dim oCtrl As Object / Dim oCtrl As Control
Set oCtrl = MacroObjectControl(SeuRecordset!CampoNomeControle)
MsgBox oCtrl.Text
Teste e nos diga em que resultou.
Até mais.
Amigo,
Veja se isso pode lher ajudar:
[ô]Solução em VB para macro-substituição (para qualquer componente do Form ativo)
Public Function MacroObjectControl(ByVal sControlName As String) As Object
Dim oControlTemp As Object
Set MacroObjectControl = Nothing
For Each oControlTemp In VB.Screen.ActiveForm.Controls
If (UCase(Trim(oControlTemp.Name)) = UCase(Trim(sControlName))) Then Exit For
Next oControlTemp
Set MacroObjectControl = oControlTemp
End Function
[ô]Uso:
Dim oCtrl As TextBox [ô]ou: Dim oCtrl As Object / Dim oCtrl As Control
Set oCtrl = MacroObjectControl(SeuRecordset!CampoNomeControle)
MsgBox oCtrl.Text
Teste e nos diga em que resultou.
Até mais.
JSFF77, bem pensado o [Ô]For Each...[Ô]. Aliás, grande sacada. Confesso que perderia alguns fios de cabelos até chegar nessa conclusão por minhas próprias pernas. Porém há um pequeno problema, tanto no seu código quanto no que criei: funciona para um controle, mas não para uma matriz de controles. Por exempo, para um controle Text1 funciona. Mas não para Text1(0) ou Text(1).
Vou tentar contornar o problema. Se você conseguir antes, o qualquer outro usuário, poste aqui. Depois publico na Ãntegra a função para validação de campos.
Vou tentar contornar o problema. Se você conseguir antes, o qualquer outro usuário, poste aqui. Depois publico na Ãntegra a função para validação de campos.
Encontrei uma solução. Na tabela, armazeno o nome do componente (que sempre será do tipo Control) e o Ãndice, uma vez que utilizo uma matriz de componentes. Por exemplo, se utilizo um componente TextBox, cujo o nome e Ãndice é Text1(0), armazeno no banco de dados o nome (Text1) e o Ãndice (0).
Desta forma, sua função pode ser escrita assim:
Bem, problema parcialmente resolvido. Agora vou implementar a função de validação. Valeu pela dica !
Desta forma, sua função pode ser escrita assim:
Public Function MacroObjectControl(ByVal sControlName As String, ByVal Indice As Integer) As Object
Dim oControlTemp As Object
Set MacroObjectControl = Nothing
For Each oControlTemp In VB.Screen.ActiveForm.Controls
If (UCase(Trim(oControlTemp.Name)) = UCase(Trim(sControlName))) Then
If oControlTemp.Index = Indice Then
Set MacroObjectControl = oControlTemp
Exit For
End If
End If
Next oControlTemp
End Function
Bem, problema parcialmente resolvido. Agora vou implementar a função de validação. Valeu pela dica !
Tópico encerrado , respostas não são mais permitidas