Witam,
Czy w Delphi 10.3 CE jest komponent do obsługi wykresów jak w starych wersjach Delphi (TeeChart)?
Pozdrawiam.
Według informacji
powinny być ale potwierdzić musi ktoś kto posiada CE.
Zgodnie z https://en.wikipedia.org/wiki/Teechart:
TeeChart has been included in most Delphi and C++Builder products since 1997[2], and TeeChart Standard currently is part of Embarcadero RAD Studio 10.4 Sydney
Sprawdziłem i w wersji 10.2 CE tego nie ma, natomiast o ile się nie mylę, to wersja CE nie różni się znacząco pod względem zawartości od wersji płatnej, główne różnice dotyczą możliwości komercyjnego wykorzystania.
Ok, jednak w 10.3 CE nie ma :/
http://docwiki.embarcadero.com/RADStudio/Rio/en/TeeChart
TeeChart is included with all RAD Studio versions except Starter;
Za mało szczegółów, żebym mógł cokolwiek doradzić.
Kontrolek TChart
nie miałem okazji używać, więc w razie czego napisz konkretnie z czym masz problem, a coś się doradzi.
Np. w X mam czas, a w Y wartości. Teraz wczytując z pliku chcę przybliżać wykres który z powodu np. rozdzielczości nie zmieściłby się na ekranie.
W tym przypadku widać też problem, jak zmieścić cały zakres na wykresie jeśli rozdzielczość danych jest większa od okna.
Mnożysz wartości przez zmiennoprzecinkową skalę, a następnie wyniku używasz do renderowania – nic trudnego.
Czyli najpierw pobierasz rozmiar obszaru dla wykresu i odejmujesz od tego stałe offsety (żeby punkty nie leżały na samym kraju obszaru), następnie wyznaczasz mnożnik(i) dzieląc szerokość/wysokość obszaru przez maksymalną dopuszczalną wartość dla punktu. W tym momencie masz małą liczbę zmiennoprzecinkową. Teraz czas na renderowanie. Po kolei bierzesz punkty z serii i mnożysz go przez ten wyliczony mnożnik – otrzymujesz współrzędną relatywną względem dostępnego obszaru, do której dodajesz offset i gotowe. I tak z każdym punktem, otrzymasz współrzędne Y
na wykresie.
Dla współrzędnych X
będzie podobnie, tyle że ów maksimum nie będzie maksymalną możliwą liczbą dla danego typu danych (lub dla typu liczb z serii do wyświetlenia), a po prostu ilością liczb mieszczących się w obszarze. Im więcej danych ma być widocznych, tym odległości między sąsiednimi punktami będą mniejsze. Tutaj też weź pod uwagę offsety, żeby pierwszy i ostatni punkt nie leżały na samych krajach obszaru.
Ewentualnie zamiast dodawania offsetów, najpierw pobierz rozmiar obszaru dla wykresu, a następnie zmniejsz go o te offsety. W ten sposób obliczenia będą krótsze, bo dotyczyć będą jedynie skalowania, czyli de facto samego mnożenia.
Dobrze by było wiedzieć jakie dane i w jaki sposób chcesz pokazać na wykresie. Jeśli np. masz serię liczb typu Integer
, mnożnik będzie bardzo mały, pokroju 0.000002843
, dla wartości typu UInt8
będzie pokroju 0.7982374876
, a jeśli obszar jest większy niż 255 pikseli, mnożnik będzie większy niż 1
.
W każdym razie to co opisałem wyżej pozwoli renderować dowolne wartości w dowolnie małym/dużym obszarze. W razie czego mogę przygotować małego PoC-a w Lazarusie, który zilustruje ww. obliczenia, tak żebyś dokładnie wiedział jak wygląda implementacja oraz dokładnie widział w oknie, jakie są rezultaty tych obliczeń. Coś prostego do zabawy, raczej w formie renderowania w PaintBox
– bo szybciej. A przeniesienie tego kodu do klasy kontrolki będzie banalne.