сохранить элементы массива и потом загрузить обратно
помогите разобраться с прогой, есть две формы связанные одним глобальным массивом, так вот на одной форме мы к примеру в текстбоксах пишем некие суммы и надо чтоб это сохранялось в массив потом при новом запуске проги, вторая форма уже использовала этот сохраненный массив ;)
|
Пишете в файл. При запуске ищете этот файл и загружаете из него данные.
|
matyash, у Вас VB, VBA или VB.Net? Массив содержит данные одного типа или нескольких?
|
Можете, например, попробовать так:
Скрытый текст
Код:
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 из файла.
|
спасибо попробую, а если не сложно можно закомментировать данный код, чтобы не тупо скатать, а понять и запомнить на будущее :)
|
не выходит:
у меня массив 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
|
Цитата:
Цитата matyash
можно закомментировать данный код »
|
Скрытый текст
Код:
' Импортируем библиотеку
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».
|
Время: 16:10.
© OSzone.net 2001-