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

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


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

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

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

Код: 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
Спасите. Едет крыша!!! TCollection
    #33380698
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работает вот так. Спасибо за помощь

Код: 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
Спасите. Едет крыша!!! TCollection
    #33380711
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще вопрос в целях самообразования: чем dynamic_cast отличается от static_cast?
...
Рейтинг: 0 / 0
Спасите. Едет крыша!!! TCollection
    #33382247
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дед Макари еще вопрос в целях самообразования: чем 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
Спасите. Едет крыша!!! TCollection
    #33383651
дед Макар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще туда же. Есть у меня конструктор
Код: 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
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Спасите. Едет крыша!!! TCollection
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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