2013-06-05 2 views
4

Я могу создать сложный барчер в Delphi с помощью TeeChart. Это использование значений и серий, добавленных в цикл. Я бы предпочел создать эту диаграмму, просто используя запрос в качестве источника данных и не добавляя каждый бар в виде отдельной серии внутри цикла. Есть ли лучший способ сделать это, или другой тип диаграммы, на который я должен смотреть? Данные представляют собой поперечное сечение породных типов из образца ямы скважины. Набор данных содержит одну запись для каждого измерения глубины и типа горных пород. Он отображается как единый вертикальный столбец пород, как образец ядра.Как сделать сложный планшет из набора данных с использованием teechart в delphi

+----+ 
| | record 1 - depth1, rock type 1 
| | 
+----+ 
| | 
| | 
| | record 2 - depth2, rock type 2 
| | 
+----+ 
| | record 3 - depth3, rock type 3 
+----+ 


procedure TForm128.GenerateLithologyChart; 
var 
    LSeries: TBarSeries; 
    i : integer; 
    LastBot : double; 

    procedure AddRockSeries(depth : double; col : TColor); 
    begin 
    LSeries := TBarSeries.Create(LithologyChart); 
    LithologyChart.AddSeries(LSeries); 
    LSeries.AddBar(0, '', clBlue); 
    if col=clNone then 
     LSeries.AddNullXY(0,depth,'') 
    else 
     LSeries.AddXY(0,depth,'',col); 
    LSeries.Marks.Visible := False; 
    LSeries.MultiBar := mbStacked; 
    LSeries.CustomBarWidth := 80; 
    end; 

begin 
    LithologyChart.LeftAxis.Inverted := True; 
    LithologyChart.Title.Text.Text := 'Well Lithology - data-aware test'; 
    LithologyChart.SeriesList.Clear; 
    AdoQuery1.First; 
    i := 0; 
    LastBot := 0; 
    while not AdoQuery1.Eof do begin 
    if abs(AdoQuery1.FieldByName('Strata Top').asFloat-LastBot) > 0.0005 then begin 
     // create blank cross section for the missing depth range 
     AddRockSeries(AdoQuery1.FieldByName('Strata Top').asFloat-LastBot, clNone); 
    end; 
    AddRockSeries(AdoQuery1.FieldByName('Strata Bottom').asFloat-AdoQuery1.FieldByName('Strata Top').asFloat, clRed); 

    LastBot := AdoQuery1.FieldByName('Strata Bottom').asFloat; 
    inc(i); 
    //if i = 3 then break; 

    AdoQuery1.Next; 
    end; 
    AdoQuery1.First; 
end; 

ответ

2

Попробуйте использовать mbSelfStackMultiBar стиль для TBarSeries. Вот это пример:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Chart1.View3D:=false; 
    with Chart1.AddSeries(TBarSeries) as TBarSeries do 
    begin 
    Marks.Visible:=false; 
    MultiBar:=mbSelfStack; 
    FillSampleValues; 
    end; 
end; 

С этим стилем, значения одного TBarSeries будут уложены один над другим

+0

Фантастическая спасибо. Это хорошо работает. Теперь у меня есть еще несколько вопросов для решения с легендой - я должен создать новый вопрос? – user2455609

+0

Конечно! Новый вопрос, новая тема – Yeray