Игорь Столяров писал(а): ↑26 Июль 2019, 8:19
RaFaeL писал(а): ↑26 Июль 2019, 7:34Очередь указателей чем не подходит?
Я думал в эту сторону - не очень удобно. Во первых для передачи параметров внутри группы - это снова делать
указатель на типизированную очередь указателей (QUEUE внутри GROUP не может быть).
Во-вторых добавлять записи, считывать записи …
Но если современная наука ничего другого не предложит - то видимо придётся делать через QUEUE указателей.
Всё-таки это самое то, зачем мудрить ...
Из описанного выше класса DumpClass
Код: Выделить всё
DumpQ Queue,Type
Id Cstring(20) ! Идентификатор переменной
Type String(1) ! Тип поля
Addr Any ! Адрес поля
AddrG &Group ! Адрес группы
AddrQ &Queue ! Адрес очереди
Address Ulong ! Истинный адрес группы
RecSize Long ! Размер поля
RecCount Long ! Количество записей
End
DumpClass Class,Type,Module('Dumper.Clw')
Q &DumpQ
DebugInfo Cstring(1000)
Construct Procedure
Destruct Procedure
AddField Procedure(String,*?)
AddField Procedure(String,*Group)
AddField Procedure(String,*Queue)
SaveBlob Procedure(*Blob)
LoadBlob Procedure(*Blob),Long,Proc
End
Код: Выделить всё
DumpClass.Construct Procedure
Code
Self.Q &= New DumpQ
Clear(Self.Q)
Return
DumpClass.AddField Procedure(String Id,*Queue Field)
Code
Clear(Self.Q)
Self.Q.Id=Clip(Upper(Id))
Get(Self.Q,+Self.Q.Id)
If ErrorCode()
Add(Self.Q,+Self.Q.Id)
End
Self.Q.Type=Type:Queue ! Varia
!Self.Q.Addr &= Field
Self.Q.AddrQ &= Field
Self.Q.Address=Address(Self.Q.AddrQ)
Self.Q.RecSize= Len(Field & '')
Put(Self.Q)
Return
DumpClass.SaveBlob Procedure(*Blob BlobField)
Loc:Size Long ! Размер
Loc:DumpQ Long ! Счётчик записей в дампе
Loc:RecNo Long ! Количество записей в списке
Loc:SavePtr Long ! Сохранение указателя
Loc:Pos Long
....
Loop Loc:DumpQ=1 to Records(Self.Q)
Get(Self.Q,Loc:DumpQ)
...
Case Self.Q.Type
...
Of Type:Queue
! Перекинем очередь в Blob
If Records(Self.Q.AddrQ)
|Self.DebugInfo=Self.DebugInfo & '<13,10> Очередь ' & Self.Q.Id & '/' &Records(Self.Q.AddrQ)
Rh:RecCount=Records(Self.Q.AddrQ)
BlobField[Loc:Pos : Loc:Pos+Size(RH)-1] = RH
Loc:Pos+=Size(RH)
Loc:SavePtr=Pointer(Self.Q.AddrQ)
Loop Loc:RecNo=1 to Records(Self.Q.AddrQ)
Get(SelF.Q.AddrQ,Loc:RecNo)
CopyMemory(Address(Temp),Self.Q.Address,Self.Q.RecSize)
BlobField[Loc:Pos : Loc:Pos+Self.Q.RecSize-1] = Temp
Loc:Pos+=Self.Q.RecSize
End
End
Вполне удобно и комфортно для работы с абстрактными очередями, очередь хранится вместе с необходимыми реквизитами