Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 23
1

Не могу достучаться до нужного типа в списке (TList)

26.09.2017, 14:18. Показов 425. Ответов 5
Метки нет (Все метки)

Доброго времени суток!

Ситуация следующая:
- есть несколько созданных типов class TPoint(TObject); class TLine(TPoint); class TCircle(TPoint);
- так же есть дженерик TList в который надо добавить ранее перечисленные классы
вот как это сделал я, но у меня возникла проблема с выбором типа, далее будет понятнее

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Создание формы
procedure TMainForm.FormCreate(Sender: TObject);
begin
  ObjList := TList<TPoint>.Create;
end;
 
// Процедура рисования точки
procedure TMainForm.DrawPoint;
var
  Point : TPoint;
begin
  Point := UPoint.TPoint.Create(CoordX0.Value, CoordY0.Value, ChangeColorBtn.Selected);
  ObjList.Add(Point);
  ObjList.Last.Draw(ICanvas.Canvas);
end;
 
// Процедура рисования линии
procedure TMainForm.DrawLine;
var
  Line : TLine;
begin
  Line := ULine.TLine.Create(CoordX0.Value, CoordY0.Value, CoordX1.Value, CoordY1.Value,ChangeColorBtn.Selected);
  ObjList.Add(Line);
  ObjList.Last.Draw(ICanvas.Canvas); // Вот тут как раз возникает проблема. Draw вызывается у типа TPoint, а нужен TLine
end;
 
 
// Вот на всякий обработчик события кнопки (это чтобы было понятно почему процедуры Draw* отдельно разбиты)
procedure TMainForm.DrawPointBtnClick(Sender: TObject);
begin
    case ChangeFigure.ItemIndex of
    0: DrawPoint;
    1: DrawLine;
    end;
end;


Вот проблемный код, с которым надо разобраться:
Delphi
1
2
3
4
5
6
7
8
9
// Процедура рисования линии
procedure TMainForm.DrawLine;
var
  Line : TLine;
begin
  Line := ULine.TLine.Create(CoordX0.Value, CoordY0.Value, CoordX1.Value, CoordY1.Value,ChangeColorBtn.Selected);
  ObjList.Add(Line);
  ObjList.Last.Draw(ICanvas.Canvas); // Вот тут как раз возникает проблема. Draw вызывается у типа TPoint, а нужен TLine
end;
Вообщем, нужно разобраться как выцепить тип TLine из списка... Я буду серфить интернет дальше, но надеюсь что тут тоже найдутся стоящие ответы.

PS: Преподаватель говорил что с помощью *.ClassType.ClassName можно решить эту проблему, но я пока не понял как...
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2017, 14:18
Ответы с готовыми решениями:

Как найти количество элементов в списке (Tlist), если переменная такого типа объявлена как private?
Друзья! Вот есть такой класс, не мой, я щас в нём ковыряюсь, он большой, я поубирал все ненужные на...

Список Tlist переменной типа real, как создать?
Имеется код программы: unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Нет нужного языка в списке.
(Delphi 7) Запускаю Project – Languages – Add далее жму Next. В списке языков нет украинского. В...

Поиск нужного элемента в односвязном списке
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; struct Node { int data; Node*...

5
4965 / 3868 / 1285
Регистрация: 14.04.2014
Сообщений: 17,833
Записей в блоге: 18
26.09.2017, 14:48 2
Зачем TList ??
TObjectList<TPoint> гораздо лучше

архитектура вообще неверная у вас

если вы держите список объектов, то и перерисовывать их нужно всем списком а не только последний
и не тогда, когда добавили, а всегда когда нужно перерисовать
а это совсем другой место

и рисование СЕБЯ компоненту - это дорога в АД
не должен он ничего знать о Canvas. Рисованием должен заниматься другой объект, который будет содержать тот самый ObjectList. Ведь у игрового поля может быть скролл, масштаб, всякие другие приколы. Графический объект не должен ничего знать об этом вообще.

Правильно будет вынести ваши объекты в отдельный юнит, чтобы они ничего не знали ни о форме ни о друг о друге.


То что у вас TLine.Draw не рисуется, скорее всего вы либо забыли поставить
Delphi
1
2
3
TPoint...
... Draw; virtual
end;
либо забыли
Delphi
1
2
3
TLine...
... Draw; override;
end;
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 23
26.09.2017, 15:29  [ТС] 3
Цитата Сообщение от krapotkin Посмотреть сообщение
Правильно будет вынести ваши объекты в отдельный юнит, чтобы они ничего не знали ни о форме ни о друг о друге.
Как же тот факт, что все элементы TLine, TCircle образованы от главного TPoint?

Цитата Сообщение от krapotkin Посмотреть сообщение
и рисование СЕБЯ компоненту - это дорога в АД...
Это пока не самый важный момент, главная задача это создание некой коллекции объектов.

Цитата Сообщение от krapotkin Посмотреть сообщение
архитектура вообще неверная у вас
Что это значит, могли бы объяснить?
0
4965 / 3868 / 1285
Регистрация: 14.04.2014
Сообщений: 17,833
Записей в блоге: 18
26.09.2017, 16:13 4
Надеюсь, они от какого-то вашего TPoint образованы? Надо бы его срочно переименовать, чтобы со стандартным TPoint не перепутывать

TObjectList<TXXX> отличается от TList<TXXX> приятными особенностями - может самостоятельно убивать объекты при удалении.

коллекцию объектов вы создали. я б только не TPoint а как-то типа TMyBaseObject назвал родителя. ну да не суть

архитектура это где какие данные хранятся, как обрабатываются и т.д.
вот вы делаете Object.Draw(Canvas)
а почему объект вообще должен знать что-то о графической системе ??
а если у вас поле 10000*10000 и 10000 объектов
а отображается в окне только 800*600
вы же захотите, чтобы объект не рисовал себя, если он "за экраном"
т.е. он еще и про окно и про экран должен знать?

налицо неправильная архитектура, когда все обо всех обязаны все знать. а должно быть четкое разделение.

ваш объект - это ID, Name, Crd, Colors и всё
вот объект игровое поле - это список объектов, размеры поля и масштаб,
контроллер поля - это сама форма например. вот у нее в методах будет рисование линий линиями, а кружков - кружками
при этом с учетом координат окна и объектов
0
0 / 0 / 0
Регистрация: 01.11.2016
Сообщений: 23
01.10.2017, 18:46  [ТС] 5
Вы конечно молодец, профессионально подметили мою не грамотность, как программиста. НО...

Задача заключается в создании коллекции своих объектов. А сама проблема является следующей...

Добавляя объект в TList<TPoint> я не могу использовать ф-ю Draw объекта другого типа, например если бы я в этот же TList<TPoint> добавил объект Line : TLine(TPoint);. То есть получается следующих код:
Delphi
1
ObjList.Add(ULine.TLine.Create(CoordX0.Value, CoordY0.Value, CoordX1.Value, CoordY1.Value, ChangeColorBtn.Selected));
После этого нужно вызвать ф-у Draw у объекта с типом TLine, НО поумолчанию используется ф-я Draw у типа TPoint
0
4965 / 3868 / 1285
Регистрация: 14.04.2014
Сообщений: 17,833
Записей в блоге: 18
01.10.2017, 22:55 6
ну, значит кто-то не объявил этот метод virtual
это никак не связано с TList или TObjectList
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2017, 22:55

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Не могу достучаться по SSH
подключаюсь по ssh до сервака, поднимаю там web-сервер на 3000й порт, с сервака через lynx запросы...

Не могу достучаться до считывателя
Купил считыватель, нужно его запрограммировать, никогда этого не делал и толком не знаю с чего...

Не могу достучаться до свойств объекта
Ребята помогите разобраться учусь создавать динамически объекты в отчёте FastReport и столкнулся...

Не могу достучаться до MPU-6000
Здравствуйте. Необходимо считать регистры данных акселерометра и гироскопа микросхемы MPU-6000 (по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.