Вверх ↑
Администрация
Ответов: 15295
Рейтинг: 1519
#1: 2008-06-10 16:40:26 ЛС | профиль | цитата
Про пользовательские конструкторы данных я уже как раз думал. Особенно когда надо упаковать их в массив, как в примере по OpenGL из пакета QT, где пришлось использовать три отдельных массива для хранения координат x, y и z одного и того же объекта. Это мягко говоря кривое решение задачи...

Вот как бы хотелось решить туже задачу с использование "шаблона типа":

1) делаем некий элемент с именем record(он является контейнером, но без возможности добавления точек)
2) делаем кучу элементов с именами FieldInteger, FieldString, FieldReal и т.д.
3) положим нам нужен тип данных, состоящий из одного целочисленного поля и двух строковых - делаем:

#sha
Add(MultiElementEx,13963480,105,196)
{
}
BEGIN_SDK
Add(EditMultiEx,8914275,21,21)
{
VarCount=#6:record|
}
Add(Memory,3004996,112,49)
{
Default=Integer(0)
}
Add(Memory,9579031,112,98)
{
Default=String()
}
Add(Memory,5139641,112,147)
{
Default=String()
}
END_SDK

тут Контейнер это наш гипотетический элемент Record, а элементы Memory внутри - это поля, указанные выше. Точка "record" это готовый шаблон структуры
4) далее создаем элемент с каким-нибудь названием TemplateArray

#sha
Add(MultiElementEx,5229834,105,245)
{
}
BEGIN_SDK
Add(EditMultiEx,9259894,21,21)
{
VarCount=#5:array|
DataCount=#4:type|
}
END_SDK
где точка type - это шаблон данных, array - это массив, сконструированный по шаблону
5) ну и наконец допишем наши элементики для работы с массивами так, чтобы они понимали не только простейшие данные(как сейчас), но и такие, которые пользователь сделал с использованием среды. Причем запись/чтение можно производить, например, через МТ

Вот и получаем нехитрую схемку, которая добавляет число и две строки в наш пользовательский массив:
code_9251.txt

расширяя идею дальше, можно вставлять в элемент record скажем элементы типа ToInteger, ToString и т.д., которые по событию onConvert переведут все поля структуры в требуемый тип данных и вернут результат методом doReturn, т.е. получим полноценный тип данных.

К сожалнию минус у подхода только один: как реализовать это на базе стандартного пакета большой и толстый вопрос. Скорей всего никак...

------------ Дoбавленo:


После реализации и опыта использования этой технологии думаю станет понятно, как из струкруры сделать класс и к полям прибавить методы. А потом уже занятся наследованиями и прочей аттрибутикой. Решать же такие задачи с наскока это очень смелая идея

------------ Дoбавленo:


глядя на схему подумалось, что связывать через точку шаблон с элементом, который по этому шаблону строит данные не совсем верно. Тут видимо правильнее связать их через data_element, чтобы дать пользователю наглядное понимание того, что шаблон не делает в схеме абсолютно ничего и работает только на этапе кодогенерации.

------------ Дoбавленo:


вот такой код должен при этом получиться:

#cpp
// элемент record
typedef struct {
int field1;
string field2;
string field3;
} TRecord1;

.....
// элемент TemplateArray
TRecord1 *arr;

.....
// элемент ArrayWrite
arr[0].field1 = mt1;
arr[0].field2 = mt2;
arr[0].field3 = mt3;
.....
карма: 27
0
файлы: 1code_9251.txt [922B] [596]