Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Selbst erzeugtes Formular schließt sich automatisch (https://www.delphipraxis.net/191907-selbst-erzeugtes-formular-schliesst-sich-automatisch.html)

Hobbycoder 2. Mär 2017 10:41

Delphi-Version: 10 Berlin

Selbst erzeugtes Formular schließt sich automatisch
 
Hi Leute,

ich habe ein Formular, dass ich zur Laufzeit ggf. mehrfach für Datenerfassung nutzen will (Also soll sich diese Fenster mehrfach öffnen können).
Diese Formular wird in der IDE fertig gestaltet, aber nicht automatisch erzeugt.

Mein Problem ist, dass es immer nur kurz aufblitzt, dann aber sofort verschwindet. Bei beenden der Application kommt es dann zu einer Zugriffsverletzung, da das Formular wohl nicht mehr da ist.

Das Erzeugen findet in dem Event IdTCPServer1Execute statt. Hier mal der Code:
Delphi-Quellcode:
procedure Tfrm_mainCL.IdTCPServer1Execute(AContext: TIdContext);
var
  DataStream, FileStream : TStream;
  Testfrm: Tfrm_TestCL;
begin
  tempfile:=GetTempDir+FormatDateTime('yyyymmddhhnnsszzz', Now)+'.dat';
  DataStream := TMemoryStream.Create;
  FileStream := TFileStream.Create(tempfile, fmCreate);
  try
    AContext.Connection.Socket.ReadStream(DataStream, -1, true);
    //ShowMessage(Format('Es wurden %d Byte empfangen', [DataStream.Size]));
    DataStream.Position := 0;
    FileStream.CopyFrom(DataStream, DataStream.Size);
    FileStream.Free;
    DataStream.Free;
    Testfrm:=Tfrm_TestCL.Create(Application);
    Testfrm.edt_Name.Text:='';
    Testfrm.edt_AZ.Text:='';
    Testfrm.chk_returnWithDocument.Checked:=Settings.ReturnWithDocument;
    Testfrm.Show;
//    with Tfrm_TestCL.Create(Application) do                      //So habe ich es auch versucht, gleicher Fehler
//    begin
//      edt_Name.Text:='';
//      edt_AZ.Text:='';
//      chk_returnWithDocument.Checked:=Settings.ReturnWithDocument;
//      Show;
//    end;
  except
    FileStream.Free;
    DataStream.Free;
  end;
end;
Im TestCL-Formular wird es dann über Action:=caFree freigegeben. So ist zumindest der Plan.

Hat einer einen Tipp, was ich hier falsch mache?

Gruß Hobbycoder

sakura 2. Mär 2017 10:43

AW: Selbst erzeugtes Formular schließt sich automatisch
 
Das Problem dürfte sein, dass Du das Formular außerhalb des Main-VCL-Threads der Anwendung erzeugst. Ein IdTCPServerExecute wird i.A. in einem eigenen Thread aufgerufen.

Teste mal den Code außerhalb der Methode (soweit möglich) in einem Button-OnClick Event, o.ä..

...:cat:...

Aviator 2. Mär 2017 10:45

AW: Selbst erzeugtes Formular schließt sich automatisch
 
Verschiebe mal die Deklaration deiner Form-Variablen (Testfrm) in den
Delphi-Quellcode:
private
Abschnitt deiner Klasse. Dein Formular wird automatisch freigegeben, da beim Verlassen der Procedure der Scope auf die Variable wegfällt. So zumindest meine Vermutung.

Denk aber daran, dass du das Formular mit
Delphi-Quellcode:
Testfrm.Free
auch wieder freigibst.

Hobbycoder 2. Mär 2017 10:48

AW: Selbst erzeugtes Formular schließt sich automatisch
 
Danke Sakura,

über einen Button funktionierts ;-)
Nur wie könnte ich dann diese Formular innerhalb der Execute-Routine erzeugen lassen? Wäre per Windows-Message eine gute Idee?

Hobbycoder 2. Mär 2017 10:50

AW: Selbst erzeugtes Formular schließt sich automatisch
 
Zitat:

Zitat von Aviator (Beitrag 1363007)
Verschiebe mal die Deklaration deiner Form-Variablen (Testfrm) in den
Delphi-Quellcode:
private
Abschnitt deiner Klasse. Dein Formular wird automatisch freigegeben, da beim Verlassen der Procedure der Scope auf die Variable wegfällt. So zumindest meine Vermutung.

Denk aber daran, dass du das Formular mit
Delphi-Quellcode:
Testfrm.Free
auch wieder freigibst.

Im Grunde benötige ich die Variable gar nicht, hab ich nur zum testen gemacht.

Das Formular gibt sich selbst frei (hab ich aber oben geschrieben).
Und wenn ich mehrere Instanzen gleichzeitig anzeigen will, aber nur eine Variable dafür habe, wäre das mit dem Freigeben aus dem Hauptformular später ein Problem.

sakura 2. Mär 2017 11:00

AW: Selbst erzeugtes Formular schließt sich automatisch
 
Zitat:

Zitat von Hobbycoder (Beitrag 1363008)
Nur wie könnte ich dann diese Formular innerhalb der Execute-Routine erzeugen lassen? Wäre per Windows-Message eine gute Idee?

Der korrekte Weg wird in der ersten Antwort aufgeführt: http://stackoverflow.com/questions/1...rvertcpexecute

...:cat:...

Hobbycoder 2. Mär 2017 11:16

AW: Selbst erzeugtes Formular schließt sich automatisch
 
Danke,

ich hatte es eben schon über PostMessage funktionsfähig, aber die die dort aufgeführte Lösung erscheint mir eleganter.
Gruß Hobbycoder


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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