А почему по "логике паскаля" нельзя присвоить переменной тип ? Потому что операция "присвоить" подразумевает передачу данных, а что собственно передается в случае "присвоения типа" ?
Код: Выделить всё
CreateControl(TEdit, 'Edit1', 10, 10, 100, 20); Модератор: Модераторы
Код: Выделить всё
CreateControl(TEdit, 'Edit1', 10, 10, 100, 20); Нет например мне реально интересно можно-ли штатно "присвоить тип" и не вылезет ли где-то боком подобное "оригинальное творчество" .Seenkao писал(а):Тема: "когда коту заняться нечем"?
>>вообще статически описанную структуруAlex2013 писал(а):Хм ... Возможно вы правы, но как-то это странно (я такого "присвоения типа" еще нигде не видел ) .
А почему по "логике паскаля" нельзя присвоить переменной тип ? Потому что операция "присвоить" подразумевает передачу данных, а что собственно передается в случае "присвоения типа" ?Параметр "это другое" там дальше может быть обычное сравнение typeOf который "Возвращает указатель на VMT объекта". А вы пытаетесь "подменить" одну возможно вообще статически описанную структуру на другую.Код: Выделить всё
CreateControl(TEdit, 'Edit1', 10, 10, 100, 20);
Я думаю, что вы сами сможете ответить на этот вопросAlex2013 писал(а):Нет например мне реально интересно можно-ли штатно "присвоить тип" и не вылезет ли где-то боком подобное "оригинальное творчество" .Seenkao писал(а):Тема: "когда коту заняться нечем"?
Не понятно, в чем баг-то? Использовать TClass для создания экземпляра класса использующего делегацию, по сути, явная ошибка.Юрий писал(а): Я считаю что это бага в FP
так как вся суть и прелесть использования Типа_ссылки_на_класс теряется
Код: Выделить всё
type
TVList = class(TList)
public
contructor Create; virtual;
end;Код: Выделить всё
type
TVListClass = class of TVList;Код: Выделить всё
procedure AAA;
var
theClass: TVListClass;
L: TList;
begin
theClass := TVList;
L := theClass.Create;
try
ShowMessage(L.ClassName);
if L.Count = 0 then
L.Add(nil);
finally
L.Free;
end;
end;Не надо ничего никуда "приводить". Обычно такие действия приводят к ошибкамAlex2013 писал(а):1 Упс! Что за "AnObject is TObjectType" ?
2 Более менее понял, но как по мне проще и надежнее приводить уже созданный экземпляр к нужному базовому классу ( что работает отлично если они совместимы в цепочке наследования и имеют виртуальные методы) .
То есть L:= TList.Create; и если это где-то нужно theClass := TClass(L);
( или theClass := ( TList.Create As TClass ); ) Да где-то возможно придется проверить TypeОf но обычно это не проблема (+ (ИМХО) все явно и не проблемы "с неприсвоенным типом" и т.п. ).
И более того приведение типов в отличии от "присвоения типа" работает "в обе стороны цепочки наследования" (Разумеется, в этом случае нужно быть уверенным, что "хитроумно вызываемый метод" может обратится к реально существующим данным, но это точно работает ).

Код: Выделить всё
Var E:TWinControlEnumerator;
begin
E:=GetEnumeratorControls;
while e.MoveNext do
begin
if TypeOf(e.Current) = TypeOf(Panel1) then TPanel(e.Current).Hide;
end
end;
Код: Выделить всё
if TypeOf(e.Current) = TypeOf(Panel1) then TPanel(e.Current).Hide;Код: Выделить всё
if e.Current.ClassType = Panel1.ClassType then TPanel(e.Current).Hide;Код: Выделить всё
if e.Current is TPanel then TPanel(e.Current).Hide;Можно я поправлю "Главное, то что это фрагмент иногда работает"Alex2013 писал(а):Главное, то что это фрагмент работает !
Сила не в красоте, а в правоте )))Alex2013 писал(а):С "is" разумеется красивее ( но лучше ли это?).
Не встречается (хотя охотно верю, что когда-то мог и быть, но нынче LCL не такая падучая стала...)Alex2013 писал(а):похожий код встречается в LCL ( и не только) и довольно часто
Лично я не представляю, что там может "не сработать".wavebvg писал(а):Можно я поправлю "Главное, то что это фрагмент иногда работает"