Ir para conteúdo
Fórum Script Brasil
  • 0

Manipulando Forms com Direitos de acesso


Xistyle

Pergunta

Pessoal, boa noite!

Por favor, alguém poderia me auxiliar na seguinte questão:

Estou trabalhando com direitos de acesso em meu projeto. Consegui manipular corretamente as permissões mas estou com problemas numa rotina de verificação de formulários abertos. Bom vamos para a parte mais técnica...

Meu menu está em um TreeView. Achei interessante antes de abrir um form, verificar se o mesmo já está aberto, negando a abertura de um novo form. Assim, criei uma function que utiliza a propriedade Forms, percorrendo todos os forms abertos pelo projeto.

Public Function fcVerificaFormAberto(sNomeForm As String) As Boolean
Dim iCont As Integer
    
    sNomeForm = UCase(sNomeForm)
    fcVerificaFormAberto = False
    
    For iCont = 0 To Forms.Count - 1
        
        If UCase(Forms(iCont).Name) = sNomeForm Then
            fcVerificaFormAberto = True
            iFormAberto = iCont
            Exit Function
            
        End If
        
    Next
    
End Function
A partir daqui o menu permitirá a abertura do form, caso a função retorne False. Ao retornar False, a rotina de abertura de formulários realiza o seguinte processo:
If fcVerificaFormAberto(sTela) = False Then
            Set oTela = Forms.Add(sTela)
            
            If sPermiteAbertura = "S" Then
                oTela.Show
            End If
           
End If

Sendo sPermiteAbertura uma variável global que está no Load de cada form que será aberto, fazendo a verificação dos direitos de acesso. Meu problema está no código Set oTela = Forms.Add(sTela), pois quando o usuário não tem permissão para acessar a tela, o form é adicionado ao projeto, mesmo não estando aberto. Com isso, não consigo abrí-lo, mesmo que configure os direitos de acesso. Apenas conseguirei acessar se fechar o sistema.

Existe algum comando contrário ao Forms.Add, tipo um Forms.Remove onde eu possa passar um índice e remover esse form não aberto da memória?

Abraços

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Poxa cara isso é interessante, mostra aí para gente como você conseguiu. Se você acha uma solução tb é muito bom mostra-la para todos, assim outros irão aprender.

eu mesmo fiquei curioso em saber qual foi a solução. ^^

isso mesmo. e por isso tb q não gosto de fechar topicos. olhai já tinha mais gente interessada no assunto, se eu tivesse fechado, o new_rayderss não teria postado aqui. sempre tem mais a se discutir.

mas, então, não sei o q ele fez, mas acho q da pra resolver com o unload. tipo:

Unload Forms(2)
onde 2 é o indice do formulario (o primero formulario aberto é o indice 0, cada novo formulario inserido, é o proximo indice). se você quiser remover o form q chama "Form2", faca tipo assim:
Dim x As Form
    For Each x In Forms
        If x.Name = "Form2" Then Unload x
    Next[/code] EDITADO: mas tb olhando o seu codigo agora, xistyle... se não tem permissao de abrir, pra q você vai carregar então?? se ele não vai abrir, o mais facil não seria nem carregar?? tipo assim:
[code]If sPermiteAbertura = "S" Then
                Set oTela = Forms.Add(sTela)
                oTela.Show
            End If

so adiciona se tiver permissao.

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0

Opa desculpa pessoal... é que tava com um pouco de pressa para entregar esse módulo.

Mas foi essa solução mesmo que usei kuroi, por Unload Forms(IndexDoForm)

Não sei se é porque não sei manipular muito bem os forms com VB6, mas acho bem complicado trabalhar com forms. Por exemplo: no projeto que estou trabalhando, o esquema de pesquisa (consulta) para as telas é unificado.

Por exemplo: existe uma tela onde é realizado o cadastramento de filiais. Nesse form, são realizados Insert, Update e Delete. Existe um TextBox, com nome padrão txtCodigo, que possui um evento Validate.

Nesse evento, ele verifica se o código digitado da filial existe no BD e, se existir, carrega os campos do form.

Mas fica complicado para saber qual o último código existente, sem ter uma consulta. Sendo assim, existe uma tela única de consulta para todos os forms do sistema.

Problemas:

A tela de Pesquisa realiza a busca correta dos itens, carregando-os numa grid. O usuário tem a opção de pesquisar por um trecho de nome ou código da tela que está pesquisando. O problema está na hora de carregar os dados na tela.

Imagine a seguinte situação: abri a tela de Filial e cliquei na consulta. Tela de Filial em background e Pesquisa em foco. Quando clico duas vezes na grid, como faço para passar esse código da filial para o form de Filial já aberto?

Se usar os códigos abaixo, não funcionam (uso uma grid chamada Spread 6.0)

Dim frm AS Form

     Set frm = frmFilial
     frm.txtCodigo.Text = grdPesquisa.GetText Col, Row, vCodigo
     Call frm.txtCodigo_Validate(False)

Se utilizar um comando como esse, o VB6 cria um novo frmFilial na memória e passa essas informações à esse form, que ainda não foi aberto (sem Show). O frmFilial em background continua com o txtCodigo em branco.

