среда, 18 сентября 2013 г.

Пишу потихоньку, процедуры сохранения делать легче чем процедуры загрузки.

' 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

1 комментарий: