2013-05-31 1 views
0

У меня есть компонент TChart, с Fastline Series и ColorBand Tool. На форме у меня также есть баттом, который запускает таймер. В каждом событии таймера я генерирую 2048 выборок случайных данных и обновляю Fasline Series. Когда я запускаю таймер, на TChart нет анимации! Кажется, что это работает случайным образом, хотя ... И когда я скрываю и показываю форму (путем минимизации/максимизации, или путем tChart1.Hide()/tChart1.Show()), анимация снова начинает работать, ИЛИ когда я перетащите одну из строк ColorBand перед началом таймера, тогда анимация работает. Но анимация не работает, когда я запускаю таймер первым. И, кроме того, когда это не работает, TChart кажется замороженным, т. Е. Ot не отвечает на любые команды мыши, такие как панорамирование или масштабирование. Вот код:TChart Control Freezes

В моем form.designer.cs:

partial class Form1 
{ 
    /// <summary> 
    /// Required designer variable. 
    /// </summary> 
    private System.ComponentModel.IContainer components = null; 

    /// <summary> 
    /// Clean up any resources being used. 
    /// </summary> 
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
    protected override void Dispose(bool disposing) 
    { 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

    #region Windows Form Designer generated code 

    /// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    { 
     this.button1 = new System.Windows.Forms.Button(); 
     this.tChart1 = new Steema.TeeChart.TChart(); 
     this.checkBox1 = new System.Windows.Forms.CheckBox(); 
     this.SuspendLayout(); 
     // 
     // button1 
     // 
     this.button1.BackColor = System.Drawing.SystemColors.Control; 
     this.button1.Location = new System.Drawing.Point(12, 12); 
     this.button1.Name = "button1"; 
     this.button1.Size = new System.Drawing.Size(60, 23); 
     this.button1.TabIndex = 1; 
     this.button1.Text = "Start"; 
     this.button1.UseVisualStyleBackColor = false; 
     this.button1.Click += new System.EventHandler(this.button1_Click); 
     // 
     // tChart1 
     // 
     // 
     // 
     // 
     // 
     // 
     // 
     this.tChart1.Axes.Depth.LabelsAsSeriesTitles = true; 
     // 
     // 
     // 
     this.tChart1.Axes.DepthTop.LabelsAsSeriesTitles = true; 
     this.tChart1.Location = new System.Drawing.Point(12, 41); 
     this.tChart1.Name = "tChart1"; 
     this.tChart1.Size = new System.Drawing.Size(789, 318); 
     this.tChart1.TabIndex = 2; 
     // 
     // checkBox1 
     // 
     this.checkBox1.AutoSize = true; 
     this.checkBox1.Location = new System.Drawing.Point(78, 16); 
     this.checkBox1.Name = "checkBox1"; 
     this.checkBox1.Size = new System.Drawing.Size(49, 17); 
     this.checkBox1.TabIndex = 3; 
     this.checkBox1.Text = "Drag"; 
     this.checkBox1.UseVisualStyleBackColor = true; 
     this.checkBox1.Click += new System.EventHandler(this.checkBox1_Click); 
     // 
     // Form1 
     // 
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
     this.ClientSize = new System.Drawing.Size(823, 371); 
     this.Controls.Add(this.checkBox1); 
     this.Controls.Add(this.tChart1); 
     this.Controls.Add(this.button1); 
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; 
     this.Name = "Form1"; 
     this.Text = "Form1"; 
     this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); 
     this.SizeChanged += new System.EventHandler(this.Form1_SizeChanged); 
     this.ResumeLayout(false); 
     this.PerformLayout(); 

    } 

    #endregion 

    private System.Windows.Forms.Button button1; 
    private Steema.TeeChart.TChart tChart1; 
    private System.Windows.Forms.CheckBox checkBox1; 
} 

И тогда в моем form.cs:

public partial class Form1 : Form 
{ 
    System.Timers.Timer timer; 
    private Steema.TeeChart.Tools.ColorBand tool; 
    Steema.TeeChart.Styles.FastLine primaryLine; 
    double w = 0; 
    bool enabled = false; 

    public Form1() 
    { 
     InitializeComponent(); 
     initPrimaryGraph(); 
     initTool(); 

     timer = new System.Timers.Timer(); 
     timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
     timer.Interval = 50; 
     timer.Stop(); 
    } 

    private void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Random rnd = new Random(); 
     for (int i = 0; i < 2048; i++) 
     { 
      primaryLine.XValues[i] = i; 
      primaryLine.YValues[i] = 20 + rnd.Next(50); 
     } 
     primaryLine.BeginUpdate(); 
     primaryLine.EndUpdate(); 
    } 

    private void initTool() 
    { 
     tool = new Steema.TeeChart.Tools.ColorBand(); 
     tChart1.Tools.Add(tool); 
     tool.Axis = tChart1.Axes.Bottom; 
     tool.Start = 300; 
     tool.End = 400; 
     tool.Brush.Color = Color.Yellow; 
     tool.Pen.Color = Color.Blue; 
     tool.Pen.Width = 2; 
     tool.Transparency = 60; 

     tool.StartLine.AllowDrag = true; 
     tool.StartLine.DragRepaint = true; 
     tool.ResizeStart = true; 
     tool.StartLine.DragLine += new EventHandler(StartLine_DragLine); 

     tool.EndLine.AllowDrag = true; 
     tool.EndLine.DragRepaint = true; 
     tool.ResizeEnd = true; 
     tool.EndLine.DragLine += new EventHandler(EndLine_DragLine); 
    } 

    void StartLine_DragLine(object sender, EventArgs e) 
    { 
     if (enabled) 
     { 
      tool.End = tool.Start + w; 
     } 
    } 

    void EndLine_DragLine(object sender, EventArgs e) 
    { 
     if (enabled) 
     { 
      tool.Start = tool.End - w; 
     } 
    } 

    private void initPrimaryGraph() 
    { 
     tChart1.Header.Visible = true; 

     tChart1.Axes.Bottom.Automatic = false; 
     tChart1.Axes.Bottom.Minimum = 0; 
     tChart1.Axes.Bottom.Maximum = 2048; 
     tChart1.Axes.Bottom.Labels.Font.Color = Color.White; 
     tChart1.Axes.Bottom.Grid.Visible = false; 

     tChart1.Axes.Left.Automatic = false; 
     tChart1.Axes.Left.Minimum = 0; 
     tChart1.Axes.Left.Maximum = 300; 
     tChart1.Axes.Left.Labels.Font.Color = Color.White; 

     tChart1.Aspect.View3D = false; 

     tChart1.Walls.Back.Visible = false; 
     tChart1.Walls.Bottom.Visible = false; 
     tChart1.Walls.Left.Visible = false; 
     tChart1.Walls.Right.Visible = false; 

     tChart1.Legend.Visible = false; 
     tChart1.BackColor = Color.Black; 
     tChart1.Panel.Visible = false; 

     //PRIMARY GRAPH..... 
     primaryLine = new Steema.TeeChart.Styles.FastLine(); 
     tChart1.Series.Add(primaryLine); 
     Random rnd = new Random(); 
     for (int i = 0; i < 2048; i++) 
     { 
      double x = i; 
      double y = 20 + rnd.Next(50); 
      primaryLine.Add(x, y); 
     } 
     primaryLine.LinePen.Style = System.Drawing.Drawing2D.DashStyle.Solid; 
     primaryLine.LinePen.Color = Color.White; 
     primaryLine.LinePen.Width = 1; 
     primaryLine.VertAxis = Steema.TeeChart.Styles.VerticalAxis.Left; 
    } 

    private void tool_DragLine(object sender, EventArgs e) 
    { 
     Steema.TeeChart.Tools.ColorLine t = sender as Steema.TeeChart.Tools.ColorLine; 
     this.Text = t.Value.ToString(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (timer.Enabled) 
     { 
      timer.Stop(); 
      button1.Text = "Start"; 
     } 
     else 
     { 
      timer.Start(); 
      button1.Text = "Stop"; 
     } 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     timer.Stop(); 
    } 

    private void checkBox1_Click(object sender, EventArgs e) 
    { 
     if (checkBox1.Checked) 
     { 
      w = tool.End - tool.Start; 
     } 
     enabled = checkBox1.Checked; 
    } 
} 

