CONVERSAO DE VARIAVEIS

HIDDEN 13/08/2009 12:51:29
#319762
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.


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.
JSFF77 13/08/2009 13:15:27
#319765
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.

HIDDEN 13/08/2009 13:36:37
#319768
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.
HIDDEN 13/08/2009 14:17:54
#319769
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:

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