![]() |
TChart und TLineseries ändern
Moin
Vielleicht kennt der eine oder andere ja die Komponente TChart. Diese stellt mit hilfe von TLineSeries graphen in einem Chart dar. Nun meine Idee. Ich möchte TLineSeries eine Eigenschaft hinzufügen vom Typ TStrings(Stringlist) wo ich die Daten für die Series drin stehen. Aus der soll dann automatisch die Daten ausgelesen werden und sobald die Stringlist geändert wurde wieder den chart aktualisieren. Soweit so gut. - Dazu muss ich also eine Eigenschaft vom Typ TStrings TlineSeries hinzufügen - Die Änderung der Stringliste abfragen und dann aktualisieren Ist das möglich? Wenn ja wie? Ich weis nicht wie ich das machen soll da TChart und TLineSeries ja verbunden sind, dh immer wenn ich eine neue Series hinzufüge dann added der Chart automatisch eine Series vom Typ TLineSeries. Lässt sich das ändern? Hoff ich hab das einigermaßen verständlich formuliert :mrgreen: |
Re: TChart und TLineseries ändern
Hallo,
ja das ist möglich. Stichwort: OOP Du solltest Dir einen Nachfahren von TLineseries basteln. Der bekommt dann eine public TStrings property. Objektintern musst Du aber TStringList verwenden. Etwa so (wg TStrings ist eine abstrakte Klasse
Delphi-Quellcode:
TStringList hat das Event OnChange. Darüber kannst Su dann die Aktualisierung starten.
private
FStrings : TString; ... constructor TStringsseries.Create... ... FStrings:=TstringList.Create; |
Re: TChart und TLineseries ändern
Ich hab das bisher so:
Delphi-Quellcode:
Wie reagiere ich nun auf die änderung von FData? oder besser gesagt wie reagiere ich auf das OnChange ereignis?
type
TdddLineSeries = class(TLineSeries) private { Private declarations } FData : TStrings; property DrawData : TStrings read FData write FData; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } end; implementation constructor TdddLineSeries.Create(AOwner: TComponent); begin inherited Create(Aowner); FData := TStringlist.Create; end; Destructor TdddLineSeries.Destroy; begin inherited; FreeAndNil(FData); end; |
Re: TChart und TLineseries ändern
So
Delphi-Quellcode:
type
TdddLineSeries = class(TLineSeries) private { Private declarations } FData : TStrings; procedure DrawDataChange(Sender : TObject); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; property DrawData : TStrings read FData write FData; // von private hierher geschoben published { Published declarations } end; implementation constructor TdddLineSeries.Create(AOwner: TComponent); begin inherited Create(Aowner); FData := TStringlist.Create; TStringlist(FData).OnChange:=DrawDataChange; end; Destructor TdddLineSeries.Destroy; begin inherited; FreeAndNil(FData); end; procedure TdddLineSeries.DrawDataChange(Sender : TObject); begin // Hier auf die Änderungen reagieren end; |
Re: TChart und TLineseries ändern
Würde dann aber die Property noch anpassen.
statt:
Delphi-Quellcode:
mach
property DrawData : TStrings read FData write FData;
Delphi-Quellcode:
In SetData machst du dann
property DrawData : TStrings read FData write SetData;
Delphi-Quellcode:
Wobei Value die neue StringList ist. Dadurch verhinderst du speicherlecks.
fData.Assign(Value)
Das andere Problem dürfte sein, TChart dazu zu bewegen deinen TLineSeries zu verwenden. Und da weiss ich im Moment nichts. |
Re: TChart und TLineseries ändern
WOW danke an eure Hilfe Fettes LOB :thumb:
Ich hab mir dadurch 100te Zeilen von Code erspart funzt einwandfrei. @jim_raynor: das ist kein Problem da sie blos ne Instanz von TLineSeries ist :zwinker:
Delphi-Quellcode:
Fertig :mrgreen:
var meineseries : TdddLineSeries;
sl : TStringlist; begin meineseries := TdddLineSeries.Create(chart); Chart.AddSeries(meineseries); sl := TStringlist.Create; sl.LoadFromFile('...'); a.DrawData := s; |
Re: TChart und TLineseries ändern
Na dann ist ja gut. Aber du kannst dir die Sache noch etwas vereinfachen:
Delphi-Quellcode:
Sollte genauso funktionieren und ist insgesamt schneller ;)
var meineseries : TdddLineSeries;
begin meineseries := TdddLineSeries.Create(chart); Chart.AddSeries(meineseries); a.DrawData.LoadFromFile('...'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz