Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
15-1277370419
partizan
2010-06-24 13:06
2010.09.19
Открыть веб-страницу


2-1277215414
SIV500
2010-06-22 18:03
2010.09.19
Отослать сообщение окну...


15-1273815284
xayam
2010-05-14 09:34
2010.09.19
Лучшие из лучших


2-1277704401
И. Павел
2010-06-28 09:53
2010.09.19
Общий обработчик ошибок, завершающий программу.


15-1276971762
sniknik
2010-06-19 22:22
2010.09.19
Перехват ссылки в TWebBrowser.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский