Form2.show -> Fehlermeldung

Für Fragen von Einsteigern und Programmieranfängern...
Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

Hallo!
Form2.show bringt die Fehlermeldung 'External: SIGSEGV', in der Datei '.include/customform.inc' in Zeile 2186
Die Form wird korrekt im Projektinspektor angezeigt, sollte also verfügbar sein.
Woran könnte das liegen?

Gruß und im Voraus vielen Dank
Frank

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Form2.show -> Fehlermeldung

Beitrag von theo »

Da hast du wahrsch. was vermurkst. Normalerweise wird das Formular in der lpr Datei erzeugt.

Soner
Beiträge: 726
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Form2.show -> Fehlermeldung

Beitrag von Soner »

Wo benutzt du Form2.Show?
Wenn du in Form1.OnCreate benutzt, ist die Fehlermeldung normal weil Form2 noch nicht erstellt ist. (Siehe in Projekt.lpr datei)
Wenn du Form2 in Hauptforms OnCreate-Ereignis benutzt musst du es selber erstellen.
Grundsätzlich ist es besser wenn mann nur Hauptformular automatisch erstellen läßt und die anderen bei Bedarf estellt.

Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Re: Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

...benutze ein zweites Formular um Variablen für Form1 festzulegen und zu steuern. Form2 läuft später auf einem anderem Monitor aber dem selben Computer. Ich möchte es mit dem Objektinspektor erstellen, da es weniger aufwendig erscheint, als es durch Programmcode in Form1 entstehen zu lassen. In früheren Delphiversionen habe ich das immer so gehandelt. Hier funktioniert das irgendwie nicht. Bin ja schliesslich auch kein Profi. Bei Programmstart sollen sich also zwei unabhängig positionierbare Fenster öffnen.
Gruß
Frank

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Form2.show -> Fehlermeldung

Beitrag von hde »

Dir Fromulare müsser creiert werden bevor du sie anzeigen kannst, automatisch oder per code. Frage also: wann und wer creiert Form2 und wann willst du sie anzeigen?
hde

Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Re: Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

...ich lese daraus, dass die Form2 auch wenn sie im Objektinspektor Kreiert erstellt wurde, trotzdem kreiert werden muss. OK, da muss ich also schauen. Das hatte ich iirgendwie von Delphi 5 anders in Erinnerung. Eigentlich soll Form1 initial gestartet werden. Über einen Button soll dann Form2 gestartet werden. Somit sollte wohl Form1 Form2 kreieren, oder?
Gruß
Frank

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Form2.show -> Fehlermeldung

Beitrag von Antrepolit »

Frank8001 hat geschrieben:...ich lese daraus, dass die Form2 auch wenn sie im Objektinspektor Kreiert erstellt wurde, trotzdem kreiert werden muss. OK, da muss ich also schauen. Das hatte ich iirgendwie von Delphi 5 anders in Erinnerung. Eigentlich soll Form1 initial gestartet werden. Über einen Button soll dann Form2 gestartet werden. Somit sollte wohl Form1 Form2 kreieren, oder?
Gruß
Frank
Wo bitte liest du das denn heraus? Wenn du sie mit dem Form-Designer erstellst, müsen sie nur angezeigt werden, wenn sie nicht das MainForm sind. Poste deinen Quelltext. Anders wird man dir kaum helfen können, wenn du derartige Dinge aus diesen Posts herausliest.
Grüße, Antrepolit

care only if your os is really burning

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Form2.show -> Fehlermeldung

Beitrag von gocher »

Unter Einstellungen für das Projekt gibt es wie auch unter Delphi eine Maske Formulare mit den automatisch erzeugten und den verfügbaren Formularen. Alle Formulare die hier nicht als automatisch erzeugte eingetragen sind müssen auch während der Laufzeit generiert werden.
Resultierend hieraus wird in der Projekt-Datei Application.CreateForm(TForm1, Form1); eingetragen.
Mit dem Designer erzeugst Du kein Objekt sondern eine Klasse!
Klassen-Definition:

Code: Alles auswählen

type
 TForm2 = class(TForm)
    Button1: TButton;
  private
    { private declarations }
  public
    { public declarations }
  end; 
Objekt-Variable:

Code: Alles auswählen

 var
  Form2: TForm2; 
Entweder fügst Du Dein Form2 zu den automatisch erzeugten hinzu, welches in der Projekt-Datei Application.CreateForm(TForm2, Form2); anlegt oder
Aufruf aus Unit1:

Code: Alles auswählen

uses unit2;
 ....
 Form2 := TForm2.Create(Application);
 Form2.Show;
// Form2.ShowModal;
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Re: Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

Bingo!
Danke ein weiteres Mal!
Gruß
Frank

Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Re: Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

