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

Вниз

Переменная содержащая тип   Найти похожие ветки 

 
dust ©   (2005-12-29 12:11) [0]

Хочу передавать в конструктор тип.
Если точнее -
Result := typed(ptmp^); где typed - член класса

Существуют ли вообще в делфи переменные, которые могут хранить тип?
Может быть существует другой подход к этому вопросу?


 
Игорь Шевченко ©   (2005-12-29 12:15) [1]

Переменные существуют, но непонятно, чего ты хочешь. Подробности давай.


 
Digitman ©   (2005-12-29 12:15) [2]


> Result := typed(ptmp^); где typed - член класса


если typed - это действительно идентификатор некоего члена некоего класса, то такой код компилятор просто обязан отправить фтопку.

в противном случае typed у тебя есть идентификатор некоего типа, но никак не идентификатор члена класса.


 
Rouse_ ©   (2005-12-29 12:19) [3]

Ну к примеру вот так:

 TGSBookmarkItem = class(TCollectionItem);

 TGSBookmarkCollection = class(TOwnedCollection)
 public
   constructor Create(AOwner: TPersistent);
 end;

 TGSBookmarkList = class(TCustomControl)
 private
   FItems: TGSBookmarkCollection;
 protected
   function GetItemsClass: TCollectionItemClass; virtual;
 end;

implementation

constructor TGSBookmarkCollection.Create(AOwner: TPersistent);
begin
 inherited Create(AOwner, TGSBookmarkList(AOwner).GetItemsClass);
end;

function TGSBookmarkList.GetItemsClass: TCollectionItemClass;
begin
 Result := TGSBookmarkItem;
end;


 
Anatoly Podgoretsky ©   (2005-12-29 12:21) [4]

dust ©   (29.12.05 12:11)  
Тоже самое, но по русски


 
dust ©   (2005-12-29 12:29) [5]

Собственно я пишу контейнер, у которого есть методы GetCurrent(),      procedure Append   (const item);      procedure AddFirst (const item);
так вот, я хочу, чтобы  можно было написать:
Variable := Conteiner.GetCurrent();

но, существует одно "но " я не знаю как кого типа элементы будут в контейнере, а каждый раз приводить к AnyType не хочется
Variable := AnyType(Conteiner.GetCurrent());


 
Digitman ©   (2005-12-29 12:30) [6]

ну а причем здесь "поле класса" ?


 
DesWind ©   (2005-12-29 12:30) [7]


type
TTGSBookmarkItemClass = class of TGSBookmarkItem;


 
dust ©   (2005-12-29 12:44) [8]

т.е. вы предлагаете, перед использованием контейнера задавать ему тип объектов - не годится, потому как один и тот же контейнер (класс контейнера) я собираюсь использвать для различных обектов в одном модуле


 
dust ©   (2005-12-29 12:45) [9]

а объявить функцию, которая будет возвращать неопределённый тип можно?


 
Rouse_ ©   (2005-12-29 12:47) [10]


> а объявить функцию, которая будет возвращать неопределённый
> тип можно?

Нет, базовый класс должен быть обьявлен... Передавать можно производные от него.


 
Игорь Шевченко ©   (2005-12-29 12:54) [11]


> а объявить функцию, которая будет возвращать неопределённый
> тип можно?


TObject - чем плохо


 
Digitman ©   (2005-12-29 12:54) [12]

см. TObject.ClassType


 
evvcom ©   (2005-12-29 16:05) [13]


> которая будет возвращать неопределённый тип можно?

Нельзя. Функция не умеет возвращать типы вообще, она может возвращать только значения. Вот значение может быть неопределенного типа. Обычно в этом случае функция возвращает просто указатель на переменную неопределенного типа, т.е.
function MyFunction: Pointer;


 
Tesla   (2005-12-29 16:31) [14]

Что-то мне говорит о том, что автору поста нужен аналог С-шных шаблонов...


 
tesseract ©   (2005-12-29 22:38) [15]


> а объявить функцию, которая будет возвращать неопределённый  тип можно?


Можно. Как и в процедуре, через ссылку.

function returnsmth(var untypedvar):integer

Передача untypedvar идёт по ссылке, Используй его в качестве result.

Можно также выяснить класс объекта (спасибо RTTI)


if untypedvar is TmyClass then {}


 
evvcom ©   (2005-12-30 09:46) [16]


> Можно. Как и в процедуре, через ссылку.

Вообще-то фраза "функцию, которая будет возвращать" подразумевает под собой возврат значения именно как результат функции, т.е. как Result := Value;
Еще раз повторю, что даже в этом случае в переменной var untypedvar возвращается не тип, а значение неопределенного типа. Это разные понятия.

> Можно также выяснить класс объекта

Можно, если передан действительно объект, что совсем необязательно.


 
tesseract ©   (2005-12-30 10:05) [17]

Надо заниматься полиморфизмом. Число возможных данных  не может быть   бесконечным.

Да и чем тебе Tlist/TObjectList не нравятся?


> Можно, если передан действительно объект, что совсем необязательно.


Вроде dust про объекты и говорит.


 
evvcom ©   (2005-12-30 10:42) [18]


> Вроде dust про объекты и говорит.

Да, вроде действительно. Тогда тип TObject и нефиг нам парить мозги.



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

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

Наверх




Память: 0.51 MB
Время: 0.035 c
1-1135780482
MakNik
2005-12-28 17:34
2006.02.05
уменьшить размер ехе-файла, ... путем деления...


1-1136319103
Yozch1
2006-01-03 23:11
2006.02.05
Application data


4-1132933783
badevlad
2005-11-25 18:49
2006.02.05
Получить путь к файлу по его Handle


15-1137001120
guitarist
2006-01-11 20:38
2006.02.05
Книги по WinApi


3-1133462062
Сергей А.
2005-12-01 21:34
2006.02.05
Как поймать ошибку при загрузке данных из таблицы?