![]() |
Fehler im FormCreate
Hallo zusammen!
Ich habe ein Problem beim Öffnen eines anderen Formulars: Wenn ich mit diesem Code ein Formular aufrufe (das hier heißt Neutral)
Delphi-Quellcode:
und dann den FormCreate ausführe
procedure THaupt.Datei_NeutralClick(Sender: TObject);
begin TNeutral.Create(haupt); end;
Delphi-Quellcode:
dann funktioniert die erste Anweisung (also das FehlerLabel.Caption := '';) einwandfrei, aber wenn ich nun Zeichne.Enable aufrufe, wird dies ausgeführt:
procedure TNeutral.FormCreate(Sender: TObject);
begin Zeichne := TZeichnen.Create; FehlerLabel.Caption := ''; Zeichne.Enable(false); end;
Delphi-Quellcode:
Der Fehler (eine EAccessViolation) tritt in der ersten Zeile auf (also EDecAnzAtomMitOH.Enabled := direction;)
procedure TZeichnen.Enable(Direction: Boolean);
begin with Neutral do begin EDecAnzAtomMitOH.Enabled := direction; EDecAnzOH.Enabled := direction; [und noch mehr davon] end; end; Wenn ich mir nun den Debugger zu Neutral ansehe steht da nil. Wenn ich nun das Formular direkt unter Projekt|Optionen|Formulare beim Start erzeigen lasse, kommt keine Fehlermeldung. Die Unit (uFrontEndNeutral), in der TZeichnen deklariert ist, ist unter interface eingetragen. Und in uFrontEndNeutral ist die uNeutral unter impletmentation eingetragen. Danke schonmal für eure Antworten! |
Re: Fehler im FormCreate
Meine Antwort beliebt die Selbe:
Ersetze Zitat:
Delphi-Quellcode:
Neutral := TNeutral.Create(Self);
|
Re: Fehler im FormCreate
Leider bleibt aber auch durch diese Methode Neutral nil...
|
Re: Fehler im FormCreate
Wo hast du Neutral deklariert?
|
Re: Fehler im FormCreate
Also in der uNeutral hier:
Delphi-Quellcode:
type
TNeutral = class(TForm) [...] private { Private-Deklarationen } public WebAnzeige: TStringList; end; var Neutral: TNeutral; Und in der anderen Unit (die in der TZeichnen deklariert ist) hier:
Delphi-Quellcode:
Also nicht direkt deklariert...
implementation
uses uNeutral; //EDIT: Unt in der Unit von der aus das Formular aufgerufen wird (uHaupt) hier:
Delphi-Quellcode:
interface
uses uNeutral; |
Re: Fehler im FormCreate
Dann sollte es eigentlich gehen.
Hat du WebAnzeige im Konstruktor von TNeutral erzeugt? |
Re: Fehler im FormCreate
TNeutral hat bei mir keinen Konstruktor - daher nein.
|
Re: Fehler im FormCreate
Dann erstelle einen.
|
Re: Fehler im FormCreate
Ähm... wie müsst der aussehen :oops: ?
|
Re: Fehler im FormCreate
Delphi-Quellcode:
type
TNeutral = class(TForm) [...] private { Private-Deklarationen } public WebAnzeige: TStrings; constructor Create( AOwner: TObject); end; ... constructor TNeutral.Create(AOwner self); begin inherited Create( AOwner); WebAnzeige := TStringList.Create; end; |
Re: Fehler im FormCreate
Irgendwie unterstützt mein Delphi 5 das hier nicht:
Delphi-Quellcode:
AOwner self - Ich glaube da liegts dran.
constructor TNeutral.Create(AOwner self);
Kann das sein? |
Re: Fehler im FormCreate
Da hab ich wohl das falsche kopiert:
Delphi-Quellcode:
constructor TNeutral.Create(AOwner: TObject);
|
Re: Fehler im FormCreate
Jetzt bekomme ich einen Compiler-Fehler, der besagt, dass inherited Create eine TComponent mitgegeben haben will und AOwner ist ja TObject
Wenn ich nun die Deklaration in TObject änder:
Delphi-Quellcode:
Hab ich wieder die AccessViolation.
type
TNeutral = class(TForm) [...] private { Private-Deklarationen } public WebAnzeige: TStrings; constructor Create( AOwner: TComponent); end; ... constructor TNeutral.Create(AOwner: TComponent); begin inherited Create(AOwner); WebAnzeige := TStringList.Create; end; Wenn ich beim inherited Create statt AOwner self mitgebe, bekomme ich einen StackOverflow Error |
Re: Fehler im FormCreate
Dann ersetze mal
Delphi-Quellcode:
durch
Neutral := TNeutral.Create(haupt);
Delphi-Quellcode:
Neutral := TNeutral.Create(Nil);
|
Re: Fehler im FormCreate
Ändert leider nur, dass ich keinen Stack-Overflow sonder wieder die AccessViolation bekomme...
|
Re: Fehler im FormCreate
Schau mal im Debugger, wo der Fehler genau auftritt.
|
Re: Fehler im FormCreate
Ich denke, dass der Fehler beim Zuweisen, also bei Neutral := TNeutral.Create(haupt); auftritt, denn nach dieser Anweisung ist Neutral immernoch nil, was ja normalerweise nicht so sein sollte, damit ist es dann auch logisch, dass beim Zugriff auf diese Komponenten eine Access-Violation kommt.
Die Frage ist nur, wie ich verhindern kann, dass Neutral nach der Zuweisung immernoch nil ist... //EDIT: Denn die Fehlermeldung kommt beim Zugriff auf das Formular. |
Re: Fehler im FormCreate
Existiert den haupt zu diesem Zeitpunkt schon?
|
Re: Fehler im FormCreate
ja tut es, in einem Menü gibt es für den Benutzer die Möglichkeit den anderen Programmteil (in TNeutral) aufzurufen.
|
Re: Fehler im FormCreate
Poste mal das ganze Programm
|
Re: Fehler im FormCreate
Du wirst bestimmt Verständnis dafür haben, dass ich nicht den Quellcode meines Jugend-forscht Projekts komplett offenlege, aber soweit:
Der Code des Hauptformulares:
Delphi-Quellcode:
Der Quellcode von uNeutral:
unit uHaupt;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, ExtCtrls, ComCtrls, Menus, Buttons, OleCtrls, SHDocVw, IniFiles, uNeutral; type THaupt = class(TForm) procedure THaupt.Datei_NeutralClick(Sender: TObject); begin Neutral := TNeutral.Create(Haupt); end; end.
Delphi-Quellcode:
Und zu Guter letzt der Code von uFrontEndNeutral:
unit uNeutral;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, uFrontEndNeutral, OleCtrls, SHDocVw, Menus; type TNeutral = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public WebAnzeige: TStrings; constructor Create( AOwner: TComponent); end; var Neutral: TNeutral; Zeichne: TZeichnen; implementation {$R *.DFM} constructor TNeutral.Create(AOwner: TComponent); begin inherited Create(AOwner); WebAnzeige := TStringList.Create; end; procedure TNeutral.FormCreate(Sender: TObject); begin Zeichne := TZeichnen.Create; FehlerLabel.Caption := ''; Zeichne.Enable(false); end; end.
Delphi-Quellcode:
unit uFrontEndNeutral;
interface uses classes, UKonstante, Graphics, SysUtils, FileCtrl; type TZeichnen = class(TObject) public procedure Enable(Direction: Boolean); end; implementation uses uNeutral; procedure TZeichnen.Enable(Direction: Boolean); begin with Neutral do begin EDecAnzAtomMitOH.Enabled := direction; EDecAnzOH.Enabled := direction; EIncAnzAtomMitOH.Enabled := direction; EIncAnzOH.Enabled := direction; SDecAnzSaeure.Enabled := direction; SDecAnzH.Enabled := direction; SIncAnzSaeure.Enabled := direction; SIncAnzH.Enabled := direction; ChkAnzMolekuele.Enabled := direction; ChkAnzTeile.Enabled := direction; HintAnzTeile.Enabled := Direction; HintAnzMolekuele.Enabled := direction; React.Enabled := Direction; EDecAnzAtomMitOH.Enabled := direction; EDecAnzOH.Enabled := direction; end; end; end. |
Re: Fehler im FormCreate
Hast du an Zeile 11ff was wegglassen?
Ersetze das haupt in Zeile 15 besser durch Self. in
Delphi-Quellcode:
procedure TZeichnen.Enable(Direction: Boolean; Neutral: TNeutral); |
Re: Fehler im FormCreate
ja in der uHaupt hab ich was vergessen, die richtige Deklaration sieht so aus:
Delphi-Quellcode:
Ja ich hab Haupt durch self ersetzt, bringt aber auch keinen Erfolg
type
THaupt = class(TForm) MainMenu1: TMainMenu; Datei_Neutral: TMenuItem; procedure Datei_NeutralClick(Sender: TObject); private { Private-Deklarationen } public WebAnzeige: TStringList; end; |
Re: Fehler im FormCreate
Zitat:
Wo ist FehlerLabel deklariert? ist es eine Komponente, die auf der Form liegt? |
Re: Fehler im FormCreate
FehlerLabel ist ein StaticText, der auf dem Formular Neutral liegt.
Damit ist FehlerLabel auch in der Klasse TNeutral deklariert. |
Re: Fehler im FormCreate
Wo ist Zeichne deklariert? Vielliecht wäre .Loaded besser als .FormCreate
|
Re: Fehler im FormCreate
Gibt es ein OnLoad Procedure bei einem Formular? Bei mir sehe ich im ObjectInspector keins. Oder steht das wo anders?
Zeichne ist in der uNeutral hier deklariert:
Delphi-Quellcode:
TZeichnen ist in der uFrontEndNeutral (Code weiter oben im Thread) deklariert.
var
Neutral: TNeutral; Zeichne: TZeichnen; |
Re: Fehler im FormCreate
Zitat:
|
Re: Fehler im FormCreate
Und wo find ich die? Oder muss ich die selber erstellen, wenn ja wo? :oops:
|
Re: Fehler im FormCreate
Einfach ne Methode deklarieren die Loaded heißt.
|
Re: Fehler im FormCreate
Alles klar, dann funktioniert alles!!
Vielen, vielen Dank dir!!! |
Re: Fehler im FormCreate
Das ist jetzt schon der zweite Thread, wo ich das selbe Problem sehe.
Ich erzeuge auch einige Objekte mit dem Parameter 'self'. Und bekomme Fehlermeldungen. Aber nicht auf jedem Rechner. Wenn ich in Delphi nach der Adresse des Fehlers suche, springt Delphi in die Unit System an folgende Procedure:
Delphi-Quellcode:
Da stimmt doch in Delphi was nicht, oder ?
procedure TObject.Free;
begin if Self <> nil then Destroy; end; |
Re: Fehler im FormCreate
Zitat:
|
Re: Fehler im FormCreate
Sorry, hab mich vielleicht falsch ausgedrückt.
Anscheinend ist die Variable 'Self' nicht nil. Aber wenn er versucht die zu destroyen, dann kommt ein RunTime Error. Zumindest springt Delphi an diese Stelle, wenn ich die Adresse des Runtime Fehlers eingebe. |
Re: Fehler im FormCreate
Wenn eine Variable nicht Nil ist, heißt das aber nicht daß an der Adresse, auf die der Zeiger/die Referenz verweist, auch ein Objekt dieses Typs steht.
Möglicherweise wurde das Objekt schon an anderer Stelle freigegeben ohne das die Referenz auf Nil gesetzt wure. Deshalb lieber FreeAndNil() aufrufen oder Referenz manuell auf Nil setzen. |
Re: Fehler im FormCreate
Ja Danke. Das wird das Problem sein, da auf manchen Rechnern das Prog läuft, und auf anderen wieder nicht.
Oder habe ich da jetzt schon wieder nen Denkfehler ?? |
Re: Fehler im FormCreate
Könnte ein möglicher Grund ein, denn ein Zugriff auf ein bereits zerstörtes Objekt muß ja nicht in einer Zugriffsverletzung münden.
|
Re: Fehler im FormCreate
Kann ein Laufzeitfehler entstehen, wenn das Objekt nicht nil ist und ich rufe Free auf ?
Dann würde mir so einiges klar... |
Re: Fehler im FormCreate
Ja, muß aber nicht.
|
Re: Fehler im FormCreate
Moin winnionkel,
am Besten Du gewöhnst Dir an nachdem Du eine Resource belegst auch gleich dessen Freigabe zu schreiben, dann kannst Du es nicht später vergessen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz