logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[delphi 7] Jak narysować dynamicznie zmieniający się wykres?

mruczek 21 Lis 2008 20:09 4462 7
REKLAMA
  • #1 5766874
    mruczek
    Poziom 11  
    Posty: 130
    Pomógł: 3
    Ocena: 11
    Napisałem sobie malutki programik do odbierania danych z wagi przez COM przy użyciu komponentu ComPort. Odbierane dane są pokazywane w Memo - każda odebrana wartość w nowej linii, jednocześnie w drugim Memo zapisywany jest czas w formacie (godziny:minuty:sekundy:milisekundy).
    Zastanawiam się, jak narysować wykres - czyli y (wartość z wagi) i x (czas).
    Wykres powinien przesuwać się na żywo, automatycznie zmieniać wielkość y, po zastopowaniu odbioru danych mieć możliwość zoomowania i scrollowania x,y.
  • REKLAMA
  • REKLAMA
  • #3 5768508
    mruczek
    Poziom 11  
    Posty: 130
    Pomógł: 3
    Ocena: 11
    w wersji 7 personal nie ma komponentu TChart
  • #4 5773555
    mruczek
    Poziom 11  
    Posty: 130
    Pomógł: 3
    Ocena: 11
    Wiem już odrobinkę więcej:
    -można użyć komponentu ChartFX (wersja 2.0)
    -po wrzuceniu komponentu na formę i rozciągnięciu okienka widać przykładowy wykres
    -jak kliknę prawym przyciskiem myszy i w menu wybiorę Właściwości wykresu widać sporo opcji,ale nie wiadomo czemu u mnie po ręcznym ustawieniu wykresu w kodzie-jeśli to włączę-wykresu już nie zobaczę-widzę co prawda pojawiające się dane w tabelce,ale przełączanie na tryb grafczny nic nie daje
    -ważną sprawą jest zmiana nazwy komponentu z Chartfx na Chart (inaczej przy próbie zastosowania przykładów z helpa wywala błąd)
    -opis opcji komponentu jest w katalogu Borlanda w pliku CFX2OCX.HLP

    Może ktoś zna jakąś stronkę z opisem opji tego konkretnie komponentu po polsku?
  • REKLAMA
  • #6 5773965
    mruczek
    Poziom 11  
    Posty: 130
    Pomógł: 3
    Ocena: 11
    Dzięki za pomoc,ale wykres już działa na chartfx 2.0.
    Brakuje mi tylko jakiegoś porządnego opisu lub przykładów do tego komponentu, żeby w pełni wykorzystać jego możliwości.
  • #7 5774297
    Dżyszla
    Poziom 42  
    Posty: 7073
    Pomógł: 1095
    Ocena: 223
    Niestety, ja nie używałem tego komponentu. Co do problemu, to może jest tam jakaś opcja pozwalająca opierać się o zadane dane bądź dane losowe. W zasadzie trochę dziwne to opisane zjawisko. O zmanie nazwy nawet nie wspominając :P Stąd właśnie wynikła moja rada spróbowania czegoś innego.
  • REKLAMA
  • #8 5774498
    mruczek
    Poziom 11  
    Posty: 130
    Pomógł: 3
    Ocena: 11
    Poradziłem już sobie.
    kawałek kodu
        
    // Przekazywanie danych wykresowi ChartFX  
    var  
     j: integer;
     k: integer;
       
    begin  
    // Otwarcie kanału komunikacji z wykresem dla przekazania jednej serii 
    Chart1.OpenDataEx(COD_VALUES,1,0);
    
    // Ustalenie pierwszej serii (numer 0)
    Chart1.ThisSerie:=0;
    
    // Przekazywanie wartości punktów do wykresu
    j:=Memo2.lines.Count-1 ; //ilosc linii w memo
    k:=strtoint(edit5.text); //wartosc z wagi
    
    begin
    Chart1.Value[j] := k;
    end;
    
    // Zamknięcie kanału
    Chart1.CloseData(COD_VALUES);
    end;
    

    i
    po ustawieniu w kodzie
    chart1.ToolBar:=true

    pokazuje się pasek z opcjami-można zmieniać kolory,czcionki,wygląd wykresu, można zapisywać dane do/z pliku, robić zrzuty ekranu, drukować
    ....uff
    Jutro podepnę wagę i zobaczę jak to na żywo działa.

    ===========

    Programik już działa-odbiera ładnie dane z wagi (disomat B firmy Schenck) przez RS232 i pokazuje je na wykresie.
    Miałem tylko problem ,bo akceptował liczby całkowite,a przy wartości wagi z przecinkiem głupiał (jak dałem k: integer), ale po zmianie na
    var
    k: currency;

    i
    k:=strtocurr(edit5.text);

    jest OK.
    Teraz mam tylko problem jak zrobić automatyczny scroll. W helpie coś o tym pisze, ale nie kumam za bardzo na razie. Co prawda jak ilość pomiarów przekracza 20 to pasek do scrollowania sam się pojawia na wykresie, ale przesuwać trzeba go ręcznie.

    ============

    Scrollowanie mam prawie rozpracowane-niedługo dopiszę co i jak.
    Wyszedł miedzyczasie dość ciekawy problem.

    Odbieram dane z wagi do memo, potem dalej je obrabiam i przedstawiam na wykresie-i to dziala.
    Zauważyłem jednak, że po kilku minutach odbierania danych -dane odbierane są coraz wolniej i wolniej rysuje się wykres-aż do zawieszenia aplikacji.

    Po krótkim śledztwie wyszło na to, że program zaczyna zużywać coraz więcej mocy procesora od powiedzmy 8% aż do 100% (po odbiorze ok. 1200 wartości z wagi) i zawiesza się.

    Zacząłem po kolei wywalać ze skryptu linjiki -został mi golutki program z 2 buttonami i 1 memo do odbioru danych-mimo to program po pewnym czasie dochodził do 100% zużycia CPU.

    Winny okazał się komponent memo-musiałem przerobić skrypt tak, żeby odbierał dane i się czyścił komendą memo1.clear .

    Niestety używam jeszcze 3 memo gdzie zapamiętuję wagę,datę i godzinę-muszę się też ich pozbyć, bo mi też wieszają po czasie program-chyba zrobię jakiś zapis do pliku.

    Przy nie wyczyszczonym memo nie wzrasta zużycie pamięci, a wzrasta obciążenie procesora aż do 100%.

    Swoją drogą dlaczego tak się dzieje?

    ===============

    Przewijanie wykresu - trochę po partyzancku, bo innego sposobu nie wymyśliłem.
    var
    hwn: hwnd;
    
    hwn:=chart1.hctlwnd; //uchwyt okna z wykresem
    postMessage(hwn, WM_KEYDOWN, VK_next, 0); //vk_next czyli klawisz Page Down-wysyłamy do okna
    postMessage(hwn, WM_KEYUP, VK_next, 0);

    Niedogodnością jest to, że w ten sposób przy włączonym przewijaniu aktywność wciąż ustawia się na oknie wykresu - przez co kłopot jest z klikaniem w checkboxy,buttony i nie da się edytowac pól edit.
    Można sobie zrobić ON/OFF przewijania na checkboxie i włacząć /wyłączać kiedy nam potrzeba.

    Proszę nie pisać postu pod postem - do tego jest przycisk "Zmień".
    Posty scaliłem.

    Dr.Vee

Podsumowanie tematu

✨ Autor stworzył program w Delphi 7 do odbierania danych z wagi przez port COM za pomocą komponentu ComPort, wyświetlający wartości i czas w dwóch Memo. Poszukiwał sposobu na dynamiczne rysowanie wykresu z osiami y (wartość wagi) i x (czas), który na żywo przesuwałby się, automatycznie skalował oś y oraz umożliwiał zoom i scroll po zatrzymaniu odbioru danych. Wskazano komponent TChart, jednak w wersji Delphi 7 Personal jest on niedostępny. Alternatywnie zaproponowano użycie komponentu ChartFX 2.0, który po dodaniu do formy wyświetla przykładowy wykres i posiada rozbudowane opcje konfiguracyjne dostępne przez menu kontekstowe. Wymagana była zmiana nazwy komponentu z ChartFX na Chart, aby uniknąć błędów. Autor podzielił się fragmentem kodu pokazującym przekazywanie danych do wykresu ChartFX, w tym otwarcie kanału danych, przypisanie serii i wartości punktów oraz zamknięcie kanału. Ustawienie właściwości ToolBar na true umożliwia dostęp do paska narzędzi z opcjami zmiany kolorów, czcionek, wyglądu wykresu, zapisu danych, zrzutów ekranu i drukowania. Program działa poprawnie z wagą firmy Schenck (model disomat B) podłączoną przez RS232, wyświetlając dane na wykresie w czasie rzeczywistym.
Wygenerowane przez model językowy.
REKLAMA