У меня есть еще один вопрос. Я хочу создать черновую реализацию компонента TeeChart, написав пользовательский API (пользовательский пользовательский элемент управления), чтобы выявить определенные функции, чтобы я мог использовать его в других проектах и ​​чтобы один или несколько моих коллег могли работать использовать его в своих проектах. Какую версию/лицензию TeeChart я должен приобрести, которая позволит мне обернуть функциональность TeeChart в пользовательском компоненте/dll, который может быть использован для разных проектов/компьютеров?

Заранее спасибо :-)

ответ

0

У меня есть TChart компонент, с серией Fastline и инструментом Colorband . На форме у меня также есть баттом, который запускает таймер. На каждом этапе тайм-эль-событие я генерирую 2048 выборок случайных данных и обновляю серии Fasline. Когда я запускаю таймер, нет анимации на TChart! Кажется, что это работает случайным образом, хотя ... И, когда я прячусь и , покажите форму (путем минимизации/максимизации, или по tChart1.Hide()/tChart1.Show()), тогда анимация снова начинает работать , ИЛИ когда я перетаскиваю одну из строк ColorBand перед запуском таймера , тогда работает анимация. Но анимация не работает, когда я начинаю таймер сначала. И, кроме того, если это не сработает, TChart, похоже, застыл, т. Е. Не отвечает на любые команды мыши, например, панорамирование или масштабирование. Вот несколько кодов:

Я немного изменил ваш код, и теперь он работает в моем конце. Дальше:

