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

Вниз

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

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

Наверх




Память: 0.46 MB
Время: 0.038 c
2-1181809938
Ega23
2007-06-14 12:32
2007.07.08
От какого базового класса надо унаследоваться


5-1156231502
nali
2006-08-22 11:25
2007.07.08
Сохранение и загрузка свойства в файл в рантайме


5-1157026701
bvz
2006-08-31 16:18
2007.07.08
Как обращаться к произвольным свойствам компонента?


2-1181710818
Layner
2007-06-13 09:00
2007.07.08
Ошибка в работе с DBChart (TeeChart 4.04)


6-1159720721
_Anwy_
2006-10-01 20:38
2007.07.08
Авторизация на сайте с помощью IdHTTP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский