Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TChart und TLineseries ändern (https://www.delphipraxis.net/44085-tchart-und-tlineseries-aendern.html)

LoL 13. Apr 2005 10:53


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:

Jens Schumann 13. Apr 2005 11:07

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:
private
 FStrings : TString;
...
constructor TStringsseries.Create...
...
  FStrings:=TstringList.Create;
TStringList hat das Event OnChange. Darüber kannst Su dann die Aktualisierung starten.

LoL 13. Apr 2005 11:44

Re: TChart und TLineseries ändern
 
Ich hab das bisher so:
Delphi-Quellcode:
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;
Wie reagiere ich nun auf die änderung von FData? oder besser gesagt wie reagiere ich auf das OnChange ereignis?

Jens Schumann 13. Apr 2005 11:48

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;

jim_raynor 13. Apr 2005 12:00

Re: TChart und TLineseries ändern
 
Würde dann aber die Property noch anpassen.

statt:

Delphi-Quellcode:
property DrawData : TStrings read FData write FData;
mach

Delphi-Quellcode:
property DrawData : TStrings read FData write SetData;
In SetData machst du dann

Delphi-Quellcode:
fData.Assign(Value)
Wobei Value die neue StringList ist. Dadurch verhinderst du speicherlecks.

Das andere Problem dürfte sein, TChart dazu zu bewegen deinen TLineSeries zu verwenden. Und da weiss ich im Moment nichts.

LoL 13. Apr 2005 12:10

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:
var meineseries : TdddLineSeries;
    sl : TStringlist;
begin
  meineseries := TdddLineSeries.Create(chart);
  Chart.AddSeries(meineseries);
  sl := TStringlist.Create;
  sl.LoadFromFile('...');
  a.DrawData := s;
Fertig :mrgreen:

jim_raynor 13. Apr 2005 12:13

Re: TChart und TLineseries ändern
 
Na dann ist ja gut. Aber du kannst dir die Sache noch etwas vereinfachen:

Delphi-Quellcode:
var meineseries : TdddLineSeries;
begin
  meineseries := TdddLineSeries.Create(chart);
  Chart.AddSeries(meineseries);
  a.DrawData.LoadFromFile('...');
Sollte genauso funktionieren und ist insgesamt schneller ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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