Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.19;
Скачать: CL | DM;

Вниз

Тип как массив компонентов заданного типа   Найти похожие ветки 

 
nobody   (2010-06-24 15:34) [0]

Как объявить сабж, который может содержать только объекты определенного типа?
например:
TOraObject1 = set of [TOracleDataset, TOracleQuery];
но мне нужно
TOraObject2 = array of [TOracleDataset, TOracleQuery];<-Error
Православно ли будет объявить
TOraObject2 = array of TOraObject1?


 
RWolf ©   (2010-06-24 15:37) [1]

TOracleQuery — это ведь производный класс от TOracleDataset?
если так, то ответ: TMyArray = array of TOracleDataset;


 
nobody   (2010-06-24 15:38) [2]


> TOracleQuery — это ведь производный класс от TOracleDataset?

увы и ах


 
nobody   (2010-06-24 15:39) [3]

TOracleQuery = class(TComponent)
TOracleDataSet = class(TDataSet)


 
RWolf ©   (2010-06-24 15:41) [4]

пусть будет array of TComponent.
Пользоваться так: (MyArray[i] as TOracleDataset).Open;


 
nobody   (2010-06-24 15:46) [5]


> пусть будет array of TComponent

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


 
RWolf ©   (2010-06-24 15:50) [6]

массив — по определению набор элементов одинакового типа, так что можно только указать при его объявлении тип базового предка, а в программе приводить его к типам потомков.


 
nobody   (2010-06-24 15:51) [7]


> массив — по определению набор элементов одинакового типа

а как на счет VarArrayOf ?


 
RWolf ©   (2010-06-24 15:53) [8]

Собственно, проверку можно делать при добавлении нового элемента:
if element is TOracleDataset then …


 
RWolf ©   (2010-06-24 15:54) [9]


> а как на счет VarArrayOf ?

это тоже элементы одного типа — Variant.


 
nobody   (2010-06-24 15:57) [10]

вот или что-то в таком духе, но оно тоже не проходит
TOratype = set of [TOracleDataSet,TOracleQuery];

 TOraObject = record
    case TOratype of
      TOracleDataSet:DataSet;
      TOracleQuery:Query;
    end;
 end;


 
nobody   (2010-06-24 15:58) [11]

похоже, извратиться не получится...


 
RWolf ©   (2010-06-24 16:02) [12]

ну, в принципе, можно извратиться как-то так:
TOraObject = record
   case byte of
     0: (DataSet:TOracleDataSet;);
     1: (Query:TOracleQuery;);
     и т.п.
   end;


 
nobody   (2010-06-24 16:08) [13]

а как такой конструкцией пользоваться?
как проводить проверку, какого типа поле?


 
RWolf ©   (2010-06-24 16:16) [14]


> а как такой конструкцией пользоваться?как проводить проверку,
>  какого типа поле?

MyArray[i].DataSet := OracleDataSet1;
MyArray[j].Query := TOracleQuery1;

if MyArray[k].DataSet is TOracleDataSet then …


 
nobody   (2010-06-24 16:30) [15]


>
> 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 ... ?


 
nobody   (2010-06-24 16:38) [16]

кстати
TOraObject = record
  case byte of
    0: (DataSet:TOracleDataSet;);
    1: (Query:TOracleQuery;);
    и т.п.
  end;

TArrayOfOraObject = array of TOraObject и дает нам массив элементов заданных типов.
Что и требовалось доказать)

2RWolf - лучи добра тебе, камрад!:)


 
RWolf ©   (2010-06-24 16:45) [17]


> если присвоенно полю MyArray[k].DataSet, то в любом случае
> там будет тип TOracleDataSet - это же очевидно из определения
> записи

это не простая запись, в ней поля DataSet и Query занимают одни и те же 4 байта в памяти. Поэтому перед использованием такого элемента массива нужно проверять его фактический тип оператором is.


 
Leonid Troyanovsky ©   (2010-06-24 18:32) [18]


> nobody   (24.06.10 16:38) [16]

> Что и требовалось доказать)

Восторг скоро пройдет, когда выяснится, что весь этот массив ничем
не лучше T(Object)List, а любые содержательные действия с его
элементами представляют собой длинную цепочку if x[i] is Tx.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-06-24 20:55) [19]


> а как на счет VarArrayOf ?

А что с ним не так?
Во первых это  Open Array
а во вторых все равно определенного типа array of Variant


 
anonims   (2010-06-25 08:37) [20]

TOraObject1 = record ds:TOracleDataset; oqr: TOracleQuery; end;

TOraObject2 = array of TOraObject;


 
nobody   (2010-06-25 11:51) [21]


>
> Восторг скоро пройдет, когда выяснится, что весь этот массив
> ничем
> не лучше T(Object)List, а любые содержательные действия
> с его
> элементами представляют собой длинную цепочку if x[i] is
> Tx.

да, он уже сегодня прошел
пришлось вернуться к одной переменной типа TComponent и спрашивать , какого она типа...



Страницы: 1 вся ветка

Текущий архив: 2010.09.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
10-1167983615
Ромка
2007-01-05 10:53
2010.09.19
Количество страниц в Excel


15-1277497794
Юрий
2010-06-26 00:29
2010.09.19
С днем рождения ! 26 июня 2010 суббота


15-1276720203
Юрий
2010-06-17 00:30
2010.09.19
С днем рождения ! 17 июня 2010 четверг


15-1277349628
ixen
2010-06-24 07:20
2010.09.19
Не запускается программа. В чем может быть причина?


15-1277661939
ewd
2010-06-27 22:05
2010.09.19
Посоветуйте, как назвать диплом