Delphi Can
[ÇÖZÜLDÜ]canlı trend - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: [ÇÖZÜLDÜ]canlı trend (/showthread.php?tid=4855)

Sayfalar: 1 2 3


[ÇÖZÜLDÜ]canlı trend - wiseman - 23-05-2020

Selamlar

Arkadaşlar veritabanına 2 saniye aralıklarla datetime ve float olmak üzere değer kaydediyorum. Daha sonra bu değerleri trend olarak ekranda gösteriyorum. Ancak bunu canlı olarak nasıl akan bir grafik haline getirebilirim. Bi türlü kafamda oturtamadım. Teechart kullanıyorum. örnekleme resim aşağıdaki gibi olmalı. Fikirlerinizi rica ederim.
[attachment=1118]


canlı trend - Abdullah ILGAZ - 23-05-2020

Bu tarz bir işlemi gerçekleştirebilmeniz için ekran güncellemesi yapmanız gerektiğini gözlemlediğinizi kabul ederek söylüyorum; canlı değişim için belirlediğiniz süre aralığını tespit ettikten sonra sıradaki yüklenecek verileri elinizde hazır edin. Güncelleme zamanı geldiğinde görsel komponentlerin durumlarını tazeleyin, ve yeni verilerin değer atamalarını gerçekleştirin.


Cvp: canlı trend - wiseman - 23-05-2020

(23-05-2020, Saat: 14:29)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: Bu tarz bir işlemi gerçekleştirebilmeniz için ekran güncellemesi yapmanız gerektiğini gözlemlediğinizi kabul ederek söylüyorum; canlı değişim için belirlediğiniz süre aralığını tespit ettikten sonra sıradaki yüklenecek verileri elinizde hazır edin. Güncelleme zamanı geldiğinde görsel komponentlerin durumlarını tazeleyin, ve yeni verilerin değer atamalarını gerçekleştin
Cevabınız için teşekkür ederim. Canlı veri ve taarih aralıklı veri olmak üzere her iki yapıda da akıcı bir trend denemeleri yaptım ama bir türlü oturtamadım. Aslında istediğim örnekleme aşağıdakiler gibi.

[attachment=1119]
[attachment=1120]


canlı trend - Abdullah ILGAZ - 24-05-2020

@wiseman, rica ederim. Aşağıdaki görselin hangi platformdan alındığını bilmiyorum ama bu şekilde gerçek zamanlı iletişim kurarak güncelleme yapıp bunu ekrana çizmesi için görsel komponentlerden fazlasına ihtiyacınız olduğunu söyleyebilirim.

stock.txt dosyasındaki verileri öncelikli olarak sabit yerleştirip grafiği kısa sürelerde güncelleyerek performansın ve beklentilerinizin karşılanıp karşılanmadığını teyit edebilirseniz size sunabileceği alternatifleri olan bir çok arkadaşımız burada yanıt verecektir.


Cvp: canlı trend - wiseman - 25-05-2020

(24-05-2020, Saat: 23:18)Abdullah ILGAZ Adlı Kullanıcıdan Alıntı: @wiseman, rica ederim. Aşağıdaki görselin hangi platformdan alındığını bilmiyorum ama bu şekilde gerçek zamanlı iletişim kurarak güncelleme yapıp bunu ekrana çizmesi için görsel komponentlerden fazlasına ihtiyacınız olduğunu söyleyebilirim.

stock.txt dosyasındaki verileri öncelikli olarak sabit yerleştirip grafiği kısa sürelerde güncelleyerek performansın ve beklentilerinizin karşılanıp karşılanmadığını teyit edebilirseniz size sunabileceği alternatifleri olan bir çok arkadaşımız burada yanıt verecektir.

Tekrar teşekkürler cevabınız için.
Örnekleme olarak form üzerine bir tabloya verleri saniyede bir insert edecek bir kod yazdım. bir tane dbchart ekledim. Tabloya her veri eklendiğinde, chart refresh oluyor ve ekranda hareketleri görüyorum. Ancak autoscroll işlemi gerçekleşmediği için, ilk veri ve son veri arasındaki tüm değerleri trend de sıkıştırıyor. Aslında autoscroll işlemi gerçekleşirse, verinin ilk eklendiği tarihten itibaren sola doğru trend akacak. Şu anda ancak mouse sağ tık basılı tutarak trendi sola ya da sağa doğru ilerletebiliyorum. Her veri eklendiğinde, autoscroll olabilirse, yani real time olarak verileri izlemiş olacağım. Sizin nezdinizde tüm arkadaşlardan bununla ilgili destek bekliyorum.

[attachment=1121]

[attachment=1122]


canlı trend - mrmarman - 25-05-2020

Çözüme yaklaşmışsınız.

Sorunun ne olduğunu tanımlayana kadar sabredeceğim demiştim kendimce  Smile  SetMinMax() anahtarı sizin çözümünüzdür. 

- "The Matrix" filmindeki bir sahnede neo "kaşık nasıl bükülüyor" diye çocuğa sorunca, "aslında kaşık yok" cevabı gibi olacak ancak sorunuzda aslında Scroll yok siz zeminin sınırlarını TimerOnTimer eventinde ( sizde 2 saniyelik periyot ile) yeniden belirterek zemini kaydıracaksınız.

Chart_ScrollAxis.gif



Cvp: canlı trend - wiseman - 25-05-2020

(25-05-2020, Saat: 11:36)mrmarman Adlı Kullanıcıdan Alıntı: Çözüme yaklaşmışsınız.

Sorunun ne olduğunu tanımlayana kadar sabredeceğim demiştim kendimce  Smile  SetMinMax() anahtarı sizin çözümünüzdür. 

- "The Matrix" filmindeki bir sahnede neo "kaşık nasıl bükülüyor" diye çocuğa sorunca, "aslında kaşık yok" cevabı gibi olacak ancak sorunuzda aslında Scroll yok siz zeminin sınırlarını TimerOnTimer eventinde ( sizde 2 saniyelik periyot ile) yeniden belirterek zemini kaydıracaksınız.

Chart_ScrollAxis.gif

Sevgili @mrmarman Hocam,
"Bana balık verme, balık tutmayı öğret" düsturunuza her zaman hayran kalmışımdır. Ama inanın ki, kaç gündür uğraşıyorum. minmax konusuna birkaç yerde denk geldim lakin bir türlü çözemedim.  Bana, "biraz daha çabala bulacaksın" mesajını veriyorsunuz. Sanırım Matrix i birkaç defa daha izlemem gerek.

@mrmarman hocam,
Chart1.BottomAxis.SetMinMax(1234,5678); kodunu yaptım olmadı.
Chart1.BottomAxis.SetMinMax(EncodeDate(1997,1,1 ),EncodeDate(1997,12,31)); bu şekilde kodladım olmadı.
Hatayı bulamadım hala. Sanırım bir üstad eli dokunması lazım.


canlı trend - mrmarman - 25-05-2020

Şu şekilde bir örnek verebilirim. 

Son kaç veri gösterilecek ise onu iVisibleValuesCount ile belirleyin. 
Daima son veri ile sondan iVisibleValuesCount  kadar veri geriye doğru görüntülecektir.  :idea:

procedure TForm1.AddNewValue( aChartSeries: TChartSeries; aValue : Integer );
const
 iVisibleValuesCount = 80;
var
 iMin, iMax  : Integer;
begin
 With aChartSeries do
 begin
   AddXY( Count, aValue );
   iMin := Count - iVisibleValuesCount;
   iMax := pred( Count );

   if iMin < 0 then iMin := 0;
   // Hide old/previous visible marks
   // ( to prevent show marks outside the chart canvas )
   Marks[ iMin ].Visible := False;
   ParentChart.BottomAxis.SetMinMax( iMin, iMax ); // this is the magic :)
 end;
end;

