Структуры в vb.net

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Структуры в vb.net

Сообщение RCLIO » 20.03.2009 (Пт) 18:47

Доброго времени суток.

В vb6 чтение структуры (Type) из файла было следующим образом:
Код: Выделить всё
...
Type TEST
    a As Long
    s As String*32
    p As Long
    mas(2) As Long
End Type
Public X As TEST
...
Get #1, 1, X


В vb.net, как я понял, это должно выглядеть так:

Код: Выделить всё
Public Structure TEST
    Dim a As Integer
    <VBFixedString(32)> Dim s As String
    Dim p As Integer
    Dim mas() As Integer
End Structure
Public X As TEST
...
ReDim X.mas(2)
FileGet(1, X, 1)

Однако выскакивает сообщение об ошибке, с указанием на RecordNumber и написано - "Требуется неотрицательное число". Если массив "mas()" заменить на 3 переменные integer - работает.
Что тут не так?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 20.03.2009 (Пт) 18:56

Так оно не должно выглядеть. Гугли на тему "сериализация данных".

Да, еще тебе не помешало бы почитать про работу с файловой системой и потоками в .NET :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Структуры в vb.net

Сообщение Williams » 20.03.2009 (Пт) 19:48

помечаешь свою структуру/класс аттрибутом Serializable и сериализуешь/десериализуешь при помощи класса XmlSerializer.
И вы думаете, что вас оставят в живых после прочтения этого поста?

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 20.03.2009 (Пт) 22:10

Спасибы за ответы.

Код: Выделить всё
    <StructLayout(LayoutKind.Sequential, Pack:=1)> Structure TEST
        <MarshalAs(UnmanagedType.I4)> Public a As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> Public s As String
        <MarshalAs(UnmanagedType.I4)> Public p As Integer
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public mas() As Integer
    End Structure


- Так работает. Но у строки "s" обрубаются первые 2-а байта, хотя начало её идёт сразу после переменной "а".

Как всё просто было в vb6... :(

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 20.03.2009 (Пт) 22:15

RCLIO писал(а):- Так работает.
Это излишне. Для сериализации достаточно такого кода:
Код: Выделить всё
<Serializable> Public Structure TEST
    Dim a As Integer
    Dim s As String
    Dim p As Integer
    Dim mas() As Integer
End Structure

и все.
Потом берешь XmlSerializer или BinarySerializer и сохраняешь/читаешь данные. Замечу, что XML занимает намного больше места, так что наилучший вариант хранения - Data->BinarySerializer->Zip->outfile, хотя тут взависимости от задачи смотреть, конечно, надо...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 21.03.2009 (Сб) 0:02

Никак я не могу понять!

Формат файла такой:

Код: Выделить всё
[5 байт] - заголовок
[4 байта] - кол-во записей в файле
      [4 байта] - ID_1
      [24 байта] - текстовая строка
      [1 байт] - кол-во элементов в массиве (ниже)
      [240 байт] - массив (текст), каждый элемент всегда равен 240 байт. Кол-во элементов задается выше.
     
       [4 байта] - ID_2
       ...
[5 байт] - конец файла.



Помогите пожалуйста! Измучился ужо :|

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 21.03.2009 (Сб) 0:05

Так тебе еще и по заданному форматы надо писать... :? Так бы и говорил.
Тогда самый простой и правильный способ - писать данные циклом в MemoryStream, а потом записывать в файл.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 21.03.2009 (Сб) 0:09

Точнее нужно сперва из файла считать, а потом, уже отредактированные данные , обратно в файл записать.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 21.03.2009 (Сб) 12:41

Вот тебе чтение:
Код: Выделить всё
    Public Structure FileData
        Dim header As String
        Dim CountOfItems As Integer
        Dim Data() As ItemData
        Dim footer As String
    End Structure
    Public Structure ItemData
        Dim id As Integer
        Dim text1 As String
        Dim CountOfSubItems As Byte
        Dim Data() As String
    End Structure

    Public Function ReadFile(ByVal Path As String, <Runtime.InteropServices.Out()> ByVal File As FileData) As Boolean
        Dim ret As New FileData
        If IO.File.Exists(Path) Then 'проверяем файл на существование
            Try
                Using fs As New IO.FileStream(Path, IO.FileMode.Open, IO.FileAccess.Read)
                    Dim br As New IO.BinaryReader(fs)

                    With ret
                        .header = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(5))
                        If .header <> "то что надо" Then Throw New Exception("blah blah blah")
                        .CountOfItems = br.ReadInt32

                        ReDim .Data(.CountOfItems - 1)
                        For i As Integer = 0 To .CountOfItems - 1
                            With .Data(i)
                                .id = br.ReadInt32
                                .text1 = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(24))
                                .CountOfSubItems = br.ReadByte
                                ReDim .Data(.CountOfSubItems - 1)
                                For j As Integer = 0 To .CountOfSubItems - 1
                                    .Data(j) = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(240))
                                Next
                            End With
                        Next

                        .footer = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(5))
                        File = ret
                        Return True
                    End With
                End Using
            Catch ex As Exception
                Return False
            End Try
        Else
            Return False
        End If
    End Function

Проверить не на чем было, но теоретически все работает.
Запись - то же самое, но наоборот.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 21.03.2009 (Сб) 13:18

Вот запись:
Код: Выделить всё
    Public Function WriteFile(ByVal path As String, ByVal File As FileData, ByVal overwrite As Boolean) As Boolean
        If IO.File.Exists(path) And Not overwrite Then Return False

        Try
            Using fs As New IO.FileStream(path, IO.FileMode.Create, IO.FileAccess.Write)
                Dim bw As New IO.BinaryWriter(fs)
                Dim buff() As Byte
                With File
                    buff = System.Text.ASCIIEncoding.Default.GetBytes(.header)
                    ReDim Preserve buff(4)
                    bw.Write(buff)
                    bw.Write(.CountOfItems)
                    For i As Integer = 0 To .CountOfItems - 1
                        With .Data(i)
                            bw.Write(.id)

                            buff = System.Text.ASCIIEncoding.Default.GetBytes(.text1)
                            ReDim Preserve buff(23)
                            bw.Write(buff)

                            bw.Write(.CountOfSubItems)

                            For j As Integer = 0 To .CountOfSubItems - 1
                                buff = System.Text.ASCIIEncoding.Default.GetBytes(.Data(j))
                                ReDim Preserve buff(239)
                                bw.Write(buff)
                            Next
                        End With
                    Next

                    buff = System.Text.ASCIIEncoding.Default.GetBytes(.footer)
                    ReDim Preserve buff(4)
                    bw.Write(buff)
                End With
            End Using

            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function
Наверное тоже работает верно :)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 21.03.2009 (Сб) 18:14

Спасибо. Буду пробовать.
Отпишусь.

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 21.03.2009 (Сб) 20:18

Работает. Спасибо. Буду вникать. 8)

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 21.03.2009 (Сб) 20:27

RCLIO писал(а):Буду вникать
Давай-давай :wink:
Если что - обращайся.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 21.03.2009 (Сб) 22:21

Пытаюсь получить
Код: Выделить всё
Dim DD As FileData
...
ReadFile("D:\Raz1\file.bin", DD)
Debug.Print(DD.Data(0).text1)


Итог - "В экземпляре объекта не задана ссылка на объект."

------------

оффтоп. Посоветуйте, пожалуйста, книгу VS Basic 2005 для начинающих. С одним инетом - туго...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 21.03.2009 (Сб) 22:50

Выложи file.bin, а то тренироваться не на чем.

оффтоп. Посоветуйте, пожалуйста, книгу VS Basic 2005 для начинающих. С одним инетом - туго...

Какого уровня нужна литература? Какой объем книги (читай - есть ли проблемы со скачиванием тяжелых файлов)?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 21.03.2009 (Сб) 23:55

Проблем со скачиванием нет.
Уровень... для работы создавал небольшие программки (расчет, сохранение данных в файлы и т.п.) на vb6.
Сейчас нужно перейти на Basic .NET. Для меня это - другой язык получается...
Вложения
file.zip
(214 байт) Скачиваний: 98

773FF
Обычный пользователь
Обычный пользователь
 
Сообщения: 86
Зарегистрирован: 07.02.2008 (Чт) 10:51

Re: Структуры в vb.net

Сообщение 773FF » 22.03.2009 (Вс) 0:05

"Посоветуйте, пожалуйста, книгу VS Basic 2005 для начинающих."


"Visual Basic 2005. Рецепты программирования"; Тим Патрик, Кларк Крейг; издат."БХВ - Петербург" - лучшая книга о прогр. на VB.Net, а для начинающих просто клад! http://www.ozon.ru/context/detail/id/3719656/ - я уже давно купил (правда в офлайновом магазине) и постоянно держу рядом с монитором!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 22.03.2009 (Вс) 0:21

RCLIO писал(а):Итог - "В экземпляре объекта не задана ссылка на объект."

Ага, я ошибку не заметил:
Код: Выделить всё
Public Function ReadFile(ByVal Path As String, <Runtime.InteropServices.Out()> ByVal File As FileData) As Boolean
замени ByVal File As FileData на ByRef File As FileData


А с книгой - завтра тебе пару ссылок кину :wink:
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 22.03.2009 (Вс) 1:02

773FF писал(а):
"Посоветуйте, пожалуйста, книгу VS Basic 2005 для начинающих."


"Visual Basic 2005. Рецепты программирования"; Тим Патрик, Кларк Крейг; издат."БХВ - Петербург" - лучшая книга о прогр. на VB.Net, а для начинающих просто клад! http://www.ozon.ru/context/detail/id/3719656/ - я уже давно купил (правда в офлайновом магазине) и постоянно держу рядом с монитором!


Спасибы!

MIT писал(а):
RCLIO писал(а):Итог - "В экземпляре объекта не задана ссылка на объект."

Ага, я ошибку не заметил:
Код: Выделить всё
Public Function ReadFile(ByVal Path As String, <Runtime.InteropServices.Out()> ByVal File As FileData) As Boolean
замени ByVal File As FileData на ByRef File As FileData

А с книгой - завтра тебе пару ссылок кину :wink:


Работает :)

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 22.03.2009 (Вс) 14:38

Вот интересно:

Код: Выделить всё
5 байт] - заголовок
[4 байта] - кол-во записей в файле
      [4 байта] - ID_1
      [24 байта] - текстовая строка
      [1 байт] - кол-во элементов в массиве (ниже)
      [240 байт] - массив (текст), каждый элемент всегда равен 240 байт. Кол-во элементов задается выше.
     
       [4 байта] - ID_2
       ...
[5 байт] - конец файла.


Если [240] байт нужно разбить на структуру с множеством переменных, т.е.:

Код: Выделить всё
    Public Structure FileData
        Dim header As String
        Dim CountOfItems As Integer
        Dim Data() As ItemData
        Dim footer As String
    End Structure
    Public Structure ItemData
        Dim id As Integer
        Dim text1 As String
        Dim CountOfSubItems As Byte
        Dim Data() As NewStruc
    End Structure
    Public Structure NewStruc
       Dim P1 As Byte
       Dim P2 As Byte
       Dim P3 As Single
       Dim P4 As Integer
       ...
       ...
       ...
       Dim P100 as Byte
    End Structure


то придется все переменные последовательно перечислять? Т.е.:

Код: Выделить всё
Public Function ReadFile(ByVal Path As String, <Runtime.InteropServices.Out()> ByRef File As FileData) As Boolean
        Dim ret As New FileData
        If IO.File.Exists(Path) Then 'проверяем файл на существование
            Try
                Using fs As New IO.FileStream(Path, IO.FileMode.Open, IO.FileAccess.Read)
                    Dim br As New IO.BinaryReader(fs)

                    With ret
                        .header = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(5))
                        If .header <> "то что надо" Then Throw New Exception("blah blah blah")
                        .CountOfItems = br.ReadInt32

                        ReDim .Data(.CountOfItems - 1)
                        For i As Integer = 0 To .CountOfItems - 1
                            With .Data(i)
                                .id = br.ReadInt32
                                .text1 = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(24))
                                .CountOfSubItems = br.ReadByte
                                ReDim .Data(.CountOfSubItems - 1)
                                For j As Integer = 0 To .CountOfSubItems - 1
                                    .Data(j).P1 = br.ReadByte
                                    .Data(j).P2 = br.ReadByte
                                    .Data(j).P3 = br.ReadSingle
                                    .Data(j).P4 = br.ReadInt32
                                    ...
                                    ...
                                    ...
                                    .Data(j).P100 = br.ReadByte
                                Next
                            End With
                        Next

                        .footer = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(5))
                        File = ret
                        Return True
                    End With
                End Using
            Catch ex As Exception
                Return False
            End Try
        Else
            Return False
        End If
    End Function

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 22.03.2009 (Вс) 14:47

Теоретически можно считать 240 байт в память, а потом присвоить структуре эти данные. Правда насчет реализации надо подумать. Маршалинг, блин...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 22.03.2009 (Вс) 19:44

RCLIO писал(а):то придется все переменные последовательно перечислять?
Нет, вот решение.

Возьмем произвольную простую структуру, над которой будем ставить опыты:
Код: Выделить всё
    <StructLayout(LayoutKind.Explicit, Size:=26)> Public Structure MyData
        <FieldOffset(0)> Dim var1 As Integer '4
        <FieldOffset(4)> Dim var2 As Byte '1
        <FieldOffset(5)> Dim var3 As Short '2
        <FieldOffset(7)> Dim var4 As Integer '4
        <FieldOffset(11)> Dim var5 As Long '8
        <FieldOffset(19)> Dim var6 As Short '2
        <FieldOffset(24)> Dim var7 As UInt16 '2
    End Structure

Произвольная инициализация:
Код: Выделить всё
Dim test As New MyData With {.var1 = 256245625, .var2 = 54, .var3 = 6573, .var4 = 90525222, .var5 = 35784867212156, .var6 = 3567, .var7 = 9245}

1 вариант работы:
Код: Выделить всё
        Dim ptr As IntPtr = Marshal.AllocHGlobal(25)
        Marshal.StructureToPtr(test, ptr, False)
        Dim test2 As MyData = CType(Marshal.PtrToStructure(ptr, GetType(MyData)), MyData)
        Marshal.FreeHGlobal(ptr)

2ой:
Код: Выделить всё
        Dim arr(25) As Byte
        Dim gc As GCHandle = GCHandle.Alloc(arr, GCHandleType.Pinned)
        Marshal.StructureToPtr(test, gc.AddrOfPinnedObject, False)
        Dim test3 As MyData = CType(Marshal.PtrToStructure(gc.AddrOfPinnedObject, GetType(MyData)), MyData)

Тебе нужен, скорее всего, второй, т.к. там идет работа с доступным для редактирования массивом. В общем, попробуй приделать такой код под свои нужды, но если что - спрашивай, все-таки это уже довольно непростая область работы :wink:

Да, т.к. работа идет с памятью, не забывай освобождать ее, а то "утечки" получаться:
If gc.IsAllocated Then gc.Free()
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 22.03.2009 (Вс) 21:07

Спасибо за помощь. Пока всё получается, как хотел 8)

Emzari
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 06.09.2002 (Пт) 9:08
Откуда: Georgia

Re: Структуры в vb.net

Сообщение Emzari » 23.03.2009 (Пн) 11:10

вот пример сериализации


Код: Выделить всё
Imports System.Runtime.Serialization
'ეს კლასი ინახავს პროგრამის პარამეტრებს როგორიცაა პაროლი და აშ...
<Serializable()> Public Class ASJ_Settings
    Implements ISerializable

    Private PassString As String
    Private sngReisisGir As Single
    Private sMGQ, sMGQG, sEGQ, sEGQG, sGadM, sGadE As Single
    Private sDgMsubuki, sDgMikro, sDgSatvirto, sDgDzieba As Single
    Private intDgeebi As Integer

    Public Sub New()
        Me.Pass = ""
        Me.ReisisGirebuleba = 0
        Me.MdzgolisGamQalaqshi = 0
        Me.MdzgolisGamQalagaret = 0
        Me.EvakGamQalaqshi = 0
        Me.EvakGamQalagaret = 0
        Me.MdzgolitGadmokvana1km = 0
        Me.EvakGadmokvana1km = 0
        Me.DgomaMsubuki = 0
        Me.DgomaMikro = 0
        Me.DgomaSatvirto = 0
        Me.DgeebisRaodenoba = 0
        Me.DgomaTuDziebashia = 0
    End Sub

    Public Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        Me.Pass = info.GetString("PassString")
        Me.ReisisGirebuleba = info.GetSingle("sngReisisGir")
        Me.MdzgolisGamQalaqshi = info.GetSingle("sMGQ")
        Me.MdzgolisGamQalagaret = info.GetSingle("sMGQG")
        Me.EvakGamQalaqshi = info.GetSingle("sEGQ")
        Me.EvakGamQalagaret = info.GetSingle("sEGQG")
        Me.MdzgolitGadmokvana1km = info.GetSingle("sGadM")
        Me.EvakGadmokvana1km = info.GetSingle("sGadE")
        Me.DgomaMsubuki = info.GetSingle("sDgMsubuki")
        Me.DgomaMikro = info.GetSingle("sDgMikro")
        Me.DgomaSatvirto = info.GetSingle("sDgSatvirto")
        Me.DgeebisRaodenoba = info.GetInt32("intDgeebi")
        Me.DgomaTuDziebashia = info.GetSingle("sDgDzieba")
    End Sub

    Public Property Pass() As String
        'პროგრამის პაროლი
        Get
            Return PassString
        End Get
        Set(ByVal value As String)
            PassString = value
        End Set
    End Property

    Public Property ReisisGirebuleba() As Single
        'რეისის ღირებულება
        Get
            Return sngReisisGir
        End Get
        Set(ByVal value As Single)
            sngReisisGir = value
        End Set
    End Property

    Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData
        With info
            .AddValue("PassString", Me.Pass)
            .AddValue("sngReisisGir", Me.ReisisGirebuleba)
            .AddValue("sMGQ", Me.MdzgolisGamQalaqshi)
            .AddValue("sMGQG", Me.MdzgolisGamQalagaret)
            .AddValue("sEGQ", Me.EvakGamQalaqshi)
            .AddValue("sEGQG", Me.EvakGamQalagaret)
            .AddValue("sGadM", Me.MdzgolitGadmokvana1km)
            .AddValue("sGadE", Me.EvakGadmokvana1km)
            .AddValue("sDgMsubuki", Me.DgomaMsubuki)
            .AddValue("sDgMikro", Me.DgomaMikro)
            .AddValue("sDgSatvirto", Me.DgomaSatvirto)
            .AddValue("intDgeebi", Me.DgeebisRaodenoba)
            .AddValue("sDgDzieba", Me.DgomaTuDziebashia)
        End With
    End Sub

    Public Property MdzgolisGamQalaqshi() As Single
        'მძღოლის გამოძახება ქალაქში
        Get
            Return sMGQ
        End Get
        Set(ByVal value As Single)
            sMGQ = value
        End Set
    End Property

    Public Property MdzgolisGamQalagaret() As Single
        'მძღოლის გამოძახება ქალაქგარეთ
        Get
            Return sMGQG
        End Get
        Set(ByVal value As Single)
            sMGQG = value
        End Set
    End Property

    Public Property EvakGamQalaqshi() As Single
        'ევაკუატორის გამოძახება ქალაქში
        Get
            Return sEGQ
        End Get
        Set(ByVal value As Single)
            sEGQ = value
        End Set
    End Property

    Public Property EvakGamQalagaret() As Single
        'ევაკუატორის გამოძახება ქალაქგარეთ
        Get
            Return sEGQG
        End Get
        Set(ByVal value As Single)
            sEGQG = value
        End Set
    End Property

    Public Property MdzgolitGadmokvana1km() As Single
        'მძღოლით გადმოყვანის ღირებულება 1 კმ
        Get
            Return sGadM
        End Get
        Set(ByVal value As Single)
            sGadM = value
        End Set
    End Property

    Public Property EvakGadmokvana1km() As Single
        'ევაკუატორით გადმოყვანის ღირებულება 1 კმ
        Get
            Return sGadE
        End Get
        Set(ByVal value As Single)
            sGadE = value
        End Set
    End Property

    Public Property DgomaMsubuki() As Single
        'მსუბუქი ავტომანქანის დგომის ღირებულება
        Get
            Return sDgMsubuki
        End Get
        Set(ByVal value As Single)
            sDgMsubuki = value
        End Set
    End Property

    Public Property DgomaMikro() As Single
        'მიკროაევტობუსის დგომის ღირებულება
        Get
            Return sDgMikro
        End Get
        Set(ByVal value As Single)
            sDgMikro = value
        End Set
    End Property

    Public Property DgomaSatvirto() As Single
        'სატვირთო მანქანის დგომის ღირებულება
        Get
            Return sDgSatvirto
        End Get
        Set(ByVal value As Single)
            sDgSatvirto = value
        End Set
    End Property

    Public Property DgeebisRaodenoba() As Single
        'დღეების რაოდენობა რომლის მერეც მოქმედებს სპეციალური ტარიფი თუ ავტომანქანა ძიებაშია
        Get
            Return intDgeebi
        End Get
        Set(ByVal value As Single)
            intDgeebi = value
        End Set
    End Property

    Public Property DgomaTuDziebashia() As Single
        'დგომის ღირებულება თუ სატრანსპორტო საშუალება ძიებაშია
        Get
            Return sDgDzieba
        End Get
        Set(ByVal value As Single)
            sDgDzieba = value
        End Set
    End Property
End Class



вот код для записи и чтения в xml фаил

Код: Выделить всё
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Soap

Private Sub SaveSetting()
        'პროგრამის პარამეტრების შენახვა ფაილში
        'FileStream-ის დათრევა რომელიც ჩაწერს ფაილში
        Dim fs As New FileStream(Me.AppPath & "\ASJSett.xml", FileMode.OpenOrCreate)
        'SoapFormatter-ის შექმნა
        Dim sf As New SoapFormatter()
      Dim myClass as New ASJ_Settings
      'здес можно присвоить своиствам myClass нужные параметры
        'სერიალიზაცია
        sf.Serialize(fs, myClass)
        fs.Close()
    End Sub

    Private Sub LoadSettings()
        'პროგრამის პარამეტრების წაკითხვა ფაილიდან
        'FileStream-ის დათრევა რომელიც კითხულობს ფაილიდან
        Dim fs As New FileStream(Me.AppPath & "\ASJSett.xml", FileMode.Open)
        'SoapFormatter-ის შექმნა
        Dim sf As New SoapFormatter()
        'დესერიალიზაცია
        Dim myClass as ASJ_Settings = CType(sf.Deserialize(fs), ASJ_Settings)
        fs.Close()
    End Sub

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Структуры в vb.net

Сообщение iGrok » 23.03.2009 (Пн) 11:16

Emzari писал(а):вот пример сериализации
...


Признайся, ты ведь не читал топик?
label:
cli
jmp label

Emzari
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 06.09.2002 (Пт) 9:08
Откуда: Georgia

Re: Структуры в vb.net

Сообщение Emzari » 23.03.2009 (Пн) 11:27

такимже образом можно и структуру сохранить

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Структуры в vb.net

Сообщение iGrok » 23.03.2009 (Пн) 14:20

Emzari писал(а):такимже образом можно и структуру сохранить

Всё-таки не читал..
label:
cli
jmp label

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 26.03.2009 (Чт) 21:58

Волшебство...
Считываю файл в структуру:

Код: Выделить всё
Public Structure FileData
        Dim header As String
        Dim CountOfItems As Integer
        Dim Data() As ItemData
        Dim footer As String
    End Structure
    Public Structure ItemData
        Dim id As Integer
        Dim text1 As String
        Dim CountOfSubItems As Byte
        Dim Data() As NewStruc
    End Structure
    Public Structure NewStruc
       Dim P1 As Byte
       Dim P2 As Byte
       Dim P3 As Single
       Dim P4 As Integer
       ...
       ...
       ...
       Dim P100 as Byte
    End Structure


Public Function ReadFile(ByVal Path As String, <Runtime.InteropServices.Out()> ByRef File As FileData) As Boolean
        Dim ret As New FileData
        If IO.File.Exists(Path) Then 'проверяем файл на существование
            Try
                Using fs As New IO.FileStream(Path, IO.FileMode.Open, IO.FileAccess.Read)
                    Dim br As New IO.BinaryReader(fs)

                    With ret
                        .header = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(5))
                        If .header <> "то что надо" Then Throw New Exception("blah blah blah")
                        .CountOfItems = br.ReadInt32

                        ReDim .Data(.CountOfItems - 1)
                        For i As Integer = 0 To .CountOfItems - 1
                            With .Data(i)
                                .id = br.ReadInt32
                                .text1 = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(24))
                                .CountOfSubItems = br.ReadByte
                                ReDim .Data(.CountOfSubItems - 1)
                                For j As Integer = 0 To .CountOfSubItems - 1
                                    .Data(j).P1 = br.ReadByte
                                    .Data(j).P2 = br.ReadByte
                                    .Data(j).P3 = br.ReadSingle
                                    .Data(j).P4 = br.ReadInt32
                                    ...
                                    ...
                                    ...
                                    .Data(j).P100 = br.ReadByte
                                Next
                            End With
                        Next

                        .footer = System.Text.ASCIIEncoding.Default.GetString(br.ReadBytes(5))
                        File = ret
                        Return True
                    End With
                End Using
            Catch ex As Exception
                Return False
            End Try
        Else
            Return False
        End If
    End Function


Код: Выделить всё
Dim jjj as Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ReadFile("D:\g.bin", FileData)
End Sub


Делаю так:

Код: Выделить всё
Private Sub MOST()
TextBox1.Text = DD.Data(jjj).text1
End Sub


Если запускаю процедуру MOST так (кнопкой):
Код: Выделить всё
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
jjj = 5
MOST()
End Sub
- работает.

Если так (событие на изменение значения NumericUpDown'а):
Код: Выделить всё
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
jjj = 5
MOST()
End Sub
- не работает. Пишет "Ошибка: В экземпляре объекта не задана ссылка на объект.".

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Структуры в vb.net

Сообщение MIT » 26.03.2009 (Чт) 22:02

RCLIO писал(а):- не работает. Пишет "Ошибка: В экземпляре объекта не задана ссылка на объект.".
Значит это собыние происходит в момент, когда файл еще не загружен. Ошибка выскакивает при запуске приложения или когда?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

RCLIO
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 20.03.2009 (Пт) 18:23

Re: Структуры в vb.net

Сообщение RCLIO » 26.03.2009 (Чт) 22:34

Файл загружен. В том то и дело.
Ошибка возникает при запуске (F5).

Если
Код: Выделить всё
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
jjj = 5
MOST()
End Sub


заменить на:
Код: Выделить всё
Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.Click
jjj = 5
MOST()
End Sub
- ошибка исчезает. Но событие Click мне не подходит :(
Нужно именно ValueChanged.

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 78

    TopList  
cron