PDA

Показать полную графическую версию : [решено] сохранить элементы массива и потом загрузить обратно


matyash
02-02-2015, 15:31
помогите разобраться с прогой, есть две формы связанные одним глобальным массивом, так вот на одной форме мы к примеру в текстбоксах пишем некие суммы и надо чтоб это сохранялось в массив потом при новом запуске проги, вторая форма уже использовала этот сохраненный массив ;)

Iska
02-02-2015, 16:48
Пишете в файл. При запуске ищете этот файл и загружаете из него данные.

matyash
02-02-2015, 17:03
я тут по искал в инете http://www.cyberforum.ru/vb-net/thread1233719.html, сохраняет в файл, но вот почему то не получается сохранить данные типа double

Iska
02-02-2015, 17:23
matyash, у Вас VB, VBA или VB.Net? Массив содержит данные одного типа или нескольких?

matyash
02-02-2015, 17:50
VB.Net одного Double

Iska
02-02-2015, 23:05
Можете, например, попробовать так:
Imports System.IO

Module Module1
Sub Main()
Dim aArrayOfDoubles() = New Double() {1, 2, 3, 4, 5}
Dim elem As Double

Dim sSourceFile As String = "c:\MyArray.bin"
Dim oFileStream As New System.IO.FileStream(sSourceFile, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
Dim oBinaryWriter As New System.IO.BinaryWriter(oFileStream)

For Each elem In aArrayOfDoubles
oBinaryWriter.Write(elem)
Next

oBinaryWriter.Close()
oFileStream.Close()



Dim oFileStream2 As New System.IO.FileStream(sSourceFile, IO.FileMode.Open, IO.FileAccess.Read)
Dim oBinaryReader As New System.IO.BinaryReader(oFileStream2)

Try
Do
Console.WriteLine(oBinaryReader.ReadDouble())
Loop
Catch ex As EndOfStreamException
' Nothing to do
Finally
oBinaryReader.Close()
End Try

oFileStream2.Close()
End Sub
End Module

Первая часть кода сохраняет значения массива double() в файл, вторая — читает значения double из файла.

matyash
03-02-2015, 20:55
спасибо попробую, а если не сложно можно закомментировать данный код, чтобы не тупо скатать, а понять и запомнить на будущее :)

matyash
03-02-2015, 21:24
не выходит:
у меня массив public:

вот форма 1

Public Class Form1
Dim sum As Double

Private Sub Button40_Click(sender As Object, e As EventArgs) Handles Button40.Click
Form2.Show()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
TextBox1.Text = TextBox1.Text & "мясной - " & Convert.ToString(costs(1)) & vbCrLf
sum = sum + costs(1)
TextBox2.Text = Convert.ToString(sum)
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
TextBox1.Text = TextBox1.Text & "элегия - " & Convert.ToString(costs(0)) & vbCrLf
sum = sum + costs(0)
TextBox2.Text = Convert.ToString(sum)
End Sub

Private Sub Button39_Click(sender As Object, e As EventArgs) Handles Button39.Click
TextBox1.Clear()
TextBox2.Clear()
sum = 0
End Sub



модуль

Module Module1
Public costs() As Double = {12, 23}

End Module



форма 2


Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
If TextBox2.Text <> "" Then
costs(1) = Convert.ToDouble(TextBox2.Text)
Else
costs(1) = costs(1)
End If
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
If TextBox1.Text <> "" Then
costs(0) = Convert.ToDouble(TextBox1.Text)
Else
costs(0) = costs(0)
End If

Iska
04-02-2015, 21:08
можно закомментировать данный код »
' Импортируем библиотеку
Imports System.IO

Module Module1
Sub Main()
' Первая часть марлезонского балета

' Создаём массив типа Double из пяти элементов
Dim aArrayOfDoubles() = New Double() {1, 2, 3, 4, 5}
' Переменная того же типа
Dim elem As Double

' Путь к целевому файлу
Dim sSourceFile As String = "c:\MyArray.bin"
' Открываем файловый поток для вышеуказанного файла
Dim oFileStream As New System.IO.FileStream(sSourceFile, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
' Создаём объект для двоичной записи в вышеприведённый поток
Dim oBinaryWriter As New System.IO.BinaryWriter(oFileStream)

' Для каждого элемента массива...
For Each elem In aArrayOfDoubles
' ...выполняем запись его значения в поток
oBinaryWriter.Write(elem)
Next

' Закрываем объект
oBinaryWriter.Close()
' Закрываем поток
oFileStream.Close()
' На этом первая часть завершена - данные из массива записаны в файл.
' Длина файла - размер массива*8 байт.


' Вторая часть марлезонского балета

' Открываем файловый поток для вышеуказанного файла
Dim oFileStream2 As New System.IO.FileStream(sSourceFile, IO.FileMode.Open, IO.FileAccess.Read)
' Создаём объект для двоичной записи в вышеприведённый поток
Dim oBinaryReader As New System.IO.BinaryReader(oFileStream2)

' Пытаемся...
Try
Do
' ...читать из файла по одному значению типа Double (по восемь байт)...
Console.WriteLine(oBinaryReader.ReadDouble())
Loop ' ...в бесконечном цикле
' ...как только попытаемся читать за концом файла - попадём сюда...
Catch ex As EndOfStreamException
' Nothing to do
' ... и, наконец, сюда
Finally
' Закрываем объект
oBinaryReader.Close()
End Try

' Закрываем поток
oFileStream2.Close()
End Sub
End Module
Замечания:
Я в коде при чтении просто вывожу прочитанные значения на консоль. Вы же можете использовать их по назначению — заполнять массив, сразу заполнять значения полей форме и т.п., что именно Вам потребно.
Я в коде продемонстрировал подход, когда мы заранее рассчитываем количество данных, которые будут считаны из в файла. Вы можете использовать иную, старую добрую C-шную технику: получить размер файла в байтах, разделить его на размер в байтах типа «Double()», получив количество сохранённых в нём отдельных данных. Затем просто прочитать уже известное количество данных по «for i=0 to «количество сохранённых в нём отдельных данных» - 1 : ….ReadDouble() : next».

matyash
05-02-2015, 08:43
спасибо вам;)




© OSzone.net 2001-2012