Also irgendwie funktioniert das alles immernoch nicht. Beide Formulare stehen in dem Feld 'automatisch erzeugte Formulare'. Aber ich kann weder form2 öffnen und schließen, noch irgendwelche Dinge darauf steuern oder beeinflussen.
Ganz von vorne:
Ich habe 2 Blankoformulare in einem Projekt. Beide automatisch erstellt. Ich möchte mit dem einen Formular Dinge auf dem anderen beeinflussen: Images beschreiben, Knöpfe drücken, Variablen übertragen.
Und das funktioniert nicht. Heute morgen hat's irgendwie mal funktioniert, ich kann aber beim besten Willen nicht erkennen, warum.
Vielleicht nochmal für ganz Dumme wie mich.....
Gruß
Frank

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Form2.show -> Fehlermeldung

Beitrag von Socke »

Frank8001 hat geschrieben:Ich habe 2 Blankoformulare in einem Projekt. Beide automatisch erstellt. Ich möchte mit dem einen Formular Dinge auf dem anderen beeinflussen: Images beschreiben, Knöpfe drücken, Variablen übertragen.
Du darfst nicht im OnCreate()-Ereignis auf ein Formular zugreifen, das noch gar nicht erstellt wurde. In der IDE hast du die Reihenfolge, in der die Formulare erstellt werden.

Bspw:
  • Form1
  • Form2
Dann darfst du nicht in Form1.OnCreate() auf Form2 zugreifen, da Form2 noch gar nicht existiert.
Du darfst aber in Form2.OnCreate() auf Form1 zugreifen, da dieses vorher erstellt wurde.

Lösung: Du wartest bis alle Formulare erstellt sind und greifst dann erst darauf zu.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Re: Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

hm....
Ich poste jetzt einfach mal, was in den beiden Units steht. Vieleicht bin ich ja ein wenig begriffsstutzig, aber...

Code: Alles auswählen

Form1 (heisst SteuerForm):
 
unit Steuerpanel;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TSteuerForm }
 
  TSteuerForm = class(TForm)
    EKGPanoeffnen: TButton;
    procedure EKGPanoeffnenClick(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  SteuerForm: TSteuerForm;
  //EKGForm: TForm;
 
implementation
 
{$R *.lfm}
 
{ TSteuerForm }
 
 
procedure TSteuerForm.EKGPanoeffnenClick(Sender: TObject);
begin
 
end;
 
end.
 
Form2 (heisst EKGForm)
 
unit EKGPanel;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
 
  { TEKGForm }
 
  TEKGForm = class(TForm)
    EKGImage: TImage;
    procedure FormResize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  EKGForm: TEKGForm;
 
implementation
 
{$R *.lfm}
 
{ TEKGForm }
 
procedure TEKGForm.FormResize(Sender: TObject);
begin
  EKGImage.width := EKGForm.width - 2;
  EKGImage.height := EKGForm.height - 2;
end;
 
end.
So, jetzt will ich:
1. mit einem Button 'EKGForm' aufrufen
2. mit einem zweiten Button die Farbe von EKGForm festlegen (schwarz)
3. Variablen an EKGForm übergeben

Wie gesagt, in den Projekteigenschaften sind beide Form's unter den automatisch erstellten aufgeführt.
Danke für Eure Geduld!
Gruß
Frank
Zuletzt geändert von Lori am Di 14. Mai 2013, 21:56, insgesamt 1-mal geändert.
Grund: Der Highlighter ist nicht nur zum ignorieren da; Danke.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Form2.show -> Fehlermeldung

Beitrag von Socke »

Frank8001 hat geschrieben:Ich poste jetzt einfach mal, was in den beiden Units steht. Vieleicht bin ich ja ein wenig begriffsstutzig, aber...
Bitte mit Syntax-Highlighter!
Frank8001 hat geschrieben:Wie gesagt, in den Projekteigenschaften sind beide Form's unter den automatisch erstellten aufgeführt.
In welcher Reihenfolge?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Frank8001
Beiträge: 24
Registriert: Fr 26. Apr 2013, 20:28

Re: Form2.show -> Fehlermeldung

Beitrag von Frank8001 »

Zuerst SteuerForm, darunter EKGForm

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Form2.show -> Fehlermeldung

Beitrag von gocher »

Code: Alles auswählen

unit Steuerpanel;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TSteuerForm }
 
  TSteuerForm = class(TForm)
    EKGPanoeffnen: TButton;
    procedure EKGPanoeffnenClick(Sender: TObject);
 
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  SteuerForm: TSteuerForm;
  //EKGForm: TForm;
 
implementation
 
{$R *.lfm}
 
uses EKGPanel; //<-- hierdurch wird EKGForm in dieser Unit bekannt
{ TSteuerForm }
 
 
procedure TSteuerForm.EKGPanoeffnenClick(Sender: TObject);
begin
   EKGForm.Show; //<-- hierdurch wird EKGForm angezeigt
end;
 
end.
 
 

Code: Alles auswählen

unit EKGPanel;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, Steuerpanel;
 
type
 
  { TEKGForm }
 
  TEKGForm = class(TForm)
    EKGImage: TImage;
    procedure FormResize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  EKGForm: TEKGForm;
 
implementation
 
{$R *.lfm}
 
{ TEKGForm }
 
procedure TEKGForm.FormResize(Sender: TObject);
begin
  EKGImage.width := EKGForm.width - 2;
  EKGImage.height := EKGForm.height - 2;
end;
 
end.
 
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Antworten