Перевод структуры в строку и обратно

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Перевод структуры в строку и обратно

Сообщение lister » 03.05.2006 (Ср) 13:53

Для того чтобы преобразовать структуру typMT в строку strBuffer пользуюсь следующим "извратом" с использованием временного файла. Код ниже:

Код: Выделить всё
Option Explicit


Private Type MyType
  Name As String
  Email As String
  Date As Date
End Type

Private Sub Form_Load()
  Dim fn As Integer
  Dim strFile As String
  Dim typMT As MyType
  Dim strBuffer As String
 
  strFile = App.Path & "\tempfile.tmp"
 
  With typMT
    .Name = "Иванов Иван Иванович"
    .Email = "ivan@ivanov.ru"
    .Date = Now
  End With
 
  fn = FreeFile
  Open strFile For Binary Access Write Lock Read Write As fn
    Put #fn, , typMT
  Close fn
 
  fn = FreeFile
  Open strFile For Binary Access Read Lock Read Write As fn
    strBuffer = String(LOF(fn), vbNullChar)
    Get #fn, , strBuffer
  Close fn

  Kill strFile

End Sub


Для чтения структуры typMT из строки strBuffer примерно также пользуюсь временным файлом...


У меня возник вопрос:
Как можно преобразовать структуру typMT в строку и наоборот без использования временного файла?

Если у кого есть пример, буду рад его посмотреть :)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 03.05.2006 (Ср) 14:04

Код модуля:
Код: Выделить всё
Option Explicit

Public Type MyType
    Name As String
    Email As String
    Date As Date
End Type
Public Const strDelimiter As String = vbTab

Public Sub ToString(Struct As MyType, strTarget As String)
    strTarget = Struct.Date & strDelimiter & Struct.Email & strDelimiter & Struct.Name
End Sub

Public Sub FromString(Struct As MyType, strSource As String)
    Dim tmparr
    tmparr = Split(strSource, strDelimiter)
    Struct.Date = tmparr(0)
    Struct.Email = tmparr(1)
    Struct.Name = tmparr(2)
End Sub

Код формы:
Код: Выделить всё
Option Explicit

Public Sub Form_Load()
    Dim strBuffer As String
    Dim typMT As MyType
 
    With typMT
        .Name = "Иванов Иван Иванович"
        .Email = "ivan@ivanov.ru"
        .Date = Now
    End With
 
    ToString typMT, strBuffer
    MsgBox strBuffer

    FromString typMT, strBuffer
    MsgBox typMT.Name
    MsgBox typMT.Email
    MsgBox typMT.Date
End Sub


Примечание. strDelimiter должен быть такой, чтобы гарантированно не встретился ни в .Name, ни в .Email, ни в .Date.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.05.2006 (Ср) 14:31

Копируй область памяти с помощью АПИ ф-ции CopyMemory

ЗЫ/В структуре используй фикс. строки
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 14:34

Amed
Понятно... Спасибо!

А альтернативы никакой нет? Например использовать CopyMemory или еще что-нибудь.

MyType я привел для примера. На самом деле структура может быть очень сложная и разделитель здесь подобрать будет довольно проблематично, да и разделять строку затем замучаешься - код будет большой, путаница возможна. Проще применить временный файл... но не хочеться :)
Последний раз редактировалось lister 03.05.2006 (Ср) 14:36, всего редактировалось 1 раз.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 14:35

Хакер писал(а):Копируй область памяти с помощью АПИ ф-ции CopyMemory

ЗЫ/В структуре используй фикс. строки


Да-да, об этом я и хотел спросить... как? :)

Хотя использовать фиксированные строки все-таки нежелательно :?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.05.2006 (Ср) 14:39

lister
а для чего вообще у тебя изврат с копированием структуры?
ты сохраняешь данные между сеансами работы что ли :?:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.05.2006 (Ср) 14:39

Если тебя интересует как работать с ф-цией CopyMemory, то можно почитать статью из Апи-гуида или мою статью об пакере данных.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 14:45

Konst_One
Нет, не сохраняю...

строка в которой содержиться структура затем кодируется в base64

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 14:46

Хакер писал(а):Если тебя интересует как работать с ф-цией CopyMemory, то можно почитать статью из Апи-гуида или мою статью об пакере данных.


Ссылку на твою статью можешь дать? :roll:

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.05.2006 (Ср) 14:48

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.05.2006 (Ср) 14:51

Нет, не сохраняю...

строка в которой содержиться структура затем кодируется в base64


А зачем тебе это все? Поподробнее свою задачу объясни, может дадим нужный совет, как можно все зделать по-другому :wink:

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 03.05.2006 (Ср) 14:55

Почитай про PropertyBag. Если закодированное в Base64 потом раскодируется и восстанавливается, то почему бы не кодировать PropertyBag?

http://bbs.vbstreets.ru/viewtopic.php?t=13552

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.05.2006 (Ср) 15:03

Amed
ну зачем ты так сразу, я ведь его плавно так подводил к этому наводящими вопросами, а ты ... :D

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 15:11

Konst_One писал(а):А зачем тебе это все? Поподробнее свою задачу объясни, может дадим нужный совет, как можно все зделать по-другому :wink:


Объяснить сложно и долго. Связано с техподдержкой... Допустим, у пользователя возникла какая-либо проблема. Он жмет кнопку "Написать письмо в support", при этом программа собирает сведения о компьютере, системе, пользователе, создает аттачмент к письму в виде файла с данными (структурами OSVERSIONINFOEX, MEMORYSTATUS и пр.). Данные кодируются в base64, прилепляются к письму в котором пользователь описывает проблему. Затем программа отправляет письмо...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.05.2006 (Ср) 15:14

PropertyBag

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 15:15

Amed писал(а):Почитай про PropertyBag. Если закодированное в Base64 потом раскодируется и восстанавливается, то почему бы не кодировать PropertyBag?

http://bbs.vbstreets.ru/viewtopic.php?t=13552


Спасибо! Я уже думал об этом :)
PropertyBag пойдет на будущее... Сейчас использовать не могу...

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 15:17

Konst_One писал(а):PropertyBag


Не могу :( [не 'не умею', а именно не могу]

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.05.2006 (Ср) 15:21

ну так тогда пиши свою структуру в типизованный файл и его уже кодируй и передавай.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 03.05.2006 (Ср) 15:50

[offtopic]
Konst_One писал(а):Amed
ну зачем ты так сразу, я ведь его плавно так подводил к этому наводящими вопросами, а ты ... :D

Konst_One. LOL
Тебе все равно пришлось нежно подвести его к мысли о PropertyBag. LOL. LOL. LOL.
[/offtopic]

lister
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 389
Зарегистрирован: 15.01.2005 (Сб) 7:34
Откуда: Страна оления

Сообщение lister » 03.05.2006 (Ср) 15:54

Konst_One

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

Всем большое спасибо за обсуждение!


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 195

    TopList  
cron