Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация инструмента для отображения расстояния на финансовом графике с использованием Delphi и Pascal: как нарисовать линию и прямоугольник для точек данных.

Delphi , Графика и Игры , Графика

 

В этой статье мы рассмотрим, как реализовать инструмент для отображения расстояния на финансовом графике в Delphi, опираясь на обсуждение в форуме Lazarus/FreePascal. Задача состоит в том, чтобы расширить стандартный инструмент измерения расстояния (ChartToolset1DataPointDistanceTool) для отображения не только расстояния от начальной точки, но и прямоугольника, охватывающего начальную и конечную точки, с отображением процентного изменения цены (Y-ось) и времени (X-ось) на соответствующих сторонах прямоугольника.

Постановка задачи:

Изначально стандартный инструмент измерения расстояния в TChart показывает только линию, соединяющую начальную и конечную точки. Пользователь хочет расширить функциональность, добавив:

  • Прямоугольник, очерчивающий начальную и конечную точки.
  • Отображение процентного изменения цены на верхней стороне прямоугольника.
  • Отображение изменения времени на левой стороне прямоугольника.
  • Возможность отображения нескольких линий и прямоугольников.

Обсуждение и предложенные решения:

Обсуждение в форуме выявило несколько подходов к решению этой задачи.

  1. Использование стандартного инструмента Distance Tool: Первоначальная идея заключалась в использовании существующего инструмента Distance Tool и переопределении его поведения. Однако, это может быть сложнее, так как инструмент уже имеет определенную структуру и логику.

  2. Использование UserDefined Tool: Альтернативным подходом является создание собственного UserDefined Tool. Это дает больше гибкости в реализации нужной функциональности. В этом случае необходимо будет определить переменные для хранения начальной и конечной точки, а также реализовать логику обновления этих переменных при перетаскивании мыши.

  3. Рекомендации wp: wp предложил использовать UserDefined Tool и предоставил пример модифицированного демо-проекта "financial" в TAChart, где реализована отрисовка линии с аннотацией процентного изменения цены, а также отрисовка закрашенного прямоугольника с такой же аннотацией. Он также отметил возможность настройки DataPointModeStart и End для избежания привязки к точкам данных, а также использование свойств Marks или обработчика OnGetDistanceText для отображения текста на линии.

  4. Рекомендации Thaddy: Thaddy подчеркнул важность использования принципов "сэмплирования" (хотя chucky оспаривал это определение в контексте его задачи), то есть разделения логики сбора данных и логики отображения. Он предложил хранить данные в памяти и представлять их как текущую выборку, а не пытаться отображать данные в реальном времени.

Решение: UserDefined Tool с использованием принципов сэмплирования

Основываясь на обсуждении, наиболее подходящим решением является создание UserDefined Tool, реализующего следующие шаги:

  1. Определение переменных:

    • StartX, StartY: Координаты начальной точки.
    • EndX, EndY: Координаты конечной точки.
    • PriceChange: Изменение цены в процентах.
    • TimeChange: Изменение времени.
  2. Обработчик начала перетаскивания мыши (Mouse Drag):

    • Записать начальные координаты (StartX, StartY) в переменные хранения.
    • Начать отслеживать координаты мыши.
  3. Обработчик перемещения мыши (Mouse Move):

    • Обновить координаты конечной точки (EndX, EndY) на основе текущего положения мыши.
    • Вычислить PriceChange и TimeChange на основе StartY, EndY, StartX и EndX. (Формулы расчета зависят от структуры данных графика и используемой шкалы).
    • Перерисовать прямоугольник и линии с новыми координатами и значениями.
  4. Обработчик окончания перетаскивания мыши (Mouse Up):

    • Завершить отслеживание мыши.
    • Сохранить окончательные координаты и значения.

Пример кода Object Pascal (Delphi):

unit MyDistanceTool;

interface

uses
  Classes,
  SysUtils,
  Chart,
  Vcl.Controls,
  Vcl.Graphics;

type
  TMyDistanceTool = class(TChartTool)
  private
    StartX, StartY, EndX, EndY: Double;
    PriceChange, TimeChange: Double;
  protected
    procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Sender: TObject; X, Y: Integer; MouseButtons: TMouseButtons); override;
  public
    constructor Create(AChart: TChart); override;
  end;

implementation

uses
  Math;

constructor TMyDistanceTool.Create(AChart: TChart);
begin
  inherited Create(AChart);
  Name := 'MyDistanceTool';
end;

procedure TMyDistanceTool.MouseMove(Sender: TObject; X, Y: Integer; MouseButtons: TMouseButtons);
begin
  if MouseButtons = mbLeft and Chart.MouseButtons = mbLeft then
  begin
    EndX := X;
    EndY := Y;

    // Calculate Price Change and Time Change (replace with your actual formulas)
    PriceChange := (EndY - StartY) / StartY * 100;
    TimeChange := EndX - StartX;

    Chart.Repaint; // Force Chart to redraw
  end;
end;

procedure TMyDistanceTool.MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    EndX := X;
    EndY := Y;

    // Calculate Price Change and Time Change (replace with your actual formulas)
    PriceChange := (EndY - StartY) / StartY * 100;
    TimeChange := EndX - StartX;

    Chart.Repaint; // Force Chart to redraw
  end;
end;

end.

Альтернативные решения:

  • Использование событий Chart.OnMouseMove и Chart.OnMouseUp: Вместо переопределения MouseMove и MouseUp в классе TChartTool, можно использовать события Chart.OnMouseMove и Chart.OnMouseUp для обработки логики перетаскивания. Это может упростить код и сделать его более читаемым.
  • Использование графических примитивов: Для отрисовки прямоугольника и линий можно использовать графические примитивы Delphi, такие как Canvas.Rectangle и Canvas.Line. Это дает больше контроля над внешним видом графических элементов.

Заключение:

Создание UserDefined Tool является наиболее гибким подходом к реализации требуемой функциональности. Применяя принципы сэмплирования и используя графические примитивы Delphi, можно создать эффективный и наглядный инструмент для анализа финансовых данных на графике. Приведенный пример кода демонстрирует базовую структуру UserDefined Tool, которую можно адаптировать и расширить в соответствии с конкретными требованиями. Важно помнить о необходимости правильного расчета PriceChange и TimeChange на основе структуры данных графика и используемой шкалы.

Создано по материалам из источника по ссылке.

Context — это расширение стандартного инструмента измерения расстояния в TChart для отображения прямоугольника с процентным изменением цены и времени на финансовом графике.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Графика ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 16:11:28/0.0041229724884033/0