Delphi-PRAXiS
Seite 1 von 2  1 2      

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, TLineSeries erzeugen (https://www.delphipraxis.net/54806-tchart-tlineseries-erzeugen.html)

Thanatos81 11. Okt 2005 17:19


TChart, TLineSeries erzeugen
 
Hi DP!

Folgender Code spuckt bei mir ne "Ungültige Zeigeroperation" aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var temp : TLineSeries;
begin
  Chart1.SeriesList.Clear;
  temp := TLineSeries.Create(Chart1);
  while not(zqDaten.EoF) do
    begin
      temp.AddXY(zqDaten.Fields.Fields[0].asFloat,zqDaten.Fields.Fields[1].asFloat);
      zqDaten.Next;
    end;
  Chart1.AddSeries(temp);
  zqDaten.First;
  zqDaten.EnableControls;
end;
Allerdings nicht beim temp := TLineSeries.Create(Chart1) oder beim Chart1.AddSeries(temp) wie ich vermutet hatte, sondern erst nach Beendigung der Prozedur :shock:

Jemand eine Idee?

Schönen Gruß,

supermuckl 11. Okt 2005 17:27

Re: TChart, TLineSeries erzeugen
 
temp.AddXY(zqDaten.Fields[0].asFloat,zqDaten.Fields[1].asFloat); <- so evtl ?

Thanatos81 11. Okt 2005 17:59

Re: TChart, TLineSeries erzeugen
 
Nee, das wars leider auch nicht.

Aber ich hab nen Lösungsversuch: Ich könnte auch TDBChart nehmen, das funktioniert nämlich wie gewünscht. Allerdings steht in der Hilfe etwas davon, dss die TDBChart die BDE braucht, welche ich aber nicht nutzen möchte. Ist das ein Fehler in der Hilfe, oder stimmt die Information?

//Edit

Habe gerade festgestellt, dass noch ein seltsames Phänomen auftritt:

Wenn ich die Reihe zur Designzeit anlege und diese dann fülle bekomme ich beim Verlassen der Prozedur eine Allgemeine Schutzverletzung. Mache ich aus der Lineseries allerdings Series2 und packe eine BarSeries als Series1 dazu funktioniert alles, vorrausgesetzt ich benutze die BarSeries mit. Schmeieß ich die LineSeries (oder auch FastLine) raus, funktioniert es auch nur mit der BarSeries...

Es funktioniert auch, wenn ich die BarSeries zur Laufzeit mit dem selben Code wie oben erzeuge...

Ein ähnliches Phänomen habe ich beim TDBChart, konfiguriere ich dort meine TLineSeries in der IDE, schließt sich die IDE ohne eine Fehlermeldung. Das ganze passiert auch in nem neuen, ansonsten leerem Projekt :wall:

Keldorn 11. Okt 2005 19:04

Re: TChart, TLineSeries erzeugen
 
Hallo, ich habe von Datenbanken so ziemlich 0-Ahnung, aber mußt du nicht erst first aufrufen und dann dich mit next durchsteppen?

Mfg Frank

Thanatos81 11. Okt 2005 19:06

Re: TChart, TLineSeries erzeugen
 
Jain: wenn man von Anfang an durchsteppen will, ja. Aber man könnte auch erst zu einer Stelle springen und von da an durchsteppen.

Aber die Prozedur hatte ich nur zur besseren Übersichtlichkeit ausgelagert. Im Orignialkontext ist ein First vorhanden :D

Keldorn 11. Okt 2005 19:09

Re: TChart, TLineSeries erzeugen
 
Was machst du denn noch in deinem "Originalkontext" ? Weil so wie der code jetzt dasteht, sehe ich keinen Fehler.

alzaimar 11. Okt 2005 19:35

Re: TChart, TLineSeries erzeugen
 
Ich erzeuge mir die Series zur Designzeit (bei TChart) und fülle sie einfach. Das klappt immer. TDBCharts kannst Du auch mit ADO oder sonstigen TDatasets benutzen. Leider ist TDBChart nicht wirklich 'datensensitiv', d.h. wenn die Tabelle per Refresh/Open neu geladen wird, musst Du die Series mit 'RefreshData' oder sowas neu zeichnen. Funktioniert dann aber auch.

Thanatos81 12. Okt 2005 08:49

Re: TChart, TLineSeries erzeugen
 
Zitat:

Zitat von Keldorn
Was machst du denn noch in deinem "Originalkontext" ? Weil so wie der code jetzt dasteht, sehe ich keinen Fehler.

Da passiert das hier:
Delphi-Quellcode:
procedure TForm1.getUserData(ID : String);
begin
  zqDaten.SQL.Clear;
  zqDaten.SQL.Add('SELECT Zeitpunkt, Punkte FROM Daten WHERE userID = '+ID+' ORDER BY Zeitpunkt');
  zqDaten.Open;
end;

procedure TForm1.JvDBMaskEdit1Change(Sender: TObject);
begin
  getUserData(TjvDBMaskEdit(Sender).Text);
  zqDaten.First;
  zqDaten.DisableControls;
  Series1.Clear;
  Series2.Clear;
  while not(zqDaten.EoF) do
    begin
      Series1.AddXY(zqDaten.Fields.Fields[0].asFloat,zqDaten.Fields.Fields[1].asFloat);
      Series2.AddXY(zqDaten.Fields.Fields[0].asFloat,zqDaten.Fields.Fields[1].asFloat);
      zqDaten.Next;
    end;
  zqDaten.First;
  zqDaten.EnableControls;
end;
Das ist die Variante wie es funktioniert, da hab ich dann allerdings die BarSeries, die ich nicht möchte. Folgendes funktioniert nicht:
Delphi-Quellcode:
procedure TForm1.JvDBMaskEdit1Change(Sender: TObject);
begin
  getUserData(TjvDBMaskEdit(Sender).Text);
  zqDaten.First;
  zqDaten.DisableControls;
  Series1.Clear;
  while not(zqDaten.EoF) do
    begin
      Series1.AddXY(zqDaten.Fields.Fields[0].asFloat,zqDaten.Fields.Fields[1].asFloat);
      zqDaten.Next;
    end;
  zqDaten.First;
  zqDaten.EnableControls;
end;
Das wäre dann mit Series1 als TLineSeries.

Aber auch wenn ich das ganze in ein neues Projekt schiebe und nur oben beschriebenen Code nutze hauts nicht hin. Bei meinen anderen alten Projekten mit Paradox über BDE klappts auch mit dynamisch erzeugten Serien, da hab ich den Code ja rausgenommen.

@alzaimar
Danke für den Hinweies bezüglich des TDBCharts. Damit funktioniert es halbwegs, nur nach mehrmaligen wechselnd des Datensatzes bekomme ich auch da eine Schutzverletzung, es sei denn, na wer errät es?, ich benutze eine TBarSeries :wall:

Werde jetzt wohl das TJvChart aus der JVCL nutzen, da ich eh nicht viel brauche...

Marphy 12. Okt 2005 16:17

Re: TChart, TLineSeries erzeugen
 
Hallo Thomas,
du hast vergessen, die Parent-Property der Series zu setzen...

BTW: Wenn du eh nicht viele Features brauchst, nutze am Besten die TFastLineSeries. Diese ist schneller (ach nee), bietet aber weniger Features als die TLineSeries. Näheres dazu in der Online Hilfe.

Grüße, Marco

Thanatos81 12. Okt 2005 16:23

Re: TChart, TLineSeries erzeugen
 
Danke für den Hinweis auf die FastLineSeries, Marco.

Aber wenn ich wie im letzt Codebeispiel die Series bereits in der IDE anlege, sollte die PArent doch gesetzt sein, oder? Werde es aber nachher mal testen, Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:08 Uhr.
Seite 1 von 2  1 2      

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