Пишу потихоньку, процедуры сохранения делать легче чем процедуры загрузки.
Собственно функция сохранения
' Gambas class file
' Класс содержащий дополнительные свойства для юнита или части юнита
' Содержит пачку дополнительных свойств
' Как работать с данным классом
' Нужно сначала запросить номер искомого элемента по имени или ID
' После проверить не равно ли оно -1 что означает отсутствие этого свойства у объекта
' И если всё в порядке то обратиться к массиву Values и извлечь оттуда элемент по нужному номеру
Public NameValue As New String[] ' имя параметра
Public IDValue As New Integer[] ' числовое значение совпадающее с именем параметра
' каждый параметр должен должен обладать своим ID, а так же NameValue и IDValue должны быть синхронизированны
Public Values As New Variant[] ' Всё таки я решил хранить значения в типе Variant
'4 + 4 + 8 = 16 байт на одно свойство
Public Count As Integer ' колличество свойств
Собственно функция сохранения
Public Function SaveClass() As String[]
'Функция возвращает массив строк содержащий все значения сохранённые в классе
Dim Srm As New String[] ' массив для результата
Dim r As String ' результат 1 строка
Dim a As Integer ' счётчик цикла
Dim m As Integer ' мксимальное значение цикла
Dim TypeGameObjectDataClass As Integer ' тип переменной
Dim t As New GameObjectDataClass ' пустая переменная для определения типа
'переменные для сохранения вложенных значений GameObjectDataClass
Dim godcStrings As String[] 'массив для временного хранения строк
Dim godcA As Integer ' счётчик цикла для перебора массива
Dim godcM As Integer ' конец счётчика
Dim godcLink As GameObjectDataClass ' переменная ссылка для ускорения опраций с объектом
TypeGameObjectDataClass = TypeOf(t) ' тип контейнера для сложных свойств-объектов с более чем одним параметров
m = Values.Max
Srm.Add("begin universal values")
For a = 0 To m
'перебор всех значений
Srm.Add("name=" & NameValue[a])
Srm.Add("id=" & Str(IDValue[a]))
If TypeOf(Values[a]) = gb.Integer Then
'значение integer
Srm.Add("value-integer=" & Str(Values[a]))
Endif
If TypeOf(Values[a]) = gb.Single Then
'значение Single
Srm.Add("value-single=" & Str(Values[a]))
Endif
If TypeOf(Values[a]) = gb.Float Then
'значение float
Srm.Add("value-float=" & Str(Values[a]))
Endif
If TypeOf(Values[a]) = gb.String Then
'значение строка
Srm.Add("value-string=" & Values[a])
Endif
If TypeOf(Values[a]) = TypeGameObjectDataClass Then
'комплексное значение GameObjectDataClass
'здесь надо будет сохранено куча строк
Srm.Add("value-godc=") ' GameObjectDataClass
godcStrings.Clear ' очистка массива
godcLink = Null ' обнудение переменной ссылки
godcLink = Values[a] ' присвоение ссылки, в дальнейшем использовать для операций эту ссылку
godcStrings = godcLink.SaveClass ' сохранение класса в массив
' а теперь надо перебрать массив и сохранить его строки в массиве Srm этого класса
godcM = godcStrings.Max ' узнать индекс последнего элемента в массиве
For godcA = 0 To godcM
'собственно перебор
Srm.Add(godcStrings[godcA]) ' добавить в Srm массив значение из возвращённого массива
Next
Endif
Srm.Add("next value")
Next
Srm.Add("end universal values")
Return Srm
End
Этот комментарий был удален администратором блога.
ОтветитьУдалить