[Gelöst] runtime Error 210
-
- 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
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.
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.
-
- 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
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
.
Re: runtime Error 210
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:
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;
-
- 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
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.
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.
-
- 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
Wie man ein Formular dynamisch erzeugt, ist ebenfalls in dem von mir o.g. Link nachzulesen.
.
-
- 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
Irgendwas will mir noch immer nicht gelingen:
Geht nicht:
- frm_about in der uses angegeben
- Zeile mit frmabout in der lpr gelöscht
oder auch analog zum Beispiel der Webseite
ergibt Error 216
Geht:
- frm_about in der uses angegeben
- Zeile mit frmabout in der lpr gelassen
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;
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;
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.
Re: runtime Error 210
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?
-
- 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
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
den Fehler 216 Allgemeine Schutzverletzung
Hier die frm_about, aber die geht ja, wenn sie beim Start eingebunden wird:
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);
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.
Re: runtime Error 210
OK, das ist ein schöner Fehler, der zeigt, was passiert, wenn man die Formularvariable mit in den Code des Formulars schreibt:
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:
Leider sieht man diesen Fehler immer wieder hier im Forum!
Code: Alles auswählen
procedure Tfrmabout.FormCreate(Sender: TObject);
begin
Label1.Caption := 'Programmname: ' + ApplicationName;
frmabout.Caption := 'Über ' + ApplicationName;
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!
-
- 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
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:
auch hier muss 'frmabout.' weg, sonst knallt es beim Schließen der Form
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;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.