Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Спасите. Едет крыша!!! TCollection / 10 сообщений из 10, страница 1 из 1
15.11.2005, 17:14
    #33379749
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
Пишу свой компонент. Получилось вот что:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class TTask : public TOwnedCollection
{
protected:
        TTaskItem* __fastcall GetItem(int index);
        void __fastcall SetItem(int Index, TTaskItem* Value);
public:
        TTask(TComponent* AOwner);

        TTaskItem* __fastcall Add(void);
        TTaskItem* __fastcall FindItemID(int Index);
        TTaskItem* __fastcall Insert(int Index);
__published:
        __property TTaskItem* Items[int Index]={read=GetItem, write=SetItem};
};

сам код

Код: plaintext
1.
2.
3.
4.
TTaskItem* __fastcall TTask::GetItem(int Index)
{
    return static_cast<TTaskItem*>(TOwnedCollection::Items[Index]);
}

Что здесь неправильно??? Почему когда я кидаю компонент на форму выдается матюк

list index out of bounds (-2147483648)

и как с ним бороться?
...
Рейтинг: 0 / 0
15.11.2005, 18:05
    #33379886
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
дед Макар
Код: plaintext
1.
2.
3.
4.
TTaskItem* __fastcall TTask::GetItem(int Index)
{
    return static_cast<TTaskItem*>(TOwnedCollection::Items[Index]);
}


проверяй в функции индекс на границы, поставь dynamic_cast проверяй на ноль результат.

потом еще раз доложишь результат
...
Рейтинг: 0 / 0
15.11.2005, 18:38
    #33379950
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
если Index вышел за границы - то что мне вернуть?
...
Рейтинг: 0 / 0
15.11.2005, 18:42
    #33379959
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
Исключение
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
15.11.2005, 18:43
    #33379964
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
Карабас БарабасИсключение

так у меня ошибка в designed-time
...
Рейтинг: 0 / 0
15.11.2005, 19:35
    #33380047
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
икспшены можно и не кидать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
TTaskItem* __fastcall TTask::GetItem(int Index)
{
    if( Index <=  0  || Index > TOwnedCollection::Items->Count )
    {  
        return NULL;
    }
    TTaskItem *result = dynamic_cast<TTaskItem*>(TOwnedCollection::Items[Index]);
    return ( result ? result : NULL );
}
...
Рейтинг: 0 / 0
16.11.2005, 10:42
    #33380698
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
работает вот так. Спасибо за помощь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
TTaskItem* __fastcall TTask::GetItem(int Index)
{
 if( Index <  0  || Index > TOwnedCollection::Count )
    {  
        return NULL;
    }
    TTaskItem *result = dynamic_cast<TTaskItem*>(TOwnedCollection::Items[Index]);
    return ( result ? result : NULL );
}
...
Рейтинг: 0 / 0
16.11.2005, 10:48
    #33380711
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
и еще вопрос в целях самообразования: чем dynamic_cast отличается от static_cast?
...
Рейтинг: 0 / 0
16.11.2005, 17:23
    #33382247
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
дед Макари еще вопрос в целях самообразования: чем dynamic_cast отличается от static_cast?


авторdynamic_cast Used for conversion of polymorphic types.
static_cast Used for conversion of nonpolymorphic types.
const_cast Used to remove the const, volatile, and __unaligned attributes.
reinterpret_cast Used for simple reinterpretation of bits.

иными словами dynamic_cast ищет подходящий безопасный тип.

а const_cast только для выражений типа :

Код: plaintext
1.
const char *pp = "text";
char *p = const_cast<char *>pp;  

В VC8 уже просто так, без кастинга не присвоишь - ошибка
...
Рейтинг: 0 / 0
17.11.2005, 12:03
    #33383651
дед Макар
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Спасите. Едет крыша!!! TCollection
и еще туда же. Есть у меня конструктор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
__fastcall TTaskItem::TTaskItem(TCollection* AOwner)
        :TCollectionItem(AOwner)
{
 Timer = new TTimer();
 Timer->Enabled = false;
 FInterval =  1000 ;
 FActive = false;
 FTime = TimeToStr(Now());
 Timer->OnTimer = runTimer;
 Timer->Interval = FInterval;
}

Как передать в конструктор Timer = new TTimer(); ссылку на TComponent который требуется по описанию
__fastcall virtual TTimer(Classes::TComponent* AOwner);
?

Код: plaintext
1.
2.
3.
4.
5.
6.
Вот мой основной класс компонента
__fastcall TTrack::TTrack(TComponent* Owner)
    : TComponent(Owner)
{
  FTask = new TTask(this);
}
.............

В этом классе уже используется TTaskItem
Код: plaintext
1.
2.
3.
4.
TTask::TTask(TComponent* AOwner)
        :TOwnedCollection(AOwner, __classid(TTaskItem))
{
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Спасите. Едет крыша!!! TCollection / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]