Главная страница
    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.47 MB
Время: 0.04 c
2-1181973389
Kolan
2007-06-16 09:56
2007.07.08
Сообщение TStringGrid что закончили редактировать ячейку, есть?


15-1181293492
REA
2007-06-08 13:04
2007.07.08
type string


2-1181292068
allucard
2007-06-08 12:41
2007.07.08
Событие сворачивания и закрытия окна


3-1176199696
roughneck
2007-04-10 14:08
2007.07.08
Выборка из разных баз Interbase


15-1181200151
cosinus
2007-06-07 11:09
2007.07.08
Помогите с ошибкой в 2003...





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