CONTROLE PAI

SINCLAIR 21/04/2015 23:54:24
#446047
Colegas, sobre VB6 que ando enferrujado.

Tenho um form com 3 controles, sendo

1 frame
1 textbox
1 botão de comando

Tanto o textbox quanto o botão de comando estão dentro do frame.

No click do botão de comando, coloquei o código

msgbox text1.parent.name


com objetivo de pegar o nome do frame no qual o textbox está inserido. Mas [Ô]parent.name[Ô] traz o nome do formulário e não do frame.

Tem como pegar o nome do frame?

Grato, colegas.
SINCLAIR 22/04/2015 08:40:26
#446054
Colegas,

Com...

Public Declare Function GetParent Lib [Ô]user32[Ô] (ByVal hWnd As Long) As Long

Dim m_hWnd As Long
m_hWnd = GetParent(Text1.hWnd)
If m_hWnd = Frame1.hWnd Then
MsgBox ([Ô]sim[Ô])
Else
MsgBox ([Ô]nao[Ô])
End If


Eu consigo saber se o pai de Text1 é Frame1, mas se houver muitos frames no formulário, terei que avaliar um a um. Até ai sem problemas, porque posso colocar em um laço For Each. Mas ocorre que não bastará saber o nome, no caso Frame1, porque pode haver um array, teria que ser o índice do Frame1 também, ou seja, Frame1(0). Mesmo que [Ô]Frame1[Ô] e o índice [Ô]0[Ô] venham em variáveis separadas.

Alguma luz, colegas?

SINCLAIR 22/04/2015 09:23:13
#446059
Colegas,

Consegui com o código abaixo. Mas antes de fechar o tópico, aguardarei mais algumas horas, para o caso de algum colega ter uma solução mais simples.


       
Dim m_hWnd As Long
Dim intContadorDeIndices As Integer
Dim intIndiceDoFramePai As Integer
Dim Controle As Control

[ô]Pegar o hWnd do controle
m_hWnd = GetParent(Text1.hWnd)

[ô]Procurar em todos os frames o nome e índice do frame pai
For Each Controle In Me.Controls

[ô]Inicializa a variável (ficará -1 para o caso de o controle não ter um frame_scroll pai)
intIndiceDoFramePai = -1

[ô]Frame Scroll
If TypeOf Controle Is Frame Then

[ô]Fazer loop nos índices
For intContadorDeIndices = Frame1.LBound To Frame1.UBound

[ô]Se coindicidir o hWnd
If m_hWnd = Frame1(intContadorDeIndices).hWnd Then

[ô]Armazenar qual o índice do frame_scroll pai
intIndiceDoFramePai = intContadorDeIndices

[ô]Pode sair do for
GoTo AchouIndice

End If

Next intContadorDeIndices

End If
Next

AchouIndice:

[ô]Caso tenha achado um índice de frame_scroll
If intIndiceDoFramePai >= 0 Then
MsgBox ([Ô]Frame [Ô] & intIndiceDoFramePai)
End If


Tudo de bom a todos.
SINCLAIR 22/04/2015 17:29:30
#446086
Colegas,

A solução acima não funcionou.

Descobri que (ao menos olhando as propriedades depois do ponto) nem todos os controles possuem a propriedade hWnd (uso uma ocx chamada ActiveText).

O [Ô].parent[Ô] sempre retorna o nome do form. Queria que retornasse o nome do frame em que a text1 está dentro e o índice do frame também porque tenho frame(0) até frame(x).

Alguma luz, colegas?

SINCLAIR 23/04/2015 13:49:45
#446106
Colegas,

A resposta é

.container.name

e

.container.index
Tópico encerrado , respostas não são mais permitidas