Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zur Designetime erzeugte TeeChart.Series per Name ansprechen (https://www.delphipraxis.net/199913-zur-designetime-erzeugte-teechart-series-per-name-ansprechen.html)

norwegen60 1. Mär 2019 12:45

Delphi-Version: XE

Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Hallo zusammen,

ich erzeuge per
Delphi-Quellcode:
    lsSeries := TLineSeries.Create(nil);

    lsSeries.Name := 'lsAverage';
    lsSeries.Title := 'Average';
    lsSeries.Marks.Visible := False;
    lsSeries.ValueFormat := '0.#';
    lsSeries.LinePen.Width := 1;
    lsSeries.XValues.DateTime := False;
    lsSeries.XValues.Order := loAscending;
    lsSeries.YValues.Order := loNone;
    lsSeries.SeriesColor := clBlue;
    lsSeries.Pointer.Visible := False;

    Chart1.AddSeries(lsSeries);
eine TLineSeries.

Wie kann ich die nun später im Code über den Namen lsAverage ansprechen um z.B. Daten zu laden (und nicht über den Index
Delphi-Quellcode:
Chart1.Series[1].AddXY(Xvalue, Yvalue);
)


Danke
Gerd

peterbelow 1. Mär 2019 14:23

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Zitat:

Zitat von norwegen60 (Beitrag 1426731)
Hallo zusammen,

ich erzeuge per
Delphi-Quellcode:
    lsSeries := TLineSeries.Create(nil);

    lsSeries.Name := 'lsAverage';
    lsSeries.Title := 'Average';
    lsSeries.Marks.Visible := False;
    lsSeries.ValueFormat := '0.#';
    lsSeries.LinePen.Width := 1;
    lsSeries.XValues.DateTime := False;
    lsSeries.XValues.Order := loAscending;
    lsSeries.YValues.Order := loNone;
    lsSeries.SeriesColor := clBlue;
    lsSeries.Pointer.Visible := False;

    Chart1.AddSeries(lsSeries);
eine TLineSeries.

Wie kann ich die nun später im Code über den Namen lsAverage ansprechen um z.B. Daten zu laden (und nicht über den Index
Delphi-Quellcode:
Chart1.Series[1].AddXY(Xvalue, Yvalue);
)


Danke
Gerd

Versuch mal

Delphi-Quellcode:
lSeries := Chart1.Series.FindComponent('lsAverage') as TLineSeries;
Ich weis nicht, ob Chart1.AddSeries den Owner des übergebenen Objektes setzt, wenn er Nil ist, und wenn ja, was als Owner verwendet wird. Sieh mal im Sourcecode nach.

norwegen60 2. Mär 2019 17:39

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Zitat:

Zitat von peterbelow (Beitrag 1426745)
Versuch mal

Delphi-Quellcode:
lSeries := Chart1.Series.FindComponent('lsAverage') as TLineSeries;
Ich weis nicht, ob Chart1.AddSeries den Owner des übergebenen Objektes setzt, wenn er Nil ist, und wenn ja, was als Owner verwendet wird. Sieh mal im Sourcecode nach.

Nein, das funktioniert nicht. Beim Aufruf von Chart1.Series wird der Index erwartet.
Suche über Chart1.FindComponent oder Chart1.SeriesGroup.FindComponent gibt nil zurück

peterbelow 3. Mär 2019 12:21

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Zitat:

Zitat von norwegen60 (Beitrag 1426815)
Zitat:

Zitat von peterbelow (Beitrag 1426745)
Versuch mal

Delphi-Quellcode:
lSeries := Chart1.Series.FindComponent('lsAverage') as TLineSeries;
Ich weis nicht, ob Chart1.AddSeries den Owner des übergebenen Objektes setzt, wenn er Nil ist, und wenn ja, was als Owner verwendet wird. Sieh mal im Sourcecode nach.

Nein, das funktioniert nicht. Beim Aufruf von Chart1.Series wird der Index erwartet.
Suche über Chart1.FindComponent oder Chart1.SeriesGroup.FindComponent gibt nil zurück

Kompisch. Laut Hilfe gibt TChart.Series ein Objekt des Type TChartSeries zurück. Das hat eine default property, die indizierten Zugriff erlaubt, aber TChartSeries stammt von TComponent ab, erbt also auch die FindComponent-Methode.

Du erzeugst in deinem Kode doch die TLineSeries direkt. Gib doch einfach anstelle von nil Chart1 als Owner an den Constructor. dann sollte Chart1.FindCOmponent funktionieren.

newIndy 3. Mär 2019 14:30

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Liste der Anhänge anzeigen (Anzahl: 1)
// so funktioniert es:
Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
var Kurve:TBitmap;
    Chart1:TChart;
    lsSeries:TLineSeries;
begin
     try
        Chart1 := TChart.Create(Self);
        lsSeries := TLineSeries.Create(Chart1);
        lsSeries.BeginUpdate;
        lsSeries.Name := 'lsAverage';
        lsSeries.Title := 'Average';
        lsSeries.Marks.Visible := False;
        lsSeries.ValueFormat := '0.#';
        lsSeries.LinePen.Width := 1;
        lsSeries.XValues.DateTime := False;
        lsSeries.XValues.Order := loAscending;
        lsSeries.YValues.Order := loNone;
        lsSeries.SeriesColor := clBlue;
        lsSeries.Pointer.Visible := False;
        lsSeries.ParentChart := Chart1; // !
        lsSeries.FillSampleValues(100);
        lsSeries.EndUpdate;
        Kurve := Chart1.TeeCreateBitmap(clWhite, Image1.ClientRect, pf24bit);
        Image1.Canvas.Draw(0,0, Kurve);
     finally
        Kurve.Free;
        lsSeries.Free;
        Chart1.Free;
     end;
end;
mfG newIndy

newIndy 4. Mär 2019 20:43

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Delphi-Quellcode:
       
for i := 0 to 30 do if (lsSeries as TLineSeries).Name = 'lsAverage'
            then (lsSeries as TLineSeries).Add(Random);
           //lsSeries.FillSampleValues(100);
        for i := 0 to 30 do if
            (Chart1.FindComponent('lsAverage') as TLineSeries).Name = 'lsAverage'
            then (Chart1.FindComponent('lsAverage') as TLineSeries).Add(Random);

Uwe Raabe 4. Mär 2019 23:41

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Wenn du beim Erzeugen der Series statt nil eine
Delphi-Quellcode:
TComponent
-Instanz (z.B. das Chart selbst) als Owner angibst, dann kannst du über das
Delphi-Quellcode:
FindComponent
dieser Instanz die Series über ihren Namen finden. Wichtig ist halt, daß die Namen innerhalb des Owner eindeutig sind.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  lsSeries: TLineSeries;
begin
  lsSeries := TLineSeries.Create(Chart1);

  lsSeries.Name := 'lsAverage';
  lsSeries.Title := 'Average';
  lsSeries.Marks.Visible := False;
  lsSeries.ValueFormat := '0.#';
  lsSeries.LinePen.Width := 1;
  lsSeries.XValues.DateTime := False;
  lsSeries.XValues.Order := loAscending;
  lsSeries.YValues.Order := loNone;
  lsSeries.SeriesColor := clBlue;
  lsSeries.Pointer.Visible := False;

  Chart1.AddSeries(lsSeries);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  series: TLineSeries;
begin
  series := Chart1.FindComponent('lsAverage') as TLineSeries;
  Button2.Caption := series.Title;
end;

BerndS 5. Mär 2019 07:16

AW: Zur Designetime erzeugte TeeChart.Series per Name ansprechen
 
Warum nicht gleich die Variable lsSeries in TForm1 unter privat deklarieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz