Динамические очереди

bdr>  Меня интересуют твои наработки по динамическим очередям. Как я понимаю это реализовано у тебя в виде библиотеки(lib или dll).  Возможно ли получить от тебя dll, если да, то не кинеш ли на мыло baa@dionis.ru.  Заранее благодарен!

Я планирую на праздники (первые) отделить от данной библиотеки класс DynaFile по причине его «сырости» и тогда брошу все необходимое, например, на Клариошу. Иначе мой инет просто физически не потянет рассылать отдельно всем заинтересованным. Как и DynaView, это будут LIB и DLL модули для 32бит.

bdr>  И еще 2 вопроса: DLL компилена в C5 или С5.5 (я как понял ты пока на 5 работаешь)?

Библиотека будет в двух вариантах — для C5 и C55. Хотя я и не работаю на C55, тем не менее я предусматриваю в библиотеках изначально раздельную компиляцию тех кусков кода, которые по разному работают в C5/C55.

Другое дело, что под C55 я не так всесторонне тестирую эти библиотеки. Да и вообще, с полноценным тестированием туговато! Дело в том, что в моих Dyna-классах есть очень много моментов описания групп/очередей, которые невозможно реализовать в статике. Например, компилятор не пропустит напрямую массивы указателей. Или невозможно создать реферал на именованную группу внутри какой-либо структуры (GROUP/QUEUE/CLASS).

Поэтому появляется масса вариантов описаний структур, которые просто невозможно все охватить и которые будут проявляться при реальной работе с этими классами.
Поэтому, как пишут в лицензиях, «если у Вас что-то не будет работать, то мы за себя не отвечаем» 🙂

bdr>  Возможно ли в твоей реализации создавать очередь очередей с разной структурой  или хотя бы с одинаковой?

Это как? Типа так, что-ли?:

ParentQue   QUEUE
ChildQue      &QUEUE
            END

Если так, то такая конструкция возможна и в нормальном статическом описании. Другое дело, что для комфортной работы с «дочерней» очередью надо делать ссылку на именованную очередь известной структуры. В моей библиотеке это можно реализовать так:

ParentQue   TDynaQueueClass
ChildQue    TDynaQueueClass

  ParentQue._QUEUE('Parent','PR')
    ParentQue._QUEUEREF('Child')
  ParentQue._END()

Для организации очереди очередей с одинаковой структурой дочерней очереди проще описать в секции данных статическую группу известной структуры и создавать экземпляры ChildQue так:

  ChildQue._QUEUE('Child','Ch',TChildGroup)
  ChildQue._END

Для организации очереди с дочерними очередями разной структуры прийдется описывать создание каждой новой «дочки» типа:

  ChildQue._QUEUE('Child','Ch')
    CASE Variant
    of 'Первый вариант "дочки"'
       ChildQue._STRING('Name',40)         ! или ('Name','@S40')
    of 'Второй вариант "дочки"'
       ChildQue._DECIMAL('Price',11,2)
       ChildQue._LONG('Index')
    of 'Третий вариант "дочки"'
       ChildQue._DECIMAL('Price',11,2)
       ChildQue._DECIMAL('ExtPrice',11,2)  ! DECIMAL(11,2),DIM(2,5)
         ChildQue._DIM(2,5)                !
       ChildQue._LONG('Index')
    END
  ChildQue._END

Или можно загружать описания структуры «детских» очередей из внешнего текстового файла:

  ChildQue.LoadDeclare(,'QueDecl.txt','имя_очереди')

А дальше — заполнение родительской очереди:

  ParentQue.PutField(ChildQue.Q,'PR:Child')
  Add(ParentQue.Q)

Конечно, было бы здорово записывать в родительскую очередь не указатель на созданную дочернюю очередь, а указатель на сам класс ChildQue. Тогда было бы очень легко работать с полями дочерней очереди по привычным меткам. Но, к сожалению, пока я не знаю, как можно обмануть компилятор и передавать/возвращать указатели на НЕИМЕНОВАННЫЕ классы!
Кстати! Может кто знает?

Но есть более простой выход, если структура родительской очереди постоянна:

ParentQue     QUEUE(PR)
ChildQue        &TDynaQueueClass
              END

Теперь, перед созданием дочерней очереди нужной структуры, пишем:

  PR:ChildQue &= New(TDynaQueueClass)

а после создания: Add(ParentQue)