Timer ile kullanım örneği. 
procedure TForm1.Timer1Timer(Sender: TObject);
var
 aValue : Integer;
begin
 aValue := Random( 100 );
 AddNewValue(  Chart1.SeriesList[0], aValue ); 
end;



Cvp: canlı trend - wiseman - 25-05-2020

(25-05-2020, Saat: 19:33)mrmarman Adlı Kullanıcıdan Alıntı: Şu şekilde bir örnek verebilirim. 

Son kaç veri gösterilecek ise onu iVisibleValuesCount ile belirleyin. 
Daima son veri ile sondan iVisibleValuesCount  kadar veri geriye doğru görüntülecektir.  Idea

procedure TForm1.AddNewValue( aChartSeries: TChartSeries; aValue : Integer );
const
 iVisibleValuesCount = 80;
var
 iMin, iMax  : Integer;
begin
 With aChartSeries do
 begin
   AddXY( Count, aValue );
   iMin := Count - iVisibleValuesCount;
   iMax := pred( Count );

   if iMin < 0 then iMin := 0;
   // Hide old/previous visible marks
   // ( to prevent show marks outside the chart canvas )
   Marks[ iMin ].Visible := False;
   ParentChart.BottomAxis.SetMinMax( iMin, iMax ); // this is the magic Smile
 end;
end;

Timer ile kullanım örneği. 
procedure TForm1.Timer1Timer(Sender: TObject);
var
 aValue : Integer;
begin
 aValue := Random( 100 );
 AddNewValue(  Chart1.SeriesList[0], aValue ); 
end;
@mrmarman  hocam,
balığı tutmayı öğrettiğinize göre, bana da, onu temizlemek, pişirmek, ve diğer arkadaşların da faydalanması için örneği burada yayınlamak düşer. Elinize sağlık. Smile

(25-05-2020, Saat: 19:33)mrmarman Adlı Kullanıcıdan Alıntı: Şu şekilde bir örnek verebilirim. 

Son kaç veri gösterilecek ise onu iVisibleValuesCount ile belirleyin. 
Daima son veri ile sondan iVisibleValuesCount  kadar veri geriye doğru görüntülecektir.  Idea

procedure TForm1.AddNewValue( aChartSeries: TChartSeries; aValue : Integer );
const
 iVisibleValuesCount = 80;
var
 iMin, iMax  : Integer;
begin
 With aChartSeries do
 begin
   AddXY( Count, aValue );
   iMin := Count - iVisibleValuesCount;
   iMax := pred( Count );

   if iMin < 0 then iMin := 0;
   // Hide old/previous visible marks
   // ( to prevent show marks outside the chart canvas )
   Marks[ iMin ].Visible := False;
   ParentChart.BottomAxis.SetMinMax( iMin, iMax ); // this is the magic Smile
 end;
end;

Timer ile kullanım örneği. 
procedure TForm1.Timer1Timer(Sender: TObject);
var
 aValue : Integer;
begin
 aValue := Random( 100 );
 AddNewValue(  Chart1.SeriesList[0], aValue ); 
end;

@mrmarman  hocam,

Peki, databasede zaten veri mevcut. Bunu insert etmeden, varolan verilerle nasıl görüntüleyeceğim? Her halukarda ontimer ile data insert ediyoruz sisteme. Yine takıldım. Sad Benim tabloda datetime alanı ve value alanı mevcut. Acaba datetime alanı olduğundan dolayı mı bir türlü kodu oturtamıyorum bilemedim.


canlı trend - mrmarman - 25-05-2020

Data veritabanından nasıl çekiliyor düşünün.
Ne zaman veri refresh ediliyor?
Nerede refresh ediliyor?
Verdiğim AddNewValue proc içinde AddXY satırını silince, silinmiş haliyle yeni veri eklediğiniz yerde kullanırsanız nasıl son6ç alırdınız? Bir düşünelim...
Count Dataset recordcount olduğuna göre oradan yürüyün derim.