• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Point

[VB.net] Ler e editar ficheiros de texto

9 mensagens neste tópico

Ppl, alguem me pode explicar como se faz o seguinte programa? (se possivel com exemplos de código)

Form:

untitledbd4.png

Formatação do texto:

capturaecra1ye4.png

O objectivo é, ao inserir um dado (neste caso o nº) ele vá ao ficheiro de texto procurar e preencha as restantes textboxes com os dados do texto.  Após isso, poder-se alterar o Nome ou a localidade e ele alterar isso no ficheiro de texto. 

PS, a formatação do texto não tem obrigatoriamente de ser essa.  Se houver uma maneira que torne isso mais facil, digam.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

para ires buscar os dados ao ficheiro de texto, uma coisa deste tipo dava:


'Variáveis globais para guardar os dados do ficheiro txt
Public Numero() as String
Public Nome() as String
Public Localidade() as String

'Método para ler o conteúdo do ficheiro txt e guardá-lo nas variáveis
Public Sub Ler()

        'Dividir o texto em linhas
        Dim Linha() As String = Strings.Split(My.Computer.FileSystem.ReadAllText("C:\file.txt", System.Text.Encoding.UTF7), ControlChars.CrLf)

        Dim Elemento() As String

        'Por cada linha
        For i As Integer = 0 To Linha.Length - 1

            'Se não estiver vazia...
            If Linha(i) <> "" Then
                'Ir buscar os elementos separados por vírgula
                Elemento = Strings.Split(Linha(i), ", ")
                'Redeclarar e preservar a array para poder abranger todas as pessoas no ficheiro de texto
                ReDim Preserve Numero(i)
                'Como o 1º elemento é o numero, adicioná-lo à array Numero
                Numero(i) = Elemento(0)
                'Redeclarar e preservar a array para poder abranger todas as pessoas no ficheiro de texto
                ReDim Preserve Nome(i)
                'Como o 2º elemento é o nome, adicioná-lo à array Nome
                Nome(i) = Elemento(1)
                'Redeclarar e preservar a array para poder abranger todas as pessoas no ficheiro de texto
                ReDim Preserve Localidade(i)
                'Como o 3º elemento é a localidade, adicioná-lo à array Localidade
                Localidade(i) = Elemento(2)
                 
                'Limpar a array Elementos para não haver conflitos com as outras linhas
                Array.Clear(Elemento, 0, Elemento.Length)
            End If

        Next

        'Libertar Memória, visto que já não precisamos destas variáveis
        Elemento = Nothing
        Linha = Nothing

        'Se este método foi chamado quando já existia um Numero na caixa de texto, ir para o método Procurar
        If TextBox1.Text <> "" Then
            Procurar()
        End If

    End Sub

Para procurar uma pessoa com um certo numero usando o método seguinte, tem de se executar o método Ler() primeiro (talvez seja boa ideia metê-lo no evento Load do Form)


Public Sub Procurar()

        'Se estiver vazia então sair do método
        If TextBox1.Text = "" Then
            Exit Sub
        End If

        'Por cada numero que esteja guardado...
        For i As Integer = 0 To Numero.Length - 1

            'Se for igual ao número da textbox...
            If Numero(i) = TextBox1.Text Then

                'Nome e Localidade com o mesmo i que o número representam a mesma pessoa, logo, preencher as caixas de texto
                TextBox2.Text = Nome(i)
                TextBox3.Text = Localidade(i)
                'Sai do procedimento visto já termos encontrado a pessoa que queríamos
                Exit Sub

            End If

        Next

        'Se não existir uma pessoa com aquele número, mostra uma mensagem e limpa todos os campos menos o número.
        MessageBox.Show("Não existe uma pessoa com esse número")
        TextBox2.Text = ""
        TextBox3.Text = ""

E para guardar...


Public Sub Guardar()

        'Variável que vai guardar o texto a ser escrito no ficheiro.
        Dim Texto As String = ""

        'Se a textbox1.text não está vazia então é porque há a possibilidade de se ter procedido a uma procura e de se terem alterado valores logo, temos que actualizar os valores das arrays.
        If TextBox1.Text <> "" Then

            For i As Integer = 0 To Numero.Length - 1

                If Numero(i) = TextBox1.Text Then

                    Nome(i) = TextBox2.Text
                    Localidade(i) = TextBox3.Text

                End If

            Next

        End If

        'Por cada dado da array (o número de dados numa array representa o nº de linhas)
        For i As Integer = 0 To Numero.Length - 1
            'Criar uma linha na variável texto que contenha os dados da pessoa
            Texto &= Numero(i) & ", " & Nome(i) & ", " & Localidade(i) & ControlChars.CrLf
        Next

        'Escrever a variável texto no ficheiro, substituíndo o que já lá está
        My.Computer.FileSystem.WriteAllText("C:\file.txt", Texto, False)

    End Sub

NOTA:

Textbox1 -> Numero

TextBox2 -> Nome

Textbox3 -> Localidade

Não adicionei Try... Catch mas convém adicionares para apanhar todos os erros inerentes à leitura e gravação de ficheiros

E provavelmente há um método mais simples mas há quem diga que gosto de complicar xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tks, era mesmo isso.

Já agora, aí na parte do procurar, se eu quiser que ele ao verificar que o campo do nº está vazio, em vez de sair, verifique se o campo nome está preenchido e faça a busca por nome, o que é que é preciso alterar?  (basicamente, poder fazer busca por nº ou nome)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Public Sub Procurar()

        
        If TextBox1.Text = "" Then
            'Se ambas estiverem vazias então sair do método
            If TextBox2.Text = "" Then
            Exit Sub
            'Senão, procurar nome
            Else
             'Por cada nome que esteja guardado...
            For i As Integer = 0 To Nome.Length - 1

            'Se for igual ao nome da textbox...
            If Nome(i) = TextBox2.Text Then

                'Numero e Localidade com o mesmo i que o nome representam a mesma pessoa, logo, preencher as caixas de texto
                TextBox1.Text = Numero(i)
                TextBox3.Text = Localidade(i)
                'Sai do procedimento visto já termos encontrado a pessoa que queríamos
                Exit Sub

            End If

        Next

        'Se não tiver sido encontrada a pessoa com esse nome
        MessageBox.Show("Não existe uma pessoa com esse nome")
        TextBox1.Text = ""
        TextBox3.Text = ""
        Exit Sub
            
        End If

        'Por cada numero que esteja guardado...
        For i As Integer = 0 To Numero.Length - 1

            'Se for igual ao número da textbox...
            If Numero(i) = TextBox1.Text Then

                'Nome e Localidade com o mesmo i que o número representam a mesma pessoa, logo, preencher as caixas de texto
                TextBox2.Text = Nome(i)
                TextBox3.Text = Localidade(i)
                'Sai do procedimento visto já termos encontrado a pessoa que queríamos
                Exit Sub

            End If

        Next

        'Se não existir uma pessoa com aquele número, mostra uma mensagem e limpa todos os campos menos o número.
        MessageBox.Show("Não existe uma pessoa com esse número")
        TextBox2.Text = ""
        TextBox3.Text = ""

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Movido para a secção dúvidas e ajudas consoante as regras, lê-as.

Futuros Threads serão bloqueados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hum, estive a transformar isso em classe, e ficou a funcionar bem.

A seguir editei para permitir mais campos e agora o Ler() estoura

Public Class Banc
    Public Numero() As String
    Public Nome() As String
    Public Email() As String
    Public Telefone() As String
    Public Nif() As String
    Public Rendimento() As String
    Public Data() As String


    Public Sub Ler(ByRef numer, ByRef name, ByRef mail, ByRef tlf, ByRef nifl, ByRef rend, ByRef datal, ByVal file)
        Dim Linha() As String = Strings.Split(My.Computer.FileSystem.ReadAllText(file, System.Text.Encoding.UTF7), ControlChars.CrLf)

        Dim Elemento() As String

        'Por cada linha
        For i As Integer = 0 To Linha.Length - 1

            'Se não estiver vazia...
            If Linha(i) <> "" Then
                'Ir buscar os elementos separados por vírgula
                Elemento = Strings.Split(Linha(i), ", ", -1)
                'Redeclarar e preservar a array para poder abranger todas as pessoas no ficheiro de texto
                ReDim Preserve Numero(i)
                'Como o 1º elemento é o numero, adicioná-lo à array Numero
                Numero(i) = Elemento(0)
                'Redeclarar e preservar a array para poder abranger todas as pessoas no ficheiro de texto
                ReDim Preserve Nome(i)
                'Como o 2º elemento é o nome, adicioná-lo à array Nome
                Nome(i) = Elemento(1)
                'Redeclarar e preservar a array para poder abranger todas as pessoas no ficheiro de texto
                ReDim Preserve Email(i)
                'Como o 3º elemento é a localidade, adicioná-lo à array Localidade
                Email(i) = Elemento(2)
                ReDim Preserve Telefone(i)
                Telefone(i) = Elemento(3)
                ReDim Preserve Nif(i)
                Nif(i) = Elemento(4)
                ReDim Preserve Rendimento(i)
                Rendimento(i) = Elemento(5)
                ReDim Preserve Data(i)
                Data(i) = Elemento(6)

                'Limpar a array Elementos para não haver conflitos com as outras linhas
                Array.Clear(Elemento, 0, Elemento.Length)
            End If

        Next

        'Libertar Memória, visto que já não precisamos destas variáveis
        Elemento = Nothing
        Linha = Nothing

        'Se este método foi chamado quando já existia um Numero na caixa de texto, ir para o método Procurar
        If name <> "" Then
            Procurar(numer, name, mail, tlf, Nif, rend, data)
        End If



    End Sub

Ele estoura quando chega ao  Email(i) = Elemento(2)

Alguem me explica porque?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, se eu quiser adicionar novos registos, como se faz?  Pode-se usar as funções dadas em cima (com alterações), ou tem de se criar nova função?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

crias um método em que adicionas mais um elemento a cada array e depois chamas o método guardar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora