Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 525

/ вопрос решён /

Здравствуйте, эксперты!

Дано N объектов имеющие:
1) Координты
2) Графическое отображение (Кружок)
Так же имеется PaintBox в котором, с учётом координат, эти объекты нужно нарисовать.

Моё решение: внутри объекта создать отрисовку и потом переносить её в PaintBox, дабы более оптимизировать читаемость кода программы, которая с точками работает и не особо затрагивать то каким макаром они рисуются.

Проблема: не могу врубиться как это реализовать качественно, ну или хоть как нибудь.

Так же приму другой вариант решения если мой показался вам глупым.

На рисунке кривенький вариант как это должно выглядеть. Результат получен без использования ООП и код сего чуда выглядит ужасно, даже прилагать не буду, и даже страшно добавлять сюда какие то сложные функции вроде перетаскивания конкретной точки без ООП.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

ierihon1 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 15 марта 2014, 20:15
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Здравствуйте, ierihon1!

Цитата (ierihon1):

Моё решение: внутри объекта создать отрисовку и потом переносить её в PaintBox, дабы более оптимизировать читаемость кода программы, которая с точками работает и не особо затрагивать то каким макаром они рисуются.

Это, ИМХО, правильный выбор, я и сам так делаю.
В двух словах - пишешь общего предка с виртуальным методом
type
  TCustomFigure = class
  private
    // поля и вспомогательные внутренние методы, например
    FLineWidth: Integer;
    FLineColor: TColor;
    FBackground: TColor;
    // и т.д.
  protected
    procedure Draw(ACanvas: TCanvas); virtual; { abstract; - если нужно }
  public
    constructor Create;
    destructor Destroy; override;
 
    // свойста
    property LineWidth: Integer read FLineWidth write FLineWidth;
    property LineColor: TColor read ... write ...;
    property Background: TColor ......; // и т.д.
 
    // события. ...
  end;
и общими для всех потомков методами/свойствами/событиями. Пишешь от предка наследников, в каждом перекрываешь (override) методв Draw(). Для отрисовки кучи объектов хранить их удобно в списке типа TObjectList и в TPaintBox.OnPaint вызывать в цикле отрисовку каждого объекта.
Вот как-то так.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 15 марта 2014, 21:43
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 15 марта 2014, 21:31; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 15 марта 2014, 20:34 [#1]:

Цитата (ierihon1):

Моё решение: внутри объекта создать отрисовку и потом переносить её в PaintBox, дабы более оптимизировать читаемость кода программы, которая с точками работает и не особо затрагивать то каким макаром они рисуются.

Это, ИМХО, правильный выбор, я и сам так делаю.
В двух словах - пишешь общего предка с виртуальным методом
type
  TCustomFigure = class
  private
    // поля и вспомогательные внутренние методы, например
    FLineWidth: Integer;
    FLineColor: TColor;
    FBackground: TColor;
    // и т.д.
  protected
    procedure Draw(ACanvas: TCanvas); virtual; { abstract; - если нужно }
  public
    constructor Create;
    destructor Destroy; override;
 
    // свойста
    property LineWidth: Integer read FLineWidth write FLineWidth;
    property LineColor: TColor read ... write ...;
    property Background: TColor ......; // и т.д.
 
    // события. ...
  end;
и общими для всех потомков методами/свойствами/событиями. Пишешь от предка наследников, в каждом перекрываешь (override) методв Draw(). Для отрисовки кучи объектов хранить их удобно в списке типа TObjectList и в TPaintBox.OnPaint вызывать в цикле отрисовку каждого объекта.
Вот как-то так.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 15 марта 2014, 20:47 [#2]:

Немного не понимаю что у нас будет в самой процедуре Draw, в неё мы передаём канву TPaintBox'a?

PS Ох чую глупость сморозил:-)
min@y™

min@y™ (статус: Доктор наук), 15 марта 2014, 20:55 [#3]:

Цитата (ierihon1):

Немного не понимаю что у нас будет в самой процедуре Draw, в неё мы передаём канву TPaintBox'a?


Да, именно так. Получается просто универсальный подход, класс(ы) для рисования на любом Canvas, хоть на PaintBox, хоть на Bitmap, да на чём угодно, имеющем свойство Canvas: TCanvas (формы, кнопки, ячейки таблиц, TJpegImage, TPNGObject и пр.). Получается просто независимый код, который хранится в отдельном модуле, который можно спокойно копировать из проекта в проект и бед не знать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 15 марта 2014, 21:20 [#4]:

Теперь встал на том как мне вызвать отрисовку если сама процедура застряла в Protected.
Чувствую что где то я что то недочитал.

PS вытащив процедуру в Public получил то что хотел, но кажется что этого делать нельзя.
min@y™

min@y™ (статус: Доктор наук), 15 марта 2014, 21:29 [#5]:

Цитата (ierihon1):

Теперь встал на том как мне вызвать отрисовку если сама процедура застряла в Protected. Чувствую что где то я что то недочитал.

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

В protected метод будет висеть только у общего предка. У потомков он будет уже в public.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
ierihon1

ierihon1 (статус: 1-ый класс), 15 марта 2014, 21:31 [#6]:

Вот теперь всё понял:-) Огромное спасибо!
Первое сообщение наверно можно оформить как ответ.

16 марта 2014, 00:24: Статус вопроса изменён на решённый (изменил автор вопроса — ierihon1)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 февраля 2018, 06:27
Выполнено за 0.04 сек.
Рейтинг@Mail.ru