Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler im FormCreate (https://www.delphipraxis.net/82257-fehler-im-formcreate.html)

MarvinM 9. Dez 2006 16:25


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:
procedure THaupt.Datei_NeutralClick(Sender: TObject);
begin
  TNeutral.Create(haupt);
end;
und dann den FormCreate ausführe

Delphi-Quellcode:
procedure TNeutral.FormCreate(Sender: TObject);
begin
  Zeichne := TZeichnen.Create;

  FehlerLabel.Caption := '';
  Zeichne.Enable(false);
end;
dann funktioniert die erste Anweisung (also das FehlerLabel.Caption := '';) einwandfrei, aber wenn ich nun Zeichne.Enable aufrufe, wird dies ausgeführt:

Delphi-Quellcode:
procedure TZeichnen.Enable(Direction: Boolean);
begin
  with Neutral do
  begin
    EDecAnzAtomMitOH.Enabled := direction;
    EDecAnzOH.Enabled := direction;
    [und noch mehr davon]
  end;
end;
Der Fehler (eine EAccessViolation) tritt in der ersten Zeile auf (also EDecAnzAtomMitOH.Enabled := direction;)
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!

mkinzler 9. Dez 2006 16:28

Re: Fehler im FormCreate
 
Meine Antwort beliebt die Selbe:

Ersetze

Zitat:

Delphi-Quellcode:
TNeutral.Create(haupt);

durch
Delphi-Quellcode:
Neutral := TNeutral.Create(Self);

MarvinM 9. Dez 2006 16:33

Re: Fehler im FormCreate
 
Leider bleibt aber auch durch diese Methode Neutral nil...

mkinzler 9. Dez 2006 16:36

Re: Fehler im FormCreate
 
Wo hast du Neutral deklariert?

MarvinM 9. Dez 2006 16:39

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:
implementation

uses
  uNeutral;
Also nicht direkt deklariert...

//EDIT:

Unt in der Unit von der aus das Formular aufgerufen wird (uHaupt) hier:

Delphi-Quellcode:
interface

uses
  uNeutral;

mkinzler 9. Dez 2006 16:42

Re: Fehler im FormCreate
 
Dann sollte es eigentlich gehen.
Hat du WebAnzeige im Konstruktor von TNeutral erzeugt?

MarvinM 9. Dez 2006 16:44

Re: Fehler im FormCreate
 
TNeutral hat bei mir keinen Konstruktor - daher nein.

mkinzler 9. Dez 2006 16:45

Re: Fehler im FormCreate
 
Dann erstelle einen.

MarvinM 9. Dez 2006 16:50

Re: Fehler im FormCreate
 
Ähm... wie müsst der aussehen :oops: ?

mkinzler 9. Dez 2006 17:11

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;

MarvinM 9. Dez 2006 17:15

Re: Fehler im FormCreate
 
Irgendwie unterstützt mein Delphi 5 das hier nicht:

Delphi-Quellcode:
constructor TNeutral.Create(AOwner self);
AOwner self - Ich glaube da liegts dran.

Kann das sein?

mkinzler 9. Dez 2006 17:17

Re: Fehler im FormCreate
 
Da hab ich wohl das falsche kopiert:
Delphi-Quellcode:
 constructor TNeutral.Create(AOwner: TObject);

MarvinM 9. Dez 2006 17:23

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:
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;
Hab ich wieder die AccessViolation.

Wenn ich beim inherited Create statt AOwner self mitgebe, bekomme ich einen StackOverflow Error

mkinzler 9. Dez 2006 17:25

Re: Fehler im FormCreate
 
Dann ersetze mal
Delphi-Quellcode:
Neutral := TNeutral.Create(haupt);
durch
Delphi-Quellcode:
Neutral := TNeutral.Create(Nil);

MarvinM 9. Dez 2006 17:27

Re: Fehler im FormCreate
 
Ändert leider nur, dass ich keinen Stack-Overflow sonder wieder die AccessViolation bekomme...

mkinzler 9. Dez 2006 17:29

Re: Fehler im FormCreate
 
Schau mal im Debugger, wo der Fehler genau auftritt.

MarvinM 9. Dez 2006 17:32

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.

mkinzler 9. Dez 2006 17:35

Re: Fehler im FormCreate
 
Existiert den haupt zu diesem Zeitpunkt schon?

MarvinM 9. Dez 2006 17:36

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.

mkinzler 9. Dez 2006 17:49

Re: Fehler im FormCreate
 
Poste mal das ganze Programm

MarvinM 9. Dez 2006 18:01

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:
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.
Der Quellcode von uNeutral:

Delphi-Quellcode:
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.
Und zu Guter letzt der Code von uFrontEndNeutral:

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.

mkinzler 9. Dez 2006 18:03

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);

MarvinM 9. Dez 2006 18:08

Re: Fehler im FormCreate
 
ja in der uHaupt hab ich was vergessen, die richtige Deklaration sieht so aus:

Delphi-Quellcode:
type
  THaupt = class(TForm)
    MainMenu1: TMainMenu;
    Datei_Neutral: TMenuItem;

    procedure Datei_NeutralClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    WebAnzeige: TStringList;
  end;
Ja ich hab Haupt durch self ersetzt, bringt aber auch keinen Erfolg

mkinzler 9. Dez 2006 18:17

Re: Fehler im FormCreate
 
Zitat:

Ja ich hab Haupt durch self ersetzt, bringt aber auch keinen Erfolg
War auch eine allgemeine Bemerkung, weil hiermit ja eine bestimmte Instanz der klasse referenziert wird und nicht die gearde aktive.

Wo ist FehlerLabel deklariert? ist es eine Komponente, die auf der Form liegt?

MarvinM 9. Dez 2006 18:20

Re: Fehler im FormCreate
 
FehlerLabel ist ein StaticText, der auf dem Formular Neutral liegt.

Damit ist FehlerLabel auch in der Klasse TNeutral deklariert.

mkinzler 9. Dez 2006 18:23

Re: Fehler im FormCreate
 
Wo ist Zeichne deklariert? Vielliecht wäre .Loaded besser als .FormCreate

MarvinM 9. Dez 2006 18:29

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:
var
  Neutral: TNeutral;

  Zeichne: TZeichnen;
TZeichnen ist in der uFrontEndNeutral (Code weiter oben im Thread) deklariert.

mkinzler 9. Dez 2006 18:33

Re: Fehler im FormCreate
 
Zitat:

Gibt es ein OnLoad Procedure bei einem Formular? Bei mir sehe ich im ObjectInspector keins. Oder steht das wo anders?
Dies ist niht published. Sie wird aufgerufen, wenn alle Eigenschaften der Unterkomponenten aus der .dfm wiederhergestellt sind.

MarvinM 9. Dez 2006 18:39

Re: Fehler im FormCreate
 
Und wo find ich die? Oder muss ich die selber erstellen, wenn ja wo? :oops:

mkinzler 9. Dez 2006 18:41

Re: Fehler im FormCreate
 
Einfach ne Methode deklarieren die Loaded heißt.

MarvinM 9. Dez 2006 18:48

Re: Fehler im FormCreate
 
Alles klar, dann funktioniert alles!!

Vielen, vielen Dank dir!!!

winnionkel 14. Dez 2006 19:17

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:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Da stimmt doch in Delphi was nicht, oder ?

mkinzler 14. Dez 2006 19:33

Re: Fehler im FormCreate
 
Zitat:

Da stimmt doch in Delphi was nicht, oder ?
Was<soll den nicht Stimmen? Er ruft nur dann .Destroy auf, wenn das Objekt nch existiert.

winnionkel 14. Dez 2006 19:46

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.

mkinzler 14. Dez 2006 19:52

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.

winnionkel 14. Dez 2006 19:58

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 ??

mkinzler 14. Dez 2006 20:07

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.

winnionkel 14. Dez 2006 20:15

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...

mkinzler 14. Dez 2006 20:17

Re: Fehler im FormCreate
 
Ja, muß aber nicht.

Christian Seehase 14. Dez 2006 22:59

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 14:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz