Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Was ist falsch am Aufruf und Freigaben von Create (https://www.delphipraxis.net/203310-ist-falsch-am-aufruf-und-freigaben-von-create.html)

NoName1 4. Feb 2020 18:35

Delphi-Version: 10.2 Tokyo

Was ist falsch am Aufruf und Freigaben von Create
 
Guten Tag Entwickler,
ich bin angefangen mich mit Modulen zu beschäftigen.
Im Programm habe ich für die Hilfe zu den einzelnen Formularen, es sind 27 Formulare, ein Modul "ModulHilfe" erstellt.
Weil das Modul in jedem Formular benötigt wird, lasse ich es automatisch beim Programmstart mit erzeugen:
Delphi-Quellcode:
ModulHilfe in 'DatenModule\ModulHilfe.pas' {MoHilfe: TDataModule};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TdtmdMain, dtmdMain);
  Application.CreateForm(TMoEMail, MoEMail);
  ... und noch Anderes
 
   Application.Run;
end.
Im Modul TMOHilfe steht folgendes im public

Delphi-Quellcode:
public
    { Public-Deklarationen }
    constructor Create;
    procedure Hilfe(aNutzerID: Int64; aPrgTeil, aHauptSeite, aUnterseite: SmallInt);
  end;
und im Create-Ereignis folgendes:
Delphi-Quellcode:
constructor TMoHilfe.Create;
begin
  GlobalPfad := TAppConstants.GetGlobalPath;
  PfadHandBuch := TAppConstants.GetHandBuchPfad;
end;

In den Formularen wird die Hilfe in der Unit-Klausel so angegeben:
Delphi-Quellcode:
implementation
uses
  DatenModulMain,
  ModulSonstigeDrucke,
  ModulHilfe,
 ....

und im OnCreate-Ereignis des Formulares so erzeugt:
Delphi-Quellcode:
MoHilfe.Create;

Im Destroy-Ereignis wird es so freigegeben:
Delphi-Quellcode:
MoHilfe.Free;


Die Hilfe wird dann im Formular so aufgerufen:
Delphi-Quellcode:
MoHilfe.Hilfe(NutzerID, 17, 0, 0);

Das Problem ist nun folgendes:
Beim ersten Aufruf des Formulares kann ich die Hilfe aufrufen.
Wenn ich aber das Formular schliesse und danach erneut aufrufe, wird sofort eine
Zugriffsverletzung bei Adresse 0100D47D in Modul 'Loge.exe'. Schreiben von Adresse 000000A0.
geworfen.

Wenn ich aber das "MoHilfe.Free" im Formular nicht setze, dann kann ich das Formular ohne Absturz
immer wieder aufrufen.

Was mache ich falsch? Wo liegt mein Gedankenfehler?

Sollte diese Frage hier nicht in die Kategorie passen, so bitte ich den Admin sie in die richtige zu verschieben.

Vielen Dank im Voraus für Eure evtl. Hilfe.

Uwe Raabe 4. Feb 2020 18:46

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Delphi-Quellcode:

MoHilfe.Create;

Das geht so nicht! So muss das lauten:
Delphi-Quellcode:

MoHilfe := TMoHilfe.Create;

himitsu 4. Feb 2020 21:26

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Und wo ist die Variable MoHilfe deklariert?



Zitat:

und im OnCreate-Ereignis des Formulares so erzeugt
Wie auch bei Formularen muß nicht alles "dauehaft" sofort erzeugt werden und dann die meiste Zeit (wenn nicht sogar fast immer) sinnlos im Hintergrund rumgammeln.

Man kann sowas auch erst dann erstellen, wenn es benötigt wird und anschließend wieder freigeben


Gerade die Hilfe wird von Usern ja praktisch niemals benutzt. (Erfahrung vieler Entwickler)

Lemmy 4. Feb 2020 21:28

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Zitat:

Zitat von NoName1 (Beitrag 1456704)
Guten Tag Entwickler,
ich bin angefangen mich mit Modulen zu beschäftigen.
Im Programm habe ich für die Hilfe zu den einzelnen Formularen, es sind 27 Formulare, ein Modul "ModulHilfe" erstellt.
Weil das Modul in jedem Formular benötigt wird, lasse ich es automatisch beim Programmstart mit erzeugen:
Delphi-Quellcode:
ModulHilfe in 'DatenModule\ModulHilfe.pas' {MoHilfe: TDataModule};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TdtmdMain, dtmdMain);
  Application.CreateForm(TMoEMail, MoEMail);
  ... und noch Anderes
 
   Application.Run;
end.

wenn Du das automatisch beim Programmstart erzeugen lässt, dann musst Du das weder später im Verlauf nochmal erzeugen noch freigeben - dafür ist dann die Anwendung verantwortlich...

Luckie 4. Feb 2020 21:37

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Ergänzend zu Lemmy: Ein Aufrufen der Methode Show vom Formular reicht dann.

Aber du hast doch selbst geschrieben, dass du es von der Anwendung automatisch erzeugen lässt. Warum erzeugst du es doch noch mal selbst? Mal ganz davon abgesehen, dass, so wie du es machst, es falsch ist. Und dann gibst du es frei und wunderst dich, dass ein erneuter Aufruf zu einem Fehler führt?

p80286 5. Feb 2020 07:34

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Wahrscheinlich ist ihm der Unterschied zwischen .Close und .Hide nicht bekannt.

Gruß
K-H

NoName1 5. Feb 2020 07:35

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Danke an allen die mit geantwortet haben.
Nun habe ich etwas dazu gelernt.
Ich habe das Create und das Free aus dem Formular herausgenommen und siehe da es funktioniert.

Einen schönen Tag an alle Entwickler

Klaus01 5. Feb 2020 07:40

