Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тип как массив компонентов заданного типа


Страницы:   1 2

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?

увы и ах


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо