External SIGFPE bei TAxisCoeffHelper.CalcScale

Rund um die LCL und andere Komponenten
Antworten
PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von PhilmacFLy »

Ich hab mal wieder ien Problem mit meinem Lieblings TChart -.-

Ich krieg im moment über eine http post anfrage über ein php file, daten, die parse ich dann und füg sie in ein Chart ein

Code: Alles auswählen

procedure TForm1.anfrage(start, ende: TDate);
var
  http: THTTPSend;
  resultstream: TStringStream;
  startdate, endedate, submitstring, getstring, analysestring: string;
  analyselist: TStringList;
  posi, i: integer;
  insertdate: longint;
  Fmt     : TFormatSettings;
  insertparameter: integer;
  insertwert: double;
  //maxwert, minwert: double;
  //maxdate, mindate: longint;
begin
  http := THTTPSend.Create;
  resultstream := TStringStream.Create('');
  startdate := '"' + FormatDateTime('yyyy-mm-dd%20hh:nn:ss', start) + '"';
  endedate := '"' + FormatDateTime('yyyy-mm-dd%20hh:nn:ss', ende) + '"';
  submitstring := http://www.server.de/getdata.php';
  http.ProxyHost := ProxyHost;
  http.ProxyPort := ProxyPort;
  http.ProxyUser := ProxyUser;
  http.ProxyPass := ProxyPass;
  http.HTTPMethod('Post', submitstring);
  SynEdit1.Lines.LoadFromStream(http.Document);
  analyselist := TStringList.Create;
  getstring := Synedit1.Lines.Text;
  posi := pos('<start>', getstring) + length('<start>') - 1;
  Delete(getstring, 1, posi);
  posi := pos('<ende/>', getstring);
  Delete(getstring, posi, length(getstring));
  posi := pos('#', getstring);
  while posi > 0 do
  begin
    analyselist.Add(copy(getstring, 1, posi - 1));
    Delete(getstring, 1, posi);
    posi := pos('#', getstring);
  end;
  chart1.AutoSize:=false;
  maxwert := 0;
  minwert := 100000;
  maxwert := 0;
  minwert := 1000000000000000000;
  for i := 0 to analyselist.Count - 1 do
  begin
    analysestring := analyselist[i];
    posi := pos(';', analysestring);
    fmt.ShortDateFormat:='yyyy-mm-dd';
    fmt.DateSeparator  :='-';
    fmt.LongTimeFormat :='hh:nn:ss';
    fmt.TimeSeparator  :=':';
    insertdate := DateTimeToUnix(StrToDateTime(copy(analysestring, 1, posi - 1), fmt));
    Delete(analysestring, 1, posi);
    posi := pos(';', analysestring);
    insertparameter := StrToInt(copy(analysestring, 1, posi - 1));
    Delete(analysestring, 1, posi);
    posi := pos(';', analysestring);
    insertwert := StrtoFloat(stringreplace((copy(analysestring, 1, posi - 1)), '.', ',', [] ));
    Delete(analysestring, 1, posi);
    graphen[insertparameter].AddXY(insertdate, insertwert);
    if insertwert > maxwert then
      maxwert := insertwert;
    if insertwert < minwert then
      minwert := insertwert;
    if insertdate > maxdate then
      maxdate := insertdate;
    if insertdate < mindate then
      mindate := insertdate;
  end;
  chart1.Repaint;
  //chart1.Extent.XMax := maxdate;
  //chart1.Extent.XMin := mindate;          
Jetzt hab ich das Problem, egal was ich mach Kireg ich immer eine SIGFPE bei TAxisCoeffHelper.CalcScale, nur wenn ich die Extents auf Use True stell und dann nicht die Werte veränder passiert nichts.
Kann mir evtl jemand helfen?

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von wp_xyz »

In der angesprochenen Methode wird durch (Max - Min) dividiert. Bist du sicher, dass dies nicht null ist? Setze einen Breakpoint auf die Zeile mit AddXY und prüfe, ob insertdate und insertwert vernünftige Werte haben.

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von PhilmacFLy »

Ich hab jetzt mal ales "Use" auf true gesettzt und das ganze so gemacht

Code: Alles auswählen

  if maxdate <> 0 then
  chart1.Extent.XMax := maxdate;
  if mindate <> 0 then
  chart1.Extent.XMin := mindate;
  if maxwert <> 0 then
  chart1.Extent.YMax := maxwert;
  if minwert <> 0 then
  chart1.Extent.YMin := minwert;     
Aber ich krieg wieder sen selben Fehler, aber es sind alle <> 0

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von wp_xyz »

Eigentlich ist dein Vorgehen im 1.Posting grundsätzlich richtig: Daten ermitteln und per AddXY in die Series einfügen, den Rest macht TChart.

Wenn ich den TAxisCoeffHelper in den TAChart-Sourcen suche, finde ich, dass er nur in der Methode CalculateTransformationCoeffs von TChart verwendet wird. Benutzst du Transformations? Wenn ja, solltest du immer den AxisIndexX und AxisIndexY der Series auf die betreffende Nummer in der AxisList setzen, damit die Transformation richtig arbeiten kann.

Ansonsten würde ich vorschlagen, dass du die lfm-Datei öffnest und hier den Abschnitt des Charts postest. Dann könnte ich sehen, wo du überall die Default-Eigenschaften verändert hast.

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von PhilmacFLy »

Keine Transformations:
Hier der Auszug aus der lfm

Code: Alles auswählen

  object Chart1: TChart
    Left = 8
    Height = 736
    Top = 88
    Width = 1320
    AxisList = <    
      item
        Minors = <>
        Title.LabelFont.Orientation = 900
      end    
      item
        Intervals.MaxLength = 100
        Intervals.MinLength = 100
        Alignment = calBottom
        Minors = <>
      end>
    Extent.UseXMax = True
    Extent.UseXMin = True
    Extent.UseYMax = True
    Extent.UseYMin = True
    Extent.XMax = 600
    Extent.YMax = 200
    Foot.Brush.Color = clBtnFace
    Foot.Font.Color = clBlue
    Title.Brush.Color = clBtnFace
    Title.Font.Color = clBlue
    Title.Text.Strings = (
      'TAChart'
    )
    Toolset = ChartToolset1
    DoubleBuffered = True
    ParentColor = False
  end

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von wp_xyz »

Intervals.MaxLength = MinLength kommt mir komisch vor, vielleicht wird der Helper dadurch zu Max=Min gezwungen. Setze hier testweise wieder die Defaultwerte ein (MaxLength = 50, MinLength = 10)

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von PhilmacFLy »

Hab ich gemacht Problem bleibt aber bestehen

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von wp_xyz »

Was passiert zur Laufzeit? Änderst du Properties des Chart oder der Series im Code?

Dann wäre noch ein Kandidat das Array graphen. Sind diese Objekte richtig initialisiert? Ist der Index insertparameter im zulassigen Bereich? Setze testweise im Objektinspektor eine Series in den Chart und verwende diese statt "graphen[insertparameter]"

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von PhilmacFLy »

Das einzige was ich mit dem Chart noch mach ist das

Code: Alles auswählen

  setlength(graphen, max);
  abstand := round((16777215) / max + 20);
  r := 0;
  g := 0;
  b := 0;
  c := 0;
  for i := 0 to max - 1 do
  begin
    graphen[i] := TLineSeries.Create(Chart1);
    Chart1.AddSeries(graphen[i]);
    graphen[i].LinePen.Width := 2;
    c := c + abstand;
    tmp := inttohex(c, 6);
    r := StrToInt('$' + copy(tmp, 1, 2));
    g := StrToInt('$' + copy(tmp, 3, 2));
    b := StrToInt('$' + copy(tmp, 5, 2));
    graphen[i].LinePen.Color := RGB2TColor(r, g, b);
  end;
Habs mit chart1lineseries1.AddXY(insertdate, insertwert) probiert aber funkt auch nicht

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von wp_xyz »

Sieht harmlos aus. Das einzige, was ich anders mache ist, dass ich als Owner der Series immer das Formular verwende, nicht den Chart. Also:

Code: Alles auswählen

graphen[i] := TLineSeries.Create(self);
Zum lfm noch: Du verwendest Tools. Nehme sie mal probeweise mal raus.

wp_xyz
Beiträge: 5175
Registriert: Fr 8. Apr 2011, 09:01

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von wp_xyz »

Der Autor von TAChart hat deine Fragen hier entdeckt (http://www.lazarus.freepascal.org/index ... 602.0.html), hat allerdings mit Google Translate nicht alles verstanden. Er bittet dich deine Fragen im offiziellen Lazarus Forum (z.B. Antwort auf obigen Link) nochmals auf englisch zu posten.

PhilmacFLy
Beiträge: 18
Registriert: Do 13. Dez 2012, 13:49

Re: External SIGFPE bei TAxisCoeffHelper.CalcScale

Beitrag von PhilmacFLy »

Hab das Problem gefunden:

Das Problem war das max und minwert, anscheinend muss das größer als 1.0 auseinandersein da es sonst failed.
da das aber bei meinen werten nicht gegeben war, is es gecrashed

Antworten