AW: Was ist falsch am Aufruf und Freigaben von Create
 
.. wenn Du es denn doch noch dynamisch erstellen willst..
Delphi-Quellcode:
moHilfe := TMoHilfe.create(nil);
try
  moHilfe.show;
  // oder
  // moHilfe.showModal;
finally
  moHilfe.free;
end;
Grüße
Klaus

Sherlock 5. Feb 2020 07:46

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Ich dachte, es geht hier um ein TDataModule? Was gibt es da zu Showen oder Hiden?

Sherlock

jaenicke 5. Feb 2020 08:46

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Zitat:

Zitat von Klaus01 (Beitrag 1456717)
.. wenn Du es denn doch noch dynamisch erstellen willst..
Delphi-Quellcode:
moHilfe := TMoHilfe.create(nil);
try
  moHilfe.show;
  // oder
  // moHilfe.showModal;
finally
  moHilfe.free;
end;

Show kehrt (im Gegensatz zu ShowModal) sofort zurück, von daher erzeugt der Code eine Instanz der Klasse, ruft kurz Show auf und gibt dann die Instanz wieder frei. Das Formular, wenn es eins ist, blitzt also nur kurz auf. ;-)

Klaus01 5. Feb 2020 09:11

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Zitat:

Zitat von jaenicke (Beitrag 1456722)
Zitat:

Zitat von Klaus01 (Beitrag 1456717)
.. wenn Du es denn doch noch dynamisch erstellen willst..
Delphi-Quellcode:
moHilfe := TMoHilfe.create(nil);
try
  moHilfe.show;
  // oder
  // moHilfe.showModal;
finally
  moHilfe.free;
end;

Show kehrt (im Gegensatz zu ShowModal) sofort zurück, von daher erzeugt der Code eine Instanz der Klasse, ruft kurz Show auf und gibt dann die Instanz wieder frei. Das Formular, wenn es eins ist, blitzt also nur kurz auf. ;-)

Da hast Du natürlich recht..

DieDolly 5. Feb 2020 09:13

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Am einfachsten ist es noch immer Formulare zu erstellen wenn man sie braucht und einfach bis zum Programmende im Speicher zu lassen.
Dann braucht man auch kein ShowModal :P

Luckie 5. Feb 2020 09:18

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Dann weißt du nicht, was ShowModal tut. Es stoppt den weiteren Programmablauf im aufrufenden Fenster und lässt nur Eingaben im mit ShowModal angezeigten Fenster zu. Das aufrufende Fenster ist währenddessen blockiert und man muss erst das modale Fenster schließen, um im aufrufenden Fenster weiter arbeiten zu können.

einbeliebigername 5. Feb 2020 09:19

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Hallo,

Zitat:

Zitat von NoName1 (Beitrag 1456704)
Im Modul TMOHilfe steht folgendes im public

Delphi-Quellcode:
public
    { Public-Deklarationen }
    constructor Create;
    procedure Hilfe(aNutzerID: Int64; aPrgTeil, aHauptSeite, aUnterseite: SmallInt);
  end;
und im Create-Ereignis folgendes:
Delphi-Quellcode:
constructor TMoHilfe.Create;
begin
  GlobalPfad := TAppConstants.GetGlobalPath;
  PfadHandBuch := TAppConstants.GetHandBuchPfad;
end;

Der Constructor ist auch falsch. Er muss so sein:

Delphi-Quellcode:
public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
  end;
Delphi-Quellcode:
constructor TMoHilfe.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  GlobalPfad := TAppConstants.GetGlobalPath;
  PfadHandBuch := TAppConstants.GetHandBuchPfad;
end;
Sonst wird er vom
Delphi-Quellcode:
Application.CreateForm
nicht benutzt. Und ohne das
Delphi-Quellcode:
inherited
ist so ein Constructor bei einem DatenModul überhaupt nicht zu gebrauchen.

DieDolly 5. Feb 2020 09:35

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Zitat:

Dann weißt du nicht, was ShowModal tut
Was ShowModal macht ist mir schon klar. Ich selber finde modale Fenster nur nicht schön. Ich erzeuge meine Formularinstanzen immer einmal und gebe sie erst am Programmende wieder frei. Das alles wird über eine Art Manager gemanaged.

Sherlock 5. Feb 2020 10:10

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Zitat:

Zitat von DieDolly (Beitrag 1456727)
Zitat:

Dann weißt du nicht, was ShowModal tut
Was ShowModal macht ist mir schon klar. Ich selber finde modale Fenster nur nicht schön. Ich erzeuge meine Formularinstanzen immer einmal und gebe sie erst am Programmende wieder frei. Das alles wird über eine Art Manager gemanaged.

Das eine hat mit dem anderen aber nichts zu tun. Und sichtbare Formulare mit diesem Thread schon mal gar nichts. :roll:

Sherlock

p80286 5. Feb 2020 12:42

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Zitat:

Zitat von Sherlock (Beitrag 1456728)

Und sichtbare Formulare mit diesem Thread schon mal gar nichts. :roll:

Wieso denn das? Ich denke es geht um eine Hilfe-Anzeige, hab ich da was mi´ßverstanden?

Gruß
K-H

Sherlock 6. Feb 2020 09:24

AW: Was ist falsch am Aufruf und Freigaben von Create
 
Ich weiß nach dreimaligem Lesen des Threads offengesagt nicht mehr worum es geht. Es wurde im ersten Post von Modulen gesprochen, und mit einem TDataModule der Sourcecode eingeleitet. Dieses TDatamodule heisst auch MoHilfe oder sowas. Dann geht es plötzlich mit Formularen weiter und dann hat es mich verloren...

Eventuell kommt nochmal etwas vom OP.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 Uhr.

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