2017-02-10 3 views
0

TDBChart 구성 요소를 폼에 표시하고 Checkbox-Legend를 사용하여 시리즈의 가시성을 전환합니다. 최대 5 개의 시리즈를 볼 수 있습니다. 이것이 제 정의입니다. 차트에서 속도를 높이려면 표시되는 시리즈의 데이터 만 데이터베이스에서로드하려고합니다.TDBChart : 데이터를로드하지 않고 범례로드

그러나 전설에 가능한 모든 항목을 포함하려면 정의 된 데이터 집합 및 필드 이름이있는 모든 시리즈를 정의해야합니다.

이 경우 차트는 보이지 않는 시리즈에 대한 결석에 대한 예외 사항을 제외하고 나에게 귀찮게합니다.

차트 데이터와 별도로 범례를로드 할 수 있습니까?

+0

선택하지 않은 시리즈에'DataSource : = nil; '을 지정하려고 시도 했습니까? – Yeray

+0

@ 예 : 그렇습니다. 그러나 도움이되지 않습니다. 일단 시리즈가 데이터를로드하면, DataSource 속성 상태에 관계없이 그 사실을 잊어 버리고 데이터를 요구하지 않습니다. – Paul

+1

시리즈 데이터가 선택되지 않은 경우 '지우기'할 수 있습니다. – Yeray

답변

0

다음 예에서는 테스트 DataSource (TeeChart와 함께 제공되는 TeeChart Pro 데이터베이스)에 연결된 두 개의 시리즈를 만들었습니다.
차트 OnClickLegend 이벤트를 사용하여 비활성 상태이고 데이터가 다시 활성화되면 새로 고침 (CheckDataSource) 할 때 시리즈 (Clear)를 삭제합니다.
참고 OnAfterDraw 이벤트를 사용하여 각 시리즈 Count을 보여줍니다.

uses Series, CandleCh; 

var 
    Table1, Table2: TTable; 
    barSeries: TBarSeries; 
    candleSeries: TCandleSeries; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    DBChart1.View3D:=False; 
    DBChart1.Legend.CheckBoxes:=True; 
    DBChart1.MarginLeft:=10; 

    Table1:=TTable.Create(Self); 
    Table1.DatabaseName:='TeeChart Pro Database'; 
    Table1.TableName:='Employee'; 

    Table2:=TTable.Create(Self); 
    Table2.DatabaseName:='TeeChart Pro Database'; 
    Table2.TableName:='Stock'; 

    barSeries:=DBChart1.AddSeries(TBarSeries) as TBarSeries; 
    candleSeries:=DBChart1.AddSeries(TCandleSeries) as TCandleSeries; 

    with barSeries do 
    begin 
    DataSource:=Table1; 
    YValues.ValueSource:='SALARY'; 
    XLabelsSource:='LASTNAME'; 
    HorizAxis:=aTopAxis; 
    end; 

    DBChart1.Axes.Top.Grid.Visible:=False; 

    with candleSeries do 
    begin 
    VertAxis:=aRightAxis; 
    DataSource:=Table2; 
    YValues.ValueSource:='DATE'; 
    OpenValues.ValueSource:='OPEN'; 
    HighValues.ValueSource:='HIGH'; 
    LowValues.ValueSource:='LOW'; 
    CloseValues.ValueSource:='CLOSE'; 
    end; 

    Table1.Active:=True; 
    Table2.Active:=True; 
end; 

procedure TForm1.DBChart1ClickLegend(Sender: TCustomChart; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
var i: Integer; 
begin 
    if barSeries.Active then 
    barSeries.CheckDataSource 
    else 
    barSeries.Clear; 

    if candleSeries.Active then 
    candleSeries.CheckDataSource 
    else 
    candleSeries.Clear; 
end; 

procedure TForm1.DBChart1AfterDraw(Sender: TObject); 
begin 
    Caption:='Bar: ' + IntToStr(barSeries.Count) + ' values, Candle: ' + IntToStr(candleSeries.Count) + ' values'; 
end;