Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

TChart, как отследить координату начала горизонтальной оси при панорамировании

11.06.2018, 21:02. Показов 2569. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

При разрешённом режиме
C++
1
AllowPanning = pmHorizontal
мы можем двигать картинку удерживая правую кнопку мыши.
Как при этом отследить с какого значения в каждый момент времени будет начинаться горизонтальная нижняя ось.
Это нужно для попытки ограничить горизонтальное панорамирование как влево, так и вправо.
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Chart1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
    if(Shift.Contains(ssRight))
    {
        Label1->Caption = IntToStr((int)Chart1->BottomAxis->Minimum);
        // Вместо (int)Chart1->BottomAxis->Minimum нужно подставить что-то другое
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2018, 21:02
Ответы с готовыми решениями:

Смещение горизонтальной оси TChart
Подскажите пожалуйста как сделать , чтобы горизонтальная ось была по центру TChart , а не внизу как обычно .

TChart фиксированный шаг сетки для горизонтальной оси
Добрый день! Подскажите, пожалуйста, как сделать фиксированным шаг сетки для горизонтальной оси в компоненте TChart, чтобы ось...

TChart, горизонтальная линия сетки рисуется поверх горизонтальной оси
Всем здравствуйте. Если ось Y начинается от нуля то на нижней оси видна пунктирная линия сетки. Это справедливо и для правой и для...

8
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
11.06.2018, 21:27
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
для попытки ограничить горизонтальное панорамирование как влево, так и вправо
Тогда почему ты это делаешь в OnMouseMove, а не в специально для подобного придуманном OnAllowScroll?

Добавлено через 5 минут
Скажем:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Chart1AllowScroll(TChartAxis *Sender, double &AMin, double &AMax,
          bool &AllowScroll)
{
    if (Sender = Chart1->BottomAxis)
    {
        Label1->Caption = String().sprintf(L"min=%s, max=%s",
          AMin, AMax, DateTimeToStr(Chart1->BottomAxis->Minimum),
                      DateTimeToStr(Chart1->BottomAxis->Maximum));
    }
}
, и ты сразу увидишь, где ось в данный момент начинается, и где заканчивается. А чтобы остановить паннинг - просто выставь AllowScroll в false.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
11.06.2018, 22:15  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
а не в специально для подобного придуманном OnAllowScroll
я догадывался что нечто подобное должно существовать, но конкретно узнал только от Вас.
Если не затруднит, для Builder6 пожалуйста. Ругается на
[C++ Error] Unit1.cpp(296): E2034 Cannot convert 'wchar_t *' to 'const char *'
[C++ Error] Unit1.cpp(296): E2342 Type mismatch in parameter 'format' (wanted 'const char *', got 'wchar_t *')

Добавлено через 8 минут
Спасибо. Проблема решена.

Добавлено через 4 минуты
volvo, и где бы обо всём этом, я имею в виду TChart и его возможности, почитать на русском?
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.06.2018, 10:56  [ТС]
volvo, перетащил график вправо до обозначенной
C++
1
 (AllowScroll = false;)
границы. Ну хорошо, вправо нельзя, а влево то можно.
Так не идёт же картинка влево!?
C++
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
UINT SecondsFromZeroHours(TDateTime tm)     // Время в секундах от ноля часов текущих суток
{
    USHORT hour, min, sec, msec;
    tm.DecodeTime(&hour, &min, &sec, &msec);
    return sec + min*60 + hour*3600;
}
void __fastcall TForm1::Chart1AllowScroll(TChartAxis *Sender, double &AMin,
      double &AMax, bool &AllowScroll)
{
    UINT    mLeft, mRight;  // Границы отображаемого интервала времени (изменяющиеся значения по оси времени)
    double  mTop, mBottom;  // Границы отображаемого интервала параметров (изменяющиеся значения по оси параметров)
    mRight = SecondsFromZeroHours(Chart1->BottomAxis->Maximum);
    mLeft = SecondsFromZeroHours(Chart1->BottomAxis->Minimum);
    mTop = Chart1->LeftAxis->Maximum;
    mBottom = Chart1->LeftAxis->Minimum;
    Label4->Caption = "Левая граница шкалы времени = " + TimeToStr(Chart1->BottomAxis->Minimum) + " и в секундах: " + IntToStr(mLeft);
    Label5->Caption = "Правая граница шкалы времени = " + TimeToStr(Chart1->BottomAxis->Maximum) + " и в секундах: " + IntToStr(mRight);
    Label6->Caption = "Верхняя граница шкалы параметров = " + FormatFloat("0.0", mTop);
    Label7->Caption = "Нижняя граница шкалы параметров = " + FormatFloat("0.0", mBottom);
    if (Sender == Chart1->BottomAxis)
    {
        if(mRight >= 79200)
        {
            AllowScroll = false;
        }
        else
        {
            AllowScroll = true;
        }
    }
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
13.06.2018, 12:29
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void __fastcall TForm1::Chart1AllowScroll(TChartAxis *Sender, double &AMin, double &AMax,
          bool &AllowScroll)
{
    if (Sender = Chart1->BottomAxis)
    {
        AllowScroll = false;
        if (Sender->Minimum >= Today())
        {
            if(Sender->Maximum <= IncHour(Today(), 30))
            {
                AllowScroll = true;
            }
            else
            {
                Sender->SetMinMax(IncHour(Today(), 6), IncHour(Today(), 30));
            }
        }
        else
        {
            Sender->SetMinMax(Today(), IncHour(Today(), 24));
        }
    }
}
, и панорамирование ограничено слева началом сегодняшнего дня (полночь), а справа +30 часов от начала сегодняшнего дня, то есть, завтра, 6 утра... И двигается в обе стороны, что характерно
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
13.06.2018, 13:54  [ТС]
не понял, что же всё-таки я не так делал . Огромное спасибо
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
13.06.2018, 14:40
Цитата Сообщение от jkrnd Посмотреть сообщение
что же всё-таки я не так делал
Не выставлял Min/Max для оси так, чтобы в следующий раз сразу же не сработала ветка, которая приводит к AllowScroll = false. А я выставил.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
14.06.2018, 13:40  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
if (Sender = Chart1->BottomAxis)
как объяснить эту хитрость, ведь напрашивается
C++
1
if (Sender == Chart1->BottomAxis)
но это вызывает неприятное моргание пограничных значений шкалы времени.
Ещё вопрос: как избежать предупреждения [C++ Warning] Unit1.cpp(334): W8060 Possibly incorrect assignment
возникающего при использовании варианта
C++
1
if (Sender = Chart1->BottomAxis)
Добавлено через 49 минут
может быть лучше без if? Просто:
C++
1
Sender = Chart1->BottomAxis;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
14.06.2018, 14:16
Цитата Сообщение от jkrnd Посмотреть сообщение
как объяснить эту хитрость
Никак не надо ее объяснять, это опечатка. Я все-таки с Паскаля пришел. Так что там однозначно должен быть "==".

А по поводу
Цитата Сообщение от jkrnd Посмотреть сообщение
это вызывает неприятное моргание пограничных значений шкалы времени
- попробуй-ка вот этот код:
C++
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
void __fastcall TForm1::Chart1AllowScroll(TChartAxis *Sender, double &AMin, double &AMax,
          bool &AllowScroll)
{
    if (Sender == Chart1->BottomAxis)
    {
        AllowScroll = (AMin >= Today()) && (AMax <= IncHour(Today(), 30));
        /*
 
        AllowScroll = false;
        if (Sender->Minimum >= Today())
        {
            if(Sender->Maximum <= IncHour(Today(), 30))
            {
                AllowScroll = true;
            }
            else
            {
                Sender->SetMinMax(IncHour(Today(), 6), IncHour(Today(), 30));
            }
        }
        else
        {
            Sender->SetMinMax(Today(), IncHour(Today(), 24));
        }
        */
    }
}
, он в принципе, должен делать то же самое, только без мерцания и без предупреждений компилятора.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.06.2018, 14:16
Помогаю со студенческими работами здесь

Tchart, как получить координату курсора по tchart?
На график наведен курсор, Tchart позволяет получить координату куда указывает курсор? с точностью все понятно, от разрешения зависит

Как изменить положение горизонтальной оси на диаграмме в Excel?
Здравствуйте! Мне нужно, чтобы горизонтальная ось на диаграмме была не на уровне (0,0), а на уровне другого значения вертикальной оси....

Как изменить шкалу горизонтальной оси графика в Экселе
Добрый день! Проблема в том, что не могу изменить шкалу горизонтальной оси. Эксель 2003. Помогите пожалуйста. Как надо. ...

Как осуществить зеркальное отражение фигуры относительно заданной горизонтальной оси?
Фигура задана в локальных координатах, в глобальные выносится посредством матричного умножения на матрицы масштабирования, поворота, сдвига...

Как в css выставить изображение по центру окна браузера вдоль горизонтальной оси?
Добрый день! Как в css выставить изображение по центру окна браузера вдоль горизонтальной оси?


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru