[Gelöst] runtime Error 210

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

[Gelöst] runtime Error 210

Beitrag von MacWomble »

Hallo,

ich verzweifle gerade an einem ansich einfachen Problem:

Ich habe zu einem Projekt eine Form hinzugefügt (Projektinspektor über Hinzufügen (+) frm_about.pas selektiert). Sie wird im Projektinspektor auch angezeigt.
frm_about ist in den uses eingetragen. Wenn ich frmabout. tippe, bekomme ich auch die Auswahl wo ich showmodal wähle.

Beim Aufruf der Funktion kommt dann aber zur Laufzeit der o.g. Fehler.
Eine weitere Meldung besagt dann 'Object reference is Nil.'

In einem anderen Projekt funktioniert die Form.
Zuletzt geändert von MacWomble am Di 15. Dez 2015, 18:57, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: runtime Error 210

Beitrag von baumina »

Wahrscheinlich hast du bei den Projekteigenschaften dieses Formular nicht als automatisch erzeugen drin. Beschrieben ist das z.B. hier sehr gut http://wiki.freepascal.org/Form_Tutorial/de
.

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

Re: runtime Error 210

Beitrag von wp_xyz »

Wahrscheinlich wird das Formular nach dem Einfügen aus einem anderen Projekt nicht automatisch erzeugt: Projekt-Optionen / Formulare. frm_About steht wahrscheinlich in der rechten Liste mit den verfügbaren Formularen. Markieren und auf den Pfeil nach links klicken, damit es in die Liste mit den "automatisch erzeugten Formularen" übernommen wird.

Ich würde allerdings ein so wenig benutztes Formular nie automatisch erzeugen (und so während der ganzen Laufzeit mitschleppen), sondern nur zur Laufzeit:

Code: Alles auswählen

 
procedure TForm1.AboutButtonClick(Sender: TObject);
var
  F: Tfrm_About;
begin
  F := TFrm_About.Create(nil);
  try
    F.ShowModal;
  finally
    F.Free;
  end;
end;

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: runtime Error 210

Beitrag von MacWomble »

Danke, das war es (war nicht aktiv)

Ich möchte das auch noch dynamisch erzeugen, aber ich hatte das Problem schon einmal und habe es dann aufgegeben. Deswegen war ich an der Ursache interressiert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: runtime Error 210

Beitrag von baumina »

Wie man ein Formular dynamisch erzeugt, ist ebenfalls in dem von mir o.g. Link nachzulesen.
.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: runtime Error 210

Beitrag von MacWomble »

Irgendwas will mir noch immer nicht gelingen:

Geht nicht:
- frm_about in der uses angegeben
- Zeile mit frmabout in der lpr gelöscht

Code: Alles auswählen

procedure TfrmBoss.MenuItem4Click(Sender: TObject);
 var
  F: Tfrmabout;
begin
  F := Tfrmabout.Create(nil);
  try
    F.ShowModal;
  finally
    F.Free;
 end; 
end;  
oder auch analog zum Beispiel der Webseite

Code: Alles auswählen

 procedure TfrmBoss.MenuItem4Click(Sender: TObject);
begin
  frmabout := Tfrmabout.Create(Nil);  //Form2 wird erstellt
  frmabout.ShowModal;            //Form2 wird angezeigt
  FreeAndNil(frmabout);          //Form2 wieder freigeben
 end;   
ergibt Error 216

Geht:
- frm_about in der uses angegeben
- Zeile mit frmabout in der lpr gelassen

Code: Alles auswählen

procedure TfrmBoss.MenuItem4Click(Sender: TObject);
begin
  frmabout.ShowModal;
 end;   
Zuletzt geändert von MacWomble am Di 15. Dez 2015, 18:33, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

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

Re: runtime Error 210

Beitrag von wp_xyz »

Was heißt bei der 1.Lösung (die mit "F := ..."), dass es nicht geht? Es fehlt das abschließende "end" - dagegen würde der Compiler protestieren. Aber das meinst du doch nicht, oder? Ansonsten müssten beide Lösungen funktionieren. Was geschieht denn in dem frmAbout? Wenn du mit den Debugger durch den Code steppst, wo kommt die Schutzverletzung?

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: runtime Error 210

Beitrag von MacWomble »

Ja, das 'end;' wars nicht, das habe ich nur beim Kopieren vergessen.

Ich habe der Einfachheit halber das zweite Beispiel gewählt. der Debugger meldet schon in der ersten Zeile

Code: Alles auswählen

frmabout := Tfrmabout.Create(Nil);
den Fehler 216 Allgemeine Schutzverletzung


Hier die frm_about, aber die geht ja, wenn sie beim Start eingebunden wird:

Code: Alles auswählen

unit frm_about;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, VersionSupport;
 
type
 
  { Tfrmabout }
 
  Tfrmabout = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    memAbout: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  frmabout: Tfrmabout;
 
implementation
 
{$R *.lfm}
 
{ Tfrmabout }
 
procedure Tfrmabout.Button1Click(Sender: TObject);
begin
  frmabout.Close;
end;
 
procedure Tfrmabout.FormCreate(Sender: TObject);
begin
  Label1.Caption := 'Programmname:  ' + ApplicationName;
  frmabout.Caption := 'Über ' + ApplicationName;
 
  memAbout.Lines.Clear;
  memAbout.Lines.Add('Dateiversion' + #9 + #9 + GetFileVersion);
  memAbout.Lines.Add('Produktversion' + #9 + #9 + GetProductVersion);
  memAbout.Lines.Add('Betriebssystem' + #9 + #9 + GetOS);
  memAbout.Lines.Add('');
  memAbout.Lines.Add('Erstellt für' + #9 + #9 + #9 + GetTargetInfo);
  memAbout.Lines.Add('Erstellt am ' + #9 + #9 + #9 + GetCompiledDate);
  memAbout.Lines.Add('');
  memAbout.Lines.Add('FPC-Version ' + #9 + #9 + GetCompilerInfo);
  memAbout.Lines.Add('LCL-Version ' + #9 + #9 + #9 + GetLCLVersion);
  memAbout.Lines.Add('');
  memAbout.Lines.Add('Widget-Set ' + #9 + #9 + #9 + GetWidgetset);
 
end;
 
end.
 
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

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

Re: runtime Error 210

Beitrag von wp_xyz »

OK, das ist ein schöner Fehler, der zeigt, was passiert, wenn man die Formularvariable mit in den Code des Formulars schreibt:

Code: Alles auswählen

procedure Tfrmabout.FormCreate(Sender: TObject);
begin
  Label1.Caption := 'Programmname:  ' + ApplicationName;
  frmabout.Caption := 'Über ' + ApplicationName;
 
Du willst dem Titel des Formulars eine Überschrift zuweisen, aber du machst dies nur für das Formular, das die Variablenbezeichnung "frmabout" trägt. In der 1. Methode heißt die Formular-Variable aber "F", "frmAbout" wurde nie erzeugt (du hast es ja aus der Liste der automatisch erzeugten Formulare entfernt). Daher kracht es!

Richtig ist, in dem Formular-Code gar nicht den Formularnamen zu erwähnen, dann gilt er allgemein, egal wie das Formular später heißt:

Code: Alles auswählen

procedure Tfrmabout.FormCreate(Sender: TObject);
begin
  Label1.Caption := 'Programmname:  ' + ApplicationName;
  Caption := 'Über ' + ApplicationName;   // ohne frmAbout!
 
Leider sieht man diesen Fehler immer wieder hier im Forum!

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: runtime Error 210

Beitrag von MacWomble »

Du hast vollkommen Recht. Jetzt funktioniert es auch!

Das kommt noch aus meiner VB-Zeit - und alte Gewohnheiten ...

Ich versuche mich zu bessern und Bedanke mich für die Hilfestellungen und Tipps !

Der Vollständigkeit halber der zweite Fehler:

Code: Alles auswählen

procedure Tfrmabout.Button1Click(Sender: TObject);
begin
  frmabout.Close;  // hier nur Close !
end;
auch hier muss 'frmabout.' weg, sonst knallt es beim Schließen der Form
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten