Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Chart zur Laufzeit erstellen, Linien in den Vordergrund


Bronstein - Sa 09.02.08 10:36
Titel: Chart zur Laufzeit erstellen, Linien in den Vordergrund
Hallo,
ich erstelle ein Chart zur Laufzeit. Jetzt habe ich ein Problem, dass ich die Linien nicht über die Balken bekomme.

Hat jemand eine Idee wie ich das machen könnte.

Hier mal meine bisherige Funktion:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
procedure TfrmSettings.VorschauData(Chart:TChart; DiagrammID:ShortString);
var
  Kreis: TPieSeries;
  Balken: TBarSeries;
  Linie: TLineSeries;
  LastTypID: Integer;
begin
  //Series zeichnen und mit Werten belegen
  LastTypID := 0;
  Chart.SeriesList.Clear; //alle Series aus dem Diagramm löschen
  AdoQuery1.SQL.Clear;
  //AdoQuery1.SQL.Add('Select * FROM Series WHERE ChartID=' + pString(Combobox2.Items.Objects[ComboBox2.ItemIndex])^);
  AdoQuery1.SQL.Add('SELECT Series.*, Data.* FROM Series INNER JOIN Data ON Series.SeriesID = Data.SeriesID WHERE ChartID=' + DiagrammID + ' ORDER BY Series.SeriesID');
  AdoQuery1.Active := true;
  while not AdoQuery1.Eof do
  begin
    if LastTypID <> AdoQuery1.FieldByName('TypID').AsInteger then
    begin
      if AdoQuery1.FieldByName('TypID').AsInteger = 1 then  //Linie
      begin
        Linie := TLineSeries.Create(self);
        Linie.ParentChart := Chart;
        Linie.SeriesColor := GetFarbe(AdoQuery1.FieldByName('Farbe').AsString);
        Linie.Title := AdoQuery1.FieldByName('Titel').AsString;
      end;
      if AdoQuery1.FieldByName('TypID').AsInteger = 2 then  //Balken
      begin
        Balken := TBarSeries.Create(self);
        Balken.ParentChart := Chart;
        Balken.SeriesColor := GetFarbe(AdoQuery1.FieldByName('Farbe').AsString);
        Balken.Title := AdoQuery1.FieldByName('Titel').AsString;
      end;
      if AdoQuery1.FieldByName('TypID').AsInteger = 3 then  //Kreis
      begin
        Kreis := TPieSeries.Create(self);
        Kreis.ParentChart := Chart;
        Kreis.SeriesColor := GetFarbe(AdoQuery1.FieldByName('Farbe').AsString);
        Kreis.Title := AdoQuery1.FieldByName('Titel').AsString;
      end;
    end;
    if AdoQuery1.FieldByName('TypID').AsInteger = 1 then  //Linie
      Linie.Add(AdoQuery1.FieldByName('Wert').AsFloat, AdoQuery1.FieldByName('Beschriftung').AsString);
    if AdoQuery1.FieldByName('TypID').AsInteger = 2 then  //Balken
      Balken.Add(AdoQuery1.FieldByName('Wert').AsFloat, AdoQuery1.FieldByName('Beschriftung').AsString);
    if AdoQuery1.FieldByName('TypID').AsInteger = 3 then  //Kreis
      Kreis.Add(AdoQuery1.FieldByName('Wert').AsFloat, AdoQuery1.FieldByName('Beschriftung').AsString);
    LastTypID := AdoQuery1.FieldByName('TypID').AsInteger;
    AdoQuery1.Next;
  end;
end;


Bronstein - Mo 11.02.08 22:22

Hat niemand eine Idee?

Ich habe auch noch eine weitere Frage, wie kann ich angeben, dass sich z.b. ein Balken nicht auf die linke sondern auf die rechte Achse bezieht?


Bronstein - Sa 16.02.08 11:01

Damit sich eine Linie auf die rechte Seite bezieht habe ich herrausbekommen:

Delphi-Quelltext
1:
Linie.VertAxis := aRightAxis;                    


Das Problem, dass die Linien unter den Balken sind habe ich aber immernoch


Delete - Sa 16.02.08 12:13

Das ist doch einfach:
erst die Balken, dann die Linien zeichnen.


Bronstein - Sa 16.02.08 21:20

Ja, das würde funktionieren, kann ich das nicht zu einem späteren Zeitpunkt sagen, dass er die Linien über die Balken legen soll?


Delete - Sa 16.02.08 23:27

user profile iconhathor hat folgendes geschrieben:
Das ist doch einfach:
erst die Balken, dann die Linien zeichnen.


einfacher: chart.axis.behind := false;

die frage ist nur, weshalb man so etwas wollen sollte... :gruebel: