2015-10-19 56 views
0

我們正在使用FastReport工具進行報告。 在這份報告中,有一個teechart,我們希望以某些條形圖的最大值繪製一條線。我們想在圖表上以最大價值劃一條線

Sample of a chart with line at maximum

我們試圖用增加新的系列解決問題,但問題是該行不會啓動在x = 0 如何才能實現,將有最大值線從x = 0開始(在y軸之後)。

Example with series, not starting at x=0

用於描繪線的代碼實例:

void __fastcall TFTedPoro::cxButton2Click(TObject *Sender) 
{ 
    double XMin, XMax, YVal; 
    frxReport1->LoadFromFile("porocilo.fr3"); 

    TfrxChartView *cv; 
    cv = (TfrxChartView *)frxReport1->FindObject("Chart1"); 
    if (cv != NULL) 
    { 
     cv->Chart->Series[0]->Marks->Visible = false; 
     cv->Chart->Series[1]->Marks->Visible = false; 
     cv->Chart->Series[2]->Marks->Visible = false; 
     cv->Chart->Series[3]->Marks->Visible = false; 
     cv->Chart->Series[4]->Marks->Visible = false; 
     cv->Chart->Series[5]->Marks->Visible = false; 
     cv->Chart->Series[6]->Marks->Visible = false; 

     if (max_vred >= 350) 
     { 
      cv->Chart->LeftAxis->Maximum = max_vred; 
     } 
    } 

    XMin = cv->Chart->Series[0]->XValues->MinValue; 
    XMax = cv->Chart->Series[0]->XValues->MaxValue; 
    YVal = cv->Chart->Series[0]->YValues->MaxValue; 

    for (int i = 1; i < cv->Chart->SeriesCount()-1;i++) 
    { 
     XMin = Min(XMin, cv->Chart->Series[i]->XValues->MinValue); 
     XMax = Max(XMax, cv->Chart->Series[i]->XValues->MaxValue); 
     YVal = Max(YVal, cv->Chart->Series[i]->YValues->MaxValue); 
    } 
    cv->Chart->Series[8]->AddXY(XMin-1, YVal); 
    cv->Chart->Series[8]->AddXY(XMax+1, YVal); 
    cv->Chart->Axes->Bottom->SetMinMax(XMin-0.5, XMax+0.5); 

    frxReport1->ShowReport(true); 
} 

結果看起來像這樣: Chart with code on button click

+0

在圖像中我看到一個紅色的水平線在y = 350。我不確定要明白它有什麼問題。紅線似乎從左邊的y軸開始。 – Yeray

+0

這是我們想要實現的,但我們不能。如果我們爲一行添加系列,行不會從x = 0開始 - 請參閱上面的附加圖像 –

回答

0

使用TColorLineTool如在特徵演示的示例:

ColorLine

的功能演示附帶TeeChart VCL evaluation version

更新:

如果您沒有訪問圖表工具,另一種方法是使用兩個TLineSeries值。
請注意,您可以設置一個第一XValue小到最小XValue在你的其他系列,而不是最大的XValue第二XValue更大的在你的其他系列。然後,您可以手動將底軸MinimumMaximum(即通過SetMinMax(min, max)函數)設置爲僅適合原始系列中的點。

這是一個簡單的例子:

uses Series, Math; 

procedure TForm1.FormCreate(Sender: TObject); 
var i: Integer; 
    XMin, XMax, YVal: double; 
begin 
    for i:=0 to 7 do 
    begin 
    with Chart1.AddSeries(TBarSeries) as TBarSeries do 
    begin 
     Marks.Visible:=false; 
     FillSampleValues(); 
    end; 
    end; 

    XMin:=Chart1[0].XValues.MinValue; 
    XMax:=Chart1[0].XValues.MaxValue; 
    YVal:=Chart1[0].YValues.MaxValue; 
    for i:=1 to Chart1.SeriesCount-1 do 
    begin 
    XMin:=Min(XMin, Chart1[i].XValues.MinValue); 
    XMax:=Max(XMax, Chart1[i].XValues.MaxValue); 
    YVal:=Max(YVal, Chart1[i].YValues.MaxValue); 
    end; 

    with Chart1.AddSeries(TLineSeries) as TLineSeries do 
    begin 
    AddXY(XMin-1, YVal); 
    AddXY(XMax+1, YVal); 
    end; 

    Chart1.Axes.Bottom.SetMinMax(XMin-0.5, XMax+0.5); 
end; 

這是上面的例子,如何尋找我在這裏:

Bars

第三種方法是手動畫出水平線在OnAfterDraw。即:

procedure TForm1.Chart1AfterDraw(Sender: TObject); 
var Ythreshold: Double; 
    tmpY: Integer; 
begin 
    Ythreshold:=Chart1[0].YValues.MaxValue; 
    tmpY:=Chart1.Axes.Left.CalcPosValue(Ythreshold); 
    Chart1.Canvas.Pen.Color:=clRed; 
    Chart1.Canvas.Line(Chart1.Axes.Bottom.IStartPos, tmpY, Chart1.Axes.Bottom.IEndPos, tmpY); 
end; 
+0

我們使用TeeChart和Fast報告4.15。我們無法在此版本中找到TColorLineTool。我們嘗試使用LineVIew代替,但問題是x軸的最大值是動態生成的,因此一條線的位置不固定。 –

+0

我已經編輯了我的答案,並添加了兩個替代方案 – Yeray

+0

是的,我看過了,但我不明白如何使用TLineSeries實現您的解決方案。我不知道在哪裏可以設置第一個和第二個XValue,而且我也不知道如何設置最小值和最大值。 –