Probleme mit Chart in zweitem Fenster (Form2)

Rund um die LCL und andere Komponenten
Antworten
Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von Linkat »

Hallo,
aus einem Programm heraus möchte ich Messdaten in einem zweiten (zuschaltbaren) Fenster graphisch darstellen.
Um die Grundlagen zu verstehen und zu optimieren, habe ich ein kleines Hilfsprogramm "polygraf" erstellt.
In dem Programm wird ein Polynom 3. Grades berechnet und die Werte werden in ListBox1 ausgegeben und in Form2Chart1 dargestellt.
Die Faktoren a0 - a3, der Wertebereich xmin, xmax werden mit FloatSpinEdit und die Auflösung (Anzahl der Koordinatenpaare) mit SpinEdit eingestellt.
Dies funktioniert soweit auch vernünftig.

Hier der Quelltext Form1:

Code: Alles auswählen

unit polygrafu1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Buttons, Spin;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    btBerechne: TButton;
    btGrafik: TButton;
    FloatSpinEdit1: TFloatSpinEdit;
    FloatSpinEdit2: TFloatSpinEdit;
    FloatSpinEdit3: TFloatSpinEdit;
    FloatSpinEdit4: TFloatSpinEdit;
    FloatSpinEdit5: TFloatSpinEdit;
    FloatSpinEdit6: TFloatSpinEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    ListBox1: TListBox;
    SpinEdit1: TSpinEdit;
    procedure btBerechneClick(Sender: TObject);
    procedure btGrafikClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form1: TForm1; 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
uses polygrafu2;
 
type TFeld = record
               x,y   :single;
             end;
var blGrafik      :boolean;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption:='a3';
  Label2.Caption:='a2';
  Label3.Caption:='a1';
  Label4.Caption:='a0';
  Label5.Caption:='xmin';
  Label6.Caption:='xmax';
  Label7.Caption:='Auflös.';
  FloatSpinEdit1.Value:=0;
  FloatSpinEdit2.Value:=1;
  FloatSpinEdit3.Value:=0;
  FloatSpinEdit4.Value:=0;
  FloatSpinEdit5.Value:=-3;
  FloatSpinEdit6.Value:=3;
  SpinEdit1.Increment:=10;
  SpinEdit1.MaxValue:=1000;
  SpinEdit1.MinValue:=1;
  SpinEdit1.Value:=100;
  blGrafik:=false;
  btGrafik.Caption:='Grafik an';
end;      {FormCreate}
 
procedure TForm1.btBerechneClick(Sender: TObject);
var a,i                                  :integer;
    sw,a3,a2,a1,a0,x,y,xmin,xmax         :single;
    feld                                 :array of TFeld;
begin
  Screen.Cursor:=crHourGlass;
  ListBox1.Clear;
  Form2.Chart1LineSeries1.Clear;              <-- hier ist wahrscheinlich die Problemzeile
  a3:=FloatSpinEdit1.Value;
  a2:=FloatSpinEdit2.Value;
  a1:=FloatSpinEdit3.Value;
  a0:=FloatSpinEdit4.Value;
  xmin:=FloatSpinEdit5.Value;
  xmax:=FloatSpinEdit6.Value;
  a:=SpinEdit1.Value;
  sw:=(xmax-xmin)/a;
  x:=xmin;
  SetLength(feld,a+1);
  i:=0;
  while x<xmax+sw do begin
    y:=a3*x*x*x+a2*x*x+a1*x+a0;
    feld[i].x:=x;
    feld[i].y:=y;
    x:=x+sw;
    inc(i);
  end;  {while}
  for i:=Low(feld) to High(feld) do begin ListBox1.Items.Add
   (FloatToStrF(feld[i].x,ffFixed,4,2)+'  '+FloatToStrF(feld[i].y,ffFixed,4,2));
   Form2.Chart1LineSeries1.AddXY(feld[i].x,feld[i].y);
 
  end;  {for}
//  Form2.Chart1.AddSeries(LS1);
 
 
  SetLength(feld,0);
  Screen.Cursor:=crDefault;
end;      {btBerechne}
 
procedure TForm1.btGrafikClick(Sender: TObject);
begin
  blGrafik:=not blGrafik;
  if blGrafik then begin
    btGrafik.Caption:='Grafik aus';
    Form2.Visible:=true;
  end else begin
    btGrafik.Caption:='Grafik an';
    Form2.Visible:=false;
    Form2.Chart1.Refresh;
  end;
end;      {btGrafikClick}
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  Form2.Close;
end;      {FormClose}
 
end.

und Form2:

Code: Alles auswählen

unit polygrafu2;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, TAGraph,
  TASeries;
 
type
 
  { TForm2 }
 
  TForm2 = class(TForm)
    Chart1: TChart;
    Chart1LineSeries1: TLineSeries;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
 
var
  Form2: TForm2; 
 
implementation
 
{$R *.lfm}
 
{ TForm2 }
 
procedure TForm2.FormCreate(Sender: TObject);
begin
//  Chart1LineSeries1:=TLineSeries.Create(self);
   Chart1LineSeries1.ShowLines:=true;
   Chart1LineSeries1.LinePen.Color:=clBlue;
   Chart1LineSeries1.ShowPoints:=false;
 //  Chart1LineSeries1.Pointer.Style:=psCircle;
   Chart1LineSeries1.Pointer.Brush.Color:=clBlue;
   Chart1.AddSeries(Chart1LineSeries1);
   Chart1.Proportional:=false;
 
end;
 
end.
Nach jedem Klick auf btBerechnen sollen bei veränderten SpinEdits neue Werte berechnet und der Polynom neu dargestellt werden.
Zuvor werden die Werte mit "SetLength(feld,0)" bzw. "Form2.Chart1LineSeries1.Clear;" zurückgesetzt.

Die Schrittweite sw wird bestimmt durch "sw:=(xmax-xmin)/a;"). Fange ich mit einer Auflösung von a=100 an,
so stürzt das Programm nach der zweiten Berechnung mit der Fehlermeldung:

Code: Alles auswählen

Projekt polygraf.exe hat Exception-Klasse >>External SIGSEGV<< ausgelöst
ab. Der Cursor springt in eine procedure von control.inc

Code: Alles auswählen

procedure von control.inc

Code: Alles auswählen

procedure TControl.Click;
begin
  //DebugLn(['TControl.Click ',DbgSName(Self)]);
  if (not (csDesigning in ComponentState)) and (ActionLink <> nil) and
     ((Action=nil) or (@FOnClick <> @Action.OnExecute) or Assigned(FOnClick)) then
    ActionLink.Execute(Self)
  else
  if Assigned(FOnClick) then
    FOnClick(Self);     <-- der Cursor springt nach Fehlermeldung hier her
end;
Starte ich mit einem Wert für a=70, und setze dann nach der ersten Berechnung a wieder hoch oder sogar höher, so tritt der Fehler nicht mehr auf.

Mit dem Debugger habe ich die Stelle in Form1, die zum Absturz führt, mit

Code: Alles auswählen

Form2.Chart1LineSeries1.Clear;
identifiziert.

Wer hat eine Ahnung wo das Problem liegen könnte?


Ich hänge zwei Bilder von Form1 und Form2, sowie den Projektordner an. Vielleicht hat jemand Zeit, um das Problem nach zuvollziehen.

Vielen Dank.

Gruß, Linkat


Ich habe das Ganze mit Lazarus 0.9.30 vom März 2011 entwickelt. Aus Verzweiflung habe ich heute die Version 0.30.1 mit FPC 2.4.4 installiert. Leider hat sich an dem Problem nichts geändert.
Dateianhänge
Form2.gif
Form2.gif (18.26 KiB) 1583 mal betrachtet
Form1.gif
Polygraf.zip
(382.14 KiB) 69-mal heruntergeladen
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von u-boot »

Code: Alles auswählen

while x<xmax+sw do begin
halte ich für fragwürdig, wenns auch nicht unbedingt den beschriebenen Fehler verursacht.


Projekt hochladen würde es einfacher machen zu helfen, wenn sowieso schon der ganze Quelltext gepostet ist.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von Linkat »

Hallo u-boot,
was hälst du denn, an der while-Schleife für fragwürdig? Ich denke schon, dass das sauber programmiert ist. Der Summand (+sw) ist wichtig, damit auch noch der letzte Punkt berücksichtigt wird. Dies fällt insbesondere bei sehr kleinen a auf.

Das Projekt PolyGraf und zwei Form-Bilder sind doch im Anhang zu finden. Ich verstehe dein Problem nicht.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von Linkat »

Ein hoch auf die Plattformunabhängigkeit von Lazarus.

Gerade eben habe ich das PolyGraf-Projekt heruntergeladen und auf meinem Linux-PC kompiliert und gestartet (Das Programm wurde auf dem Firmen PC unter WinXP 32bit geschrieben). Der Fehler tritt hier bei meinem OpenSuse 11.4 64bit nicht auf. Alles funktioniert hervoragend. Was aber mein Problem auf meinem Firmen PC nicht löst!

Wer erkennt das Problem und hat eine Idee zur Beseitigung?

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Thomas B.
Beiträge: 90
Registriert: Fr 2. Nov 2007, 13:32
OS, Lazarus, FPC: Win (L 1.0 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Ulm

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von Thomas B. »

Hallo Linkat,
ich konnte bei Deinem Projekt das Problem nachvollziehen.
Ich dachte auch erst es hätte etwas mit dem Chart zu tun, aber seit der Abänderung der Berechnungsschleife

Code: Alles auswählen

a:=SpinEdit1.Value;
sw:=(xmax-xmin)/a;
SetLength(feld,a+1);
For i:=0 to High(feld) do begin
  x:=xmin + sw*i;
  y:=a3*x*x*x+a2*x*x+a1*x+a0;
  feld[i].x:=x;
  feld[i].y:=y;
end;  {while}
for i:=0 to High(feld) do begin ListBox1.Items.Add
  (FloatToStrF(feld[i].x,ffFixed,4,2)+'  '+FloatToStrF(feld[i].y,ffFixed,4,2));
  Form2.Chart1LineSeries1.AddXY(feld[i].x,feld[i].y);
end;  {for}

tritt bei mir der Fehler nicht mehr auf.
Gruß Thomas

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von Linkat »

Hallo Thomas,
vielen Dank für deinen Tipp. u-boot hatte ja auch die while- Schleife im Visier. Ich verstehe trotzdem nicht, warum die while-Schleife so anders reagieren soll, und der Fehler unter Linux nicht auftriit. Aber ich werde es am Montag an meinem WinXP-PC ausprobieren und hier berichten.

Gruß an alle, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von u-boot »

Sorry ich glaub ich hab das Projekt im anhang schlicht übersehen.
Nunja ich hab TAChartseries wohl nicht installiert von daher gings dann erstmal auch nicht richtig weiter.

Wegen der Schleife: ich persönlich würde die Schleife anders machen. Aber ist ja dein Programm und vielleicht für deine Zwecke auf diese Weise gut gelöst. Wenn etwas über den Maximalwert rausgeht sticht das halt ins Auge .... Ich wollte nicht behaupten, dass es unbedingt falsch sein muss. Es sieht aber für mich unschön aus (Ich meine jetz nicht das Bild sondern diese Schleife).
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von Linkat »

Hallo,
tatsächlich, ich habe nun an meinem Firmen-PC (WinXP) die while-Schleife in die for-Schleife integriert. Und es tritt kein Fehler mehr auf.

Code: Alles auswählen

sw:=(xmax-xmin)/a;
  x:=xmin;
  SetLength(feld,a+1);
  i:=0;
{  while x<xmax+sw do begin
    y:=a3*x*x*x+a2*x*x+a1*x+a0;
    feld[i].x:=x;
    feld[i].y:=y;
    x:=x+sw;
    inc(i);
  end;  {while}           }
  for i:=Low(feld) to High(feld) do begin
    y:=a3*x*x*x+a2*x*x+a1*x+a0;
    feld[i].x:=x;
    feld[i].y:=y;
    x:=x+sw;
    ListBox1.Items.Add
    (FloatToStrF(feld[i].x,ffFixed,4,2)+'  '+FloatToStrF(feld[i].y,ffFixed,4,2));
    Form2.Chart1LineSeries1.AddXY(feld[i].x,feld[i].y);
  end;  {for}
  SetLength(feld,0);
(natürlich könnte ich mir für dieses Beispiel das dyn. Array feld sparen)


Okay das Problem ist zunächst mal beseitigt. Aber warum tritt das Problem überhaupt auf und warum nicht unter Linux?

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Probleme mit Chart in zweitem Fenster (Form2)

Beitrag von u-boot »

Ich hätte ja anfangs vermutet, dass es an Rundungsproblemen liegen könnte ... dazu passt die Fehlerbeschreibung aber nicht so richtig.
Außerdem wüsste ich auch nicht, dass Berechnungen unter Win andere Ergebnisse hervorbringen als unter Linux.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Antworten