Timer timer; 
    private Steema.TeeChart.Tools.ColorBand tool; 
    Steema.TeeChart.Styles.FastLine primaryLine; 
    double w = 0; 
    bool enabled = false; 

    public Form1() 
    { 
     InitializeComponent(); 
     initPrimaryGraph(); 
     initTool(); 

     timer = new Timer(); 
     //Enable Timer 
     timer.Enabled = true; 
     timer.Interval = 50; 
     timer.Tick += timer_Tick; 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 

     AnimateSeries(tChart1); 
    } 

    private void AnimateSeries(TChart tChart) 
    { 
     Random rnd = new Random(); 
     tChart.AutoRepaint = false; 
     primaryLine.BeginUpdate(); 
     foreach (Steema.TeeChart.Styles.Series s in tChart.Series) 
     {   
      for (int i = 0; i < 2048; i++) 
      { 
       primaryLine.XValues[i] = i; 
       primaryLine.YValues[i] = 20 + rnd.Next(50); 
      } 

     } 

     tChart.AutoRepaint = true; 
     primaryLine.EndUpdate(); 
    } 
    private void initTool() 
    { 
     tool = new Steema.TeeChart.Tools.ColorBand(); 
     tChart1.Tools.Add(tool); 
     tool.Axis = tChart1.Axes.Bottom; 
     tool.Start = 300; 
     tool.End = 400; 
     tool.Brush.Color = Color.Yellow; 
     tool.Pen.Color = Color.Blue; 
     tool.Pen.Width = 2; 
     tool.Transparency = 60; 

     tool.StartLine.AllowDrag = true; 
     tool.StartLine.DragRepaint = true; 
     tool.ResizeStart = true; 
     tool.StartLine.DragLine += new EventHandler(StartLine_DragLine); 

     tool.EndLine.AllowDrag = true; 
     tool.EndLine.DragRepaint = true; 
     tool.ResizeEnd = true; 
     tool.EndLine.DragLine += new EventHandler(EndLine_DragLine); 
    } 

    void StartLine_DragLine(object sender, EventArgs e) 
    { 
     if (enabled) 
     { 
      tool.End = tool.Start + w; 
     } 
    } 

    void EndLine_DragLine(object sender, EventArgs e) 
    { 
     if (enabled) 
     { 
      tool.Start = tool.End - w; 
     } 
    } 

    private void initPrimaryGraph() 
    { 
     tChart1.Header.Visible = true; 
     tChart1.Aspect.View3D = false; 

     tChart1.Walls.Back.Visible = false; 
     tChart1.Walls.Bottom.Visible = false; 
     tChart1.Walls.Left.Visible = false; 
     tChart1.Walls.Right.Visible = false; 

     tChart1.Legend.Visible = false; 
     tChart1.BackColor = Color.Black; 
     tChart1.Panel.Visible = false; 

     //PRIMARY GRAPH..... 
     primaryLine = new Steema.TeeChart.Styles.FastLine(); 
     tChart1.Series.Add(primaryLine); 
     Random rnd = new Random(); 
     for (int i = 0; i < 2048; i++) 
     { 
      double x = i; 
      double y = 20 + rnd.Next(50); 
      primaryLine.Add(x, y); 
     } 
     primaryLine.LinePen.Style = System.Drawing.Drawing2D.DashStyle.Solid; 
     primaryLine.LinePen.Color = Color.White; 
     primaryLine.LinePen.Width = 1; 
     //AXES 
     tChart1.Axes.Bottom.Automatic = false; 
     tChart1.Axes.Bottom.Minimum = primaryLine.XValues.Minimum; 
     tChart1.Axes.Bottom.Maximum = primaryLine.XValues.Maximum; 
     tChart1.Axes.Bottom.Increment = 200; 
     tChart1.Axes.Bottom.Labels.Font.Color = Color.White; 
     tChart1.Axes.Bottom.Grid.Visible = false; 
     tChart1.Axes.Left.Automatic = false; 
     tChart1.Axes.Left.Minimum = 0; 
     tChart1.Axes.Left.Maximum = 300; 

     tChart1.Axes.Left.Labels.Font.Color = Color.White; 
     primaryLine.VertAxis = Steema.TeeChart.Styles.VerticalAxis.Left; 
     tChart1.Draw(); 
    } 

    private void tool_DragLine(object sender, EventArgs e) 
    { 
     Steema.TeeChart.Tools.ColorLine t = sender as Steema.TeeChart.Tools.ColorLine; 
     this.Text = t.Value.ToString(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (timer.Enabled) 
     { 
      timer.Stop(); 
      button1.Text = "Start"; 
     } 
     else 
     { 
      timer.Start(); 
      button1.Text = "Stop"; 
     } 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     timer.Stop(); 
    } 

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

У меня есть другой вопрос. Я хочу создать реализацию черного ящика компонента TeeChart, написав пользовательский API (пользовательский элемент управления ), чтобы выявить определенные функции, чтобы я мог использовать его в других проектах, и чтобы один или несколько моих коллег на работе может использовать его в своих проектах. Какую версию/лицензию TeeChart я должен купить , которая позволила бы мне обернуть функциональность TeeChart в пользовательском компоненте/dll , который может использоваться по различным проектам/компьютерам ?

TeeChart может быть повторно использован другой сборкой времени (dll), которая публикует определенные характеристики teeChart. Пожалуйста, не то, чтобы машины, которые повторно использовали компонент тройника во время разработки, также должны установить лицензию разработчика TeeChart.

Надеюсь, это поможет.

Спасибо,

+0

Спасибо, я попробую ваше предложение и дам вам отзывы позже, когда я закончил :-) – user1980088