elrey Posted December 6, 2012 at 10:03 PM Report #486063 Posted December 6, 2012 at 10:03 PM (edited) Boas, Tenho aqui uma dúvida/problema em que ainda não consegui resolver. Quando abro o programa, leio o que está no ficheiro neste caso "alunos.txt" e passa para a array, até aqui tudo certo. Mas quando adiciono um registo novo na array e quero guardar no ficheiro dá erro. Tenho o seguinte código: Dim escrever As IO.StreamWriter If IO.File.Exists("alunos.txt") = True Then escrever = New IO.StreamWriter("alunos.txt", False) <-- Meti false, para reescrever tudo o que está na array para o ficheiro. For i = 0 To max escrever.Write( arr(i).setnome & "|" & arr(i).setcontribuinte & "|" & arr(i).setdatanascimento & "|" & arr(i).setano & "|" & arr(i).setcurso & "|" & arr(i).setmedia) Next escrever.Close() Else escrever = New IO.StreamWriter("alunos.txt") For i = 0 To max escrever.Write( arr(i).setnome & "|" & arr(i).setcontribuinte & "|" & arr(i).setdatanascimento & "|" & arr(i).setano & "|" & arr(i).setcurso & "|" & arr(i).setmedia) Next End If Alguém tem ideias ? É que eu já não sei o que tentar mais. Cumprimentos. Edited December 10, 2012 at 10:44 PM by ribeiro55
thoga31 Posted December 6, 2012 at 10:14 PM Report #486065 Posted December 6, 2012 at 10:14 PM "Dá erro" é vago. Que erro dá? Knowledge is free!
elrey Posted December 6, 2012 at 10:21 PM Author Report #486069 Posted December 6, 2012 at 10:21 PM O erro é: "A referência de objecto não foi definida como uma instância de um objecto."
thoga31 Posted December 6, 2012 at 10:28 PM Report #486072 Posted December 6, 2012 at 10:28 PM (edited) Assim de repente não vejo o porquê desse erro. Em que linha ocorre? Já agora, mostra-nos a definição da variável arr. Edited December 6, 2012 at 10:29 PM by thoga31 Knowledge is free!
elrey Posted December 6, 2012 at 10:44 PM Author Report #486080 Posted December 6, 2012 at 10:44 PM (edited) Dá erro dentro do 1º For, apagando todos os dados que tenho dentro do ficheiro. Dim arr() As Aluno Edited December 6, 2012 at 10:44 PM by elrey
thoga31 Posted December 6, 2012 at 10:47 PM Report #486081 Posted December 6, 2012 at 10:47 PM (edited) Traduzindo essa suposta linha de código cheia de BBCode: Dim arr() As Aluno Agora mostra-nos a definição de Aluno, que aposto que é aí que está o erro... Edited December 6, 2012 at 10:47 PM by thoga31 Knowledge is free!
elrey Posted December 6, 2012 at 10:51 PM Author Report #486083 Posted December 6, 2012 at 10:51 PM Aluno é uma classe Public Class Aluno Inherits Pessoa Private ano As Integer Private curso As String Private media As Double Public Property setano As Integer Get Return ano End Get Set(value As Integer) ano = value End Set End Property Public Property setcurso As String Get Return curso End Get Set(value As String) curso = value End Set End Property Public Property setmedia As Double Get Return media End Get Set(value As Double) media = value End Set End Property Public Function calcgabarito() As String If (setmedia < 9.5) Then Return "Insatisfatório" ElseIf (setmedia >= 9.5 And setmedia < 13) Then Return "Suficiente" ElseIf (setmedia >= 13 And setmedia < 18) Then Return "Bom" ElseIf (setmedia >= 18 And setmedia < 19) Then Return "Muito Bom" ElseIf (setmedia >= 19 And setmedia <= 20) Then Return "Excelente" End If End Function End Class
thoga31 Posted December 6, 2012 at 11:06 PM Report #486086 Posted December 6, 2012 at 11:06 PM (edited) Não inicializas arr como sendo uma instância da classe Aluno, esse é o problema. Solução: sendo arr um array, tens de criar a instância para cada índice de arr. 'Em teoria: For i = 0 To 10 lista(i) = New MinhaClasse(parametros) Next Edited December 6, 2012 at 11:06 PM by thoga31 Knowledge is free!
elrey Posted December 6, 2012 at 11:21 PM Author Report #486087 Posted December 6, 2012 at 11:21 PM Podes explicar-me melhor ? É que não entendi.
thoga31 Posted December 6, 2012 at 11:23 PM Report #486088 Posted December 6, 2012 at 11:23 PM (edited) Tens uma array que é uma instância de uma classe (ou, para ser mais exacto, cada elemento da array é uma instância de uma classe). Cada um destes elementos da array deve ser inicializada com o operador New porque não podes fazer isto directamente: Dim lista() As New MinhaClasse(parametros) Não sei como estás a atribuir dados à array. Mostra-me a parte do código na qual lhe atribuis valores, antes de mais nada. Edited December 6, 2012 at 11:24 PM by thoga31 Knowledge is free!
elrey Posted December 6, 2012 at 11:27 PM Author Report #486089 Posted December 6, 2012 at 11:27 PM Estou a atribuir dados à array assim: Using leitor As New Microsoft.VisualBasic.FileIO.TextFieldParser("alunos.txt") leitor.TextFieldType = FileIO.FieldType.Delimited leitor.SetDelimiters("|") While Not leitor.EndOfData linha = leitor.ReadFields() max = max + 1 ReDim Preserve arr(max) arr(max) = New Aluno For Each campo In linha cont = cont + 1 Select Case cont Case 1 arr(max).setnome = campo Case 2 arr(max).setcontribuinte = campo Case 3 arr(max).setdatanascimento = campo Case 4 arr(max).setano = campo Case 5 arr(max).setcurso = campo Case 6 arr(max).setmedia = campo End Select Next cont = 0 End While End Using
thoga31 Posted December 6, 2012 at 11:31 PM Report #486090 Posted December 6, 2012 at 11:31 PM Difficult one... Estás a atribuir bem os dados, crias as instâncias correctamente. Voltemos aqui: Dá erro dentro do 1º For, apagando todos os dados que tenho dentro do ficheiro. O erro que te dá deverá descrever a que classe se refere: ao escrever ou ao arr. Diz-me a qual dos dois o VS se refere. Knowledge is free!
elrey Posted December 6, 2012 at 11:44 PM Author Report #486093 Posted December 6, 2012 at 11:44 PM Pelo o que vi, penso que é ao escrever. Desde de " escrever.write" até a "setmedia)" está a amarelo.
thoga31 Posted December 6, 2012 at 11:56 PM Report #486094 Posted December 6, 2012 at 11:56 PM (edited) Ok. Então o problema está no escrever. Proponho que primeiro que nada simplifiques o teu código, não precisas daquele If para nada. Vai na volta e isto ainda se resolve. O teu código pode ser simplesmente reduzido a isto: Dim escrever As New IO.StreamWriter("alunos.txt", False) For i = 0 To max escrever.Write(arr(i).setnome & "|" & _ arr(i).setcontribuinte & "|" & _ arr(i).setdatanascimento & "|" & _ arr(i).setano & "|" & _ arr(i).setcurso & "|" & _ arr(i).setmedia) Next escrever.Close() Experimenta e toma atenção à caixa de diálogo que se forma anexa ao sublinhado a amarelo. Ela costuma dar mais informações para além do nome do erro. Mostra-nos uma imagem do erro caso ele ocorra. Assim de repente não consigo ver qual o possível problema, à primeira vista está tudo bem (excepto o facto de teres código a mais desnecessário, mas isto não gera erros deste género, apenas resulta em mau código e possível ineficiência). Hoje não posso ajudar mais. Talvez alguém amanhã te possa ajudar melhor do que eu, e depois à noite cá voltarei. Vai testando e lê bem tudo o que o VS te diz, ele não "fala" à toa. Cumprimentos. 😉 Edited December 6, 2012 at 11:57 PM by thoga31 Knowledge is free!
Solution elrey Posted December 7, 2012 at 12:28 AM Author Solution Report #486096 Posted December 7, 2012 at 12:28 AM Obrigado pela ajuda, @thoga31 Continua a dar erro, o mesmo... Deixo aqui uma imagem do erro: Cumprimentos. 🙂 Update: Já resolvi, quando carregava para criar um novo registo fazia a incrementação na variável max e o ReDim Preserve max = max + 1 Redim preserve arr(max) arr(max) = New Aluno <-- Faltava isto! Agora sim, já grava no ficheiro. 😉
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now