![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тип как массив компонентов заданного типа
nobody © (2010-06-24 15:34:00)Как объявить сабж, который может содержать только объекты определенного типа?
например:
TOraObject1 = set of [TOracleDataset, TOracleQuery];
но мне нужно
TOraObject2 = array of [TOracleDataset, TOracleQuery];<-Error
Православно ли будет объявить
TOraObject2 = array of TOraObject1?
nobody (2010-06-25 11:51:00) [1]
>
> Восторг скоро пройдет, когда выяснится, что весь этот массив
> ничем
> не лучше T(Object)List, а любые содержательные действия
> с его
> элементами представляют собой длинную цепочку if x[i] is
> Tx.
да, он уже сегодня прошел
пришлось вернуться к одной переменной типа TComponent и спрашивать , какого она типа...
anonims (2010-06-25 08:37:00) [2]TOraObject1 = record ds:TOracleDataset; oqr: TOracleQuery; end;
TOraObject2 = array of TOraObject;
Anatoly Podgoretsky (2010-06-24 20:55:00) [3]
> а как на счет VarArrayOf ?
А что с ним не так?
Во первых это Open Array
а во вторых все равно определенного типа array of Variant
Leonid Troyanovsky (2010-06-24 18:32:00) [4]
> nobody (24.06.10 16:38) [16]
> Что и требовалось доказать)
Восторг скоро пройдет, когда выяснится, что весь этот массив ничем
не лучше T(Object)List, а любые содержательные действия с его
элементами представляют собой длинную цепочку if x[i] is Tx.
--
Regards, LVT.
RWolf (2010-06-24 16:45:00) [5]
> если присвоенно полю MyArray[k].DataSet, то в любом случае
> там будет тип TOracleDataSet - это же очевидно из определения
> записи
это не простая запись, в ней поля DataSet и Query занимают одни и те же 4 байта в памяти. Поэтому перед использованием такого элемента массива нужно проверять его фактический тип оператором is.
nobody (2010-06-24 16:38:00) [6]кстати
TOraObject = record
case byte of
0: (DataSet:TOracleDataSet;);
1: (Query:TOracleQuery;);
и т.п.
end;
TArrayOfOraObject = array of TOraObject и дает нам массив элементов заданных типов.
Что и требовалось доказать)
2RWolf - лучи добра тебе, камрад!:)
nobody (2010-06-24 16:30:00) [7]
>
> MyArray[i].DataSet := OracleDataSet1;
> MyArray[j].Query := TOracleQuery1;
>
> if MyArray[k].DataSet is TOracleDataSet then …
если присвоенно полю MyArray[k].DataSet, то в любом случае там будет тип TOracleDataSet - это же очевидно из определения записи
может условие проверки будет что-то типа
if Assigned(MyArray[i].DataSet) then ... ?
RWolf (2010-06-24 16:16:00) [8]
> а как такой конструкцией пользоваться?как проводить проверку,
> какого типа поле?
MyArray[i].DataSet := OracleDataSet1;
MyArray[j].Query := TOracleQuery1;
if MyArray[k].DataSet is TOracleDataSet then …
nobody (2010-06-24 16:08:00) [9]а как такой конструкцией пользоваться?
как проводить проверку, какого типа поле?
RWolf (2010-06-24 16:02:00) [10]ну, в принципе, можно извратиться как-то так:
TOraObject = record
case byte of
0: (DataSet:TOracleDataSet;);
1: (Query:TOracleQuery;);
и т.п.
end;
nobody (2010-06-24 15:58:00) [11]похоже, извратиться не получится...
nobody (2010-06-24 15:57:00) [12]вот или что-то в таком духе, но оно тоже не проходит
TOratype = set of [TOracleDataSet,TOracleQuery];
TOraObject = record
case TOratype of
TOracleDataSet:DataSet;
TOracleQuery:Query;
end;
end;
RWolf (2010-06-24 15:54:00) [13]
> а как на счет VarArrayOf ?
это тоже элементы одного типа — Variant.
RWolf (2010-06-24 15:53:00) [14]Собственно, проверку можно делать при добавлении нового элемента:
if element is TOracleDataset then …
nobody (2010-06-24 15:51:00) [15]
> массив — по определению набор элементов одинакового типа
а как на счет VarArrayOf ?
RWolf (2010-06-24 15:50:00) [16]массив — по определению набор элементов одинакового типа, так что можно только указать при его объявлении тип базового предка, а в программе приводить его к типам потомков.
nobody (2010-06-24 15:46:00) [17]
> пусть будет array of TComponent
это понятно.
просто хотелось бы накладывать ограничения на входящий тип, если такое возможно языковой конструкцией...
RWolf (2010-06-24 15:41:00) [18]пусть будет
array of TComponent.
Пользоваться так:(MyArray[i] as TOracleDataset).Open;
nobody (2010-06-24 15:39:00) [19]TOracleQuery = class(TComponent)
TOracleDataSet = class(TDataSet)
nobody (2010-06-24 15:38:00) [20]
> TOracleQuery — это ведь производный класс от TOracleDataset?
увы и ах