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

Вниз

Проверить тип указателя   Найти похожие ветки 

 
Strate ©   (2007-06-15 13:03) [0]

Здравствуйте. Подскажите с таким вопросом: при заполнении ListView в свойство Data каждого ListItem"a я прописываю ссылки на экземпляры классов. Причём классы разные. Как мне потом проверить какой тип класса прописан в этом свойстве?

If (Item.Data IS TMyClass) не проходит даже компиляцию

If (TMyClass(Item.Data) IS TMyClass) работает неправильно.

Как сделать?


 
Johnmen ©   (2007-06-15 13:06) [1]

Никак. Там лежит нетипизированный указатель.


 
sniknik ©   (2007-06-15 13:14) [2]

попробуй приведи к базовому классу TObject или TComponent, типа TObject (Item.Data) is TMyClass
(в событиях где Sender: TObject то такая проверка срабатывает... а не получится, проверяй(/сравнивай) с ClassName обьекта (если уверен что все там обьекты) после приведения.


 
Плохиш ©   (2007-06-15 13:15) [3]


procedure TForm1.FormShow(Sender: TObject);
var
   test: Pointer;
begin
 ShowMessage(self.ClassName);
 test := self;
 ShowMessage(TObject(test).ClassName + " - " + BoolToStr(TObject(test) is TForm1, true));
end;


 
Плохиш ©   (2007-06-15 13:16) [4]


> sniknik ©   (15.06.07 13:14) [2]

:-P


 
Strate ©   (2007-06-15 13:16) [5]

Johnmen ©   (15.06.07 13:06) [1]
Блин, жалко :(

Тогда следом такой вопрос: можно ли корректно написать наследника от TListItem, добавить в него пару полей и заполнить им TListView?

Я попробовал вот так:

TExListItem = class(TListItem)
public
 Field1 : Integer;
 Field2 : TMyClass1;
 Field3 : TMyClass2;
end;


Заполняю примерно так:

var
 NewListItem : TExListItem;
begin
 NewListItem := TExListItem.Create(ListView.Items);
end;


но при последующем обращении к NewListItem.SubItems выскакивает AccesViolation. В чём может быть проблема?


 
Сергей М. ©   (2007-06-15 13:16) [6]

try
 ShowMessage("Это объект класса " + TObject(Item.Data).ClassName);
except
 ShowMessage("Это черт те что и сбоку бантик, но только не объект-наследник класса TObject";
end;


 
Strate ©   (2007-06-15 13:23) [7]

sniknik ©   (15.06.07 13:14) [2]
Плохиш ©   (15.06.07 13:15) [3]

Спасибо, всё работает :)

И вопрос про наследника снимается :)


 
Anatoly Podgoretsky ©   (2007-06-15 13:32) [8]

> Strate  (15.06.2007 13:23:07)  [7]

Только в случае когда это действительно наследник от TObject


 
jack128 ©   (2007-06-15 16:09) [9]

Strate ©   (15.06.07 13:03)
If (TMyClass(Item.Data) IS TMyClass) работает неправильно.

этот код эквивалентен if Assigned(Item.Data)
Ты же явно указываешь компилятору, что в Item.Data лежит экземпляр TMyClass, вот он и не генерирует код по проверке типа...



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

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

Наверх




Память: 0.48 MB
Время: 0.02 c
15-1181030250
_uw_
2007-06-05 11:57
2007.07.08
Я сделал открытие!


15-1181470440
Kostafey
2007-06-10 14:14
2007.07.08
С днем рождения ! 10 июня


11-1164721449
KingMidas
2006-11-28 16:44
2007.07.08
Неправильная отрисовка прозрачности в KOLPng


2-1181931418
nord489
2007-06-15 22:16
2007.07.08
Выделение записи в DBGrid


2-1181835730
SerMaxx
2007-06-14 19:42
2007.07.08
Работа с Exel из Delphi