Persistable class (Что-нибудь вроде SaveObject имеется??)

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

Persistable class (Что-нибудь вроде SaveObject имеется??)

Сообщение zHackLeX » 12.02.2005 (Сб) 13:27

Как сохранить всю объектную переменную на диск?

Создалл модуль класса,
объявил переменную объектную.

1) Как сохранить в файл всю переменную?
2) Как потом загрузить оную?
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.02.2005 (Сб) 13:36

MSDN писал(а):Using the PropertyBag Object to Persist an Object

In order to persist an ActiveX component, you need to create an instance of a PropertyBag object. This may seem redundant — after all, the class already has it's own PropertyBag. Why can't you just use that? Simple. When the object goes away, so does its PropertyBag. It only exists in memory; for persistence you need to store a copy of the object somewhere so you can retrieve it later.

Think of a PropertyBag as a sack that you can fill up with stuff and stash away somewhere for safe keeping. Where you stash it is entirely up to you. The following form code demonstrates how you can persist an object to a text file:

Код: Выделить всё
Private pb As PropertyBag      ' Declare a PropertyBag object.
Private LoanObject As Loan      ' Declare a Loan object.

Private Sub Form_Unload(Cancel As Integer)
   Dim varTemp as Variant

   ' Instantiate the PropertyBag object.
   Set pb = New PropertyBag
   ' Save the object to the PropertyBag using WriteProperty.
   pb.WriteProperty "MyLoanObject", LoanObject
   ' Assign the Contents of the PropertyBag to a Variant.
   varTemp = pb.Contents
   ' Save to a text file.
   Open "C:\Loandata.txt" For Binary As #1
   Put #1, , varTemp
   Close #1
End Sub


The Contents property of the PropertyBag object contains the Loan object stored as an array of bytes. In order to save it to a text file, you first must convert it to a data type that a text file understands — in this case, a Variant.

Depersisting An Object

Once the object is contained inside a text file (or any other type of storage), it can easily be transported to another location. Imagine that our Loan object contains not only the InterestRate, but also property values to represent all of the fields in a loan application. You could take the Loandata.txt file and send it to the central office for approval. The code for a form that would reuse the Loan object would look something like this:

Код: Выделить всё
Private pb As PropertyBag      ' Declare a PropertyBag object.
Private LoanObject As Loan      ' Declare a Loan object.

Private Sub Form_Load()
   Dim varTemp As Variant
   Dim byteArr() as Byte

   ' Instantiate the PropertyBag object.
   Set pb = New PropertyBag
   ' Read the file contents into a Variant.
   Open "C:\Loandata.txt" For Binary As #1
   Get #1, , varTemp
   Close #1
   ' Assign the Variant to a Byte array.
   ByteArr = varTemp
   ' Assign to the PropertyBag Contents property.
   Pb.Contents  = ByteArr
   ' Instantiate the object from the PropertyBag
   Set LoanObject = pb.ReadProperty("MyLoanObject")
End If


You may have noticed that the object had to be assigned three times: first from the text file to a Variant, then from a Variant to a Byte array, then to the Contents property. That's because the Contents property will only accept a Byte array — if you tried to assign any other data type you would get an error.

So what's going on here? Can you actually take an object created in one place and reuse it in another, complete with its data? Well, not exactly. The original object is long gone. What you are passing in a PropertyBag is an exact copy of the object, not the object itself. This ability to "clone" an object for reuse is a powerful concept, especially when it comes to designing workflow applications.
Изображение

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 28.02.2005 (Пн) 22:50

А почему, ккак пытаюсь сохранять коллекции объектов, при попытке загрузки он не загружает ничего вообще?
(разумеется, все классы persistable)
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 28.02.2005 (Пн) 23:15

Простите, вопрос немного не в тему, но может мне кто- нибудь объянить механизм этого преобразования:
tyomitch писал(а): ' Assign the Variant to a Byte array.
ByteArr = varTemp
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.03.2005 (Вт) 4:25

zHackLeX писал(а):А почему, ккак пытаюсь сохранять коллекции объектов, при попытке загрузки он не загружает ничего вообще?
(разумеется, все классы persistable)

Потому что сама коллекция - не persistable класс. Надо сохранять элементы по одному.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.03.2005 (Вт) 4:28

Cryonyx писал(а):Простите, вопрос немного не в тему, но может мне кто- нибудь объянить механизм этого преобразования:
tyomitch писал(а): ' Assign the Variant to a Byte array.
ByteArr = varTemp

В точноcти такой же, как и при преобразовании из строки в байтовый массив: "ABC" переводится в (65, 0, 66, 0, 67, 0)
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 01.03.2005 (Вт) 16:20

2 Tyomitch:
Т.е., получается, что нужен массив, вдвое больший, чем исходная строка? А что означают нули на чётных позициях?

З.Ы. Я, если честно, не слишком хорошо шарю в конверсиях :oops:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.03.2005 (Вт) 16:30

Нули означают, что исходная Unicode-строка не содержала расширенных символов.
Lasciate ogni speranza, voi ch'entrate.

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 01.03.2005 (Вт) 16:34

А можешь привести пример, как бы это выглядело со строкой, скажем, из китайских символов (если я правильно понимаю смысл) :?:
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.03.2005 (Вт) 16:52

Смысл понял правильно, только зачем?
Открой "Таблицу символов", выбери любой Unicode-символ и взгляни на строку статуса. Там будет что-то вроде "U+2122: Trade Mark Sign". Здесь &h22 это первый байт, &h22 второй байт.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.03.2005 (Вт) 19:43

alibek писал(а):Здесь &h22 это первый байт, &h22 второй байт.

:lol:
Анекдот писал(а):А почему не.... А, так это вы, Путин?

Возьмём лучше русскую букву "А": U+0410 Cyrillic Capital Letter A. Первый байт - &H10, второй - 4.
Изображение

Cryonyx
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 292
Зарегистрирован: 12.11.2004 (Пт) 15:40
Откуда: Net_SubStream

Сообщение Cryonyx » 01.03.2005 (Вт) 21:22

Пасибо, Тёмыч, кажется я въехал...
(Вопрос, куда? :D )
Если тебе не по сердцу мой путь,
Выбери сам или выбери с кем,
А мне по барабану вся эта муть -
Я не червонец, чтобы нравиться всем!
© К.Кинчев
--
Мой блог: щёлкай сюда

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 04.03.2005 (Пт) 12:39

Тогда возникает вопрос - а почему ВООБЩЕ
сохраняется файл?

И вот ещё один исходник - пытался сохранять класс безо всяких примочек - с тремя текст-переменными

Код: Выделить всё
Dim FL As FLI 'Class FLI is a custom persistable class
Private Sub save_Click()
    'save
    Dim PB As PropertyBag
    Dim BAr() As Byte
    Dim tmp As Variant
    Set PB = New PropertyBag
    PB.WriteProperty "CLS", FL
    BAr = PB.Contents
    tmp = BAr
    Open App.Path + "\tes.tst" For Binary As #1
        Put #1, , tmp
    Close #1
    Set PB = Nothing
End Sub

Private Sub Load_Click()
    Dim PB As PropertyBag
    Dim BAr() As Byte
    Dim tmp As Variant
    Open App.Path + "\tes.tst" For Binary As #1
        Get #1, , tmp
    Close #1
    BAr = tmp
    Set PB = New PropertyBag
    PB.Contents = BAr
    Set tob = PB.ReadProperty("CLS")
    Set PB = Nothing
'   set fl=get
End Sub


Что здесь может быть не так?
Он, гадость, не хочет его загружать! :twisted:

Как быть? У меня такой проект от этого накрывается!!! :(
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

zHackLeX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 23.10.2003 (Чт) 21:08

Сообщение zHackLeX » 13.03.2005 (Вс) 13:34

Мдя, пришлось сохранять всё без использования возможностей persistable-классов. Получилось коряво.
There is no knowledge that is not power...

X,C,A,B,C,Z,X,A,B,C,Z....
Многие ли помнят? :)

drronnie
Постоялец
Постоялец
 
Сообщения: 793
Зарегистрирован: 04.03.2002 (Пн) 22:29
Откуда: Украина, Алчевск

Сообщение drronnie » 14.09.2005 (Ср) 23:13

Господа, такая ж трабла.
Код: Выделить всё
    PB.WriteProperty "CLS", FL
    Set FL = PB.ReadProperty("CLS")

После этого члены-переменные не содержат никаких данных....
В чём проблема?
Компиляция - перевод словесного поноса в машинный код.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.09.2005 (Чт) 0:42

В Class_ReadProperties и Class_WriteProperties что? Пусто? ;-)
Изображение

kpblc
Новичок
Новичок
 
Сообщения: 42
Зарегистрирован: 05.05.2006 (Пт) 15:42
Откуда: С.-Петербург

Сообщение kpblc » 27.06.2006 (Вт) 9:24

Подниму тему, поскольку новую создавать не с руки.
У меня задача - в классе на VB вызывается форма. Мне необходимо, чтобы при последующем вызове этой формы
а) она встала где была в момент закрытия при последнем вызове
б) имела размер как в тот же момент
в) имела размер не меньше прописанного; контролы разносятся программно.
Persistable для класса я сделал, но четкое ощущение, что сделал либо не так, либо не до конца. Изменение свойств формы по StartUpPosition ничего не дает. Собственно вопрос - что конкретно надо прописывать в Class_InitProperties, ReadProperties и т.п.? В MSDN был, на google и yandexе тоже, но не смог понять, где надо объявлять объект PropertyBag и как с ним обращаться.
Содержимое контролов восстанавливать не надо, только положение формы. Пока этого достаточно. Если можно, расскажите как для полного чайника.
Спасибо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.06.2006 (Вт) 10:30

kpblc
Ты поднял тему, которая не имеет вообще никакого отношения к твоему вопросу.
Тебе следовало бы создать новую тему с этим вопросом.
Однако если ты сделаешь это, я закрою её и вынесу тебе замечание, поскольку аналогичная тема висит в настоящий момент на первой странице форума для новичков.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

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

    TopList