Alguma sugestão?

Abraços e mais uma vez desculpe!

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

  • 0

conheco o spread, é um grid muito bom.

quanto ao esse codigo, tb sempre uso um form so pra pesquisa de todos. e pra passar o codigo pro otro formulario, eu usava uma variavel publica pra pesquisa. e guardava o codigo sempre nessa variavel.

mas isso é porque eu não sabia pra q formulario eu ia passar o codigo. então eu passava no proprio formulario. exemplo, eu chamava a pesquisa aqui:

Private Sub cmdPesquisa_Click()
    frmPesquisa.Show vbModal

    txtCodigo.Text = intPesquisa 'Aqui eu setava o codigo com o codigo selecionado durante a pesquisa.
End Sub[/code] ai no form de pesquisa, eu passava o codigo pra essa variavel em vez de passar para o textbox. mas se você quer passar direto pro formulario, e ele já ta aberto, acho q se você simplesmente fizer isso funciona:
[code]frmFilial.txtCodigo.Text = grdPesquisa.GetText Col, Row, vCodigo
frmFilial.txtCodigo_Validate False

ve ai.

Link para o comentário
Compartilhar em outros sites

  • 0

kuroi, boa noite!

Não consegui utilizar de acordo com o último código informado. O VB6 instancia um novo form na memória, não Show. Gostaria de passar esse código, pego na grid, para o form que está em background.

Não entendi também a forma que você utiliza, visto que usa da mesma forma como eu. Eu chamo a Pesquisa a partir de uma toolbar. A toolbar abre esse form de Pesquisa passando por parâmetro os campos que devem ser pesquisados para carregar na grid. Aí a dificulade para carregar essa informação ao clicar duas vezes na grid ;/

Link para o comentário
Compartilhar em outros sites

  • 0

é, tem razao. você não só consegue usar esse codigo q eu falei se você tivesse chamado por exemplo frmFilial.Show

mas é simples, é so você passar o indice. se você não sabe o indice você faz um for pra achar o form pelo nome. exemplo:

Forms(indice).txtCodigo.Text = grdPesquisa.GetText Col, Row, vCodigo
Forms(indice).txtCodigo_Validate False[/code] onde o indice é o indice do frmFilial. se você não sabe qual o indice pegue pelo nome. tipo assim:
[code]For i = 0 To Forms.Count - 1
    If Forms(i).Name = "frmFilial" Then
        Forms(i).txtCodigo.Text = grdPesquisa.GetText Col, Row, vCodigo
        Forms(i).txtCodigo_Validate False
        Exit For
    End If
Next

logico q você vai acabar tendo problemas se tiver mais de um frmFilial aberto, mas imagino q você não tenha.

Link para o comentário
Compartilhar em outros sites

  • 0

kuroi, muito obrigado pela ajuda!

Funcionou sim! Vou testar para os demais forms. Não preciso me preocupar com o form já aberto, pois montei uma rotina que não abre duas vezes o mesmo form.

Segue o código abaixo para os interessados, achei muito interessante:

Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long


Public Function fcVerificaFormAberto(sNomeForm As String) As Boolean
Dim iCont   As Integer
Dim lJanela As Long
   
    sNomeForm = UCase(sNomeForm)
    fcVerificaFormAberto = False
   
    For iCont = 0 To Forms.Count - 1
        
        'Verifica se o nome do formulário em questão já foi instanciado pelo projeto
        If UCase(Forms(iCont).Name) = sNomeForm Then
            fcVerificaFormAberto = True
            iFormAberto = iCont
                        
            lJanela = FindWindow(vbNullString, Forms(iCont).Caption)
            
            'Verifica se a janela está minimizada
            If IsIconic(lJanela) Then
                
                ShowWindow lJanela, 9 'Maximiza
                SetForegroundWindow lJanela 'Sobrepõe sobre as outras
                
            Else
                
                SetForegroundWindow lJanela 'Sobrepõe sobre as outras
            End If
              
        End If
        
    Next
    
End Function
Onde: sNomeForm é passada por parâmetro pelo menu que chama a tela. iFormAberto é uma variável global usada somente para receber o índice do form aberto no projeto. Abaixo o teste para o Menu:
If fcVerificaFormAberto(sTela) = False Then
            Set oTela = Forms.Add(sTela)
            
            If sPermiteAbertura = "S" Then
                oTela.Show
                Set oTela = Nothing
            
            Else
                'Ao passar pela rotina de forms abertos e verificar que o form não está,
                'o índice do Forms está com a quantidade de telas abertas antes da tela em questão
                'ser aberta, pois ela só é adicionada no Forms.Count quando passa pela linha
                'Forms.Add(sTela). Assim, removi um índice a mais, ou seja, a tela que acabou de ser
                'aberta.
                Unload Forms(iFormAberto + 1)
            End If
           
End If

Onde:

oTela é uma variável do tipo Form

sPermiteAbertura é uma variável global usada nesse teste e em uma rotina de direitos de acesso.

Muito obrigado pela colaboração!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,7k
×
×
  • Criar Novo...