Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TForm.Close (https://www.delphipraxis.net/14378-tform-close.html)

galex 8. Jan 2004 10:30

Re: TForm.Close
 
Zitat:

Hide macht das Formular nur unsichtbar, schließt es baer nicht, dies tut nur, wie der Name auch schon sagt, Close();.
Richtig! Und was will man genau mit Close(); erreichen?
Ich denke die Frage muß genau definiert werden.


Zitat:

Das Ereignis OnClose wird beim Schließen des Formulars ausgelöst.

Delphi-Syntax:

type
TCloseAction = (caNone, caHide, caFree, caMinimize);
TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;
property OnClose: TCloseEvent;

Beschreibung

Mit OnClose können Sie spezielle Verarbeitungen durchführen, wenn das Formular geschlossen wird. Das Ereignis OnClose legt fest, welche Ereignisbehandlungsroutine beim Schließen eines Formulars aufgerufen werden soll. Sie können in der zugehörigen Ereignisbehandlungsroutine beispielsweise prüfen, ob in allen Feldern eines Dateneingabeformulars gültige Eingaben vorgenommen wurden.

Ein Formular wird geschlossen, nachdem die Methode Close aufgerufen oder im Systemmenü die Option Schließen gewählt wurde.

Der Typ TCloseEvent zeigt auf eine Methode, die für das Schließen des Formulars zuständig ist. Der Parameter Action bestimmt, ob das Formular tatsächlich geschlossen wird. Er kann die folgenden Werte annehmen:

Code Bedeutung

caNone Das Formular darf nicht geschlossen werden, daher geschieht nichts.
caHide Das Formular wird nicht geschlossen, sondern lediglich verborgen. Die Anwendung kann nach wie vor auf das Formular zugreifen.
caFree Das Formular wird geschlossen und sein Speicher freigegeben.
caMinimize Das Formular wird nicht geschlossen, sondern als Symbol angezeigt. Bei untergeordneten MDI-Formularen ist dies die Standardeinstellung.

Enthält bei einem untergeordneten MDI-Formular die Eigenschaft BorderIcons den Wert biMinimize, wird caMinimize als Standardaktion verwendet. Ist diese Eigenschaft nicht gesetzt, erhält Action den Standardwert caNone, und beim Schließen des Formulars werden keine speziellen Verarbeitungen durchgeführt.

Bei einem untergeordneten SDI-Formular wird Action der Standardwert caHide zugewiesen.

Um das Formular in einer Ereignisbehandlungsroutine für OnClose zu schließen und freizugeben, setzen Sie Action auf caFree.

Hinweis: Beim Beenden der Anwendung tritt das Ereignis OnClose nur im Hauptformular, aber nicht in den untergeordneten Formularen auf.

H4ndy 8. Jan 2004 10:40

Re: TForm.Close
 
Also ich mache es so:

Delphi-Quellcode:
  // About-Fenster erzeugen, anzeigen und wieder freigeben
  Application.CreateForm(TAboutBox, AboutBox);
  AboutBox.ShowModal;
  AboutBox.Free;
Geschlossen wird das Form mit Close()
und gab noch keine Probleme bisher.

Smokey 8. Jan 2004 10:53

Re: TForm.Close
 
Wenn du deinen Code von oben auf jedenfall weiterbenutzen willst, versuch doch einfach mal deine Variable vor dem neuen Create auf nil zu setzen.
Ich hatte in älteren Programmen auch öfter das problem, dass die Form zwar geschlossen war, das Objekt jedoch nicht nil war.

Code:
procedure TForm1.irgendwasClick(Sender: TObject);
var TfSU: TfrmSendURL;
begin
  If Application.FindComponent('SUForm') = Nil Then
  begin
    [color=red]TfSU := nil;[/color]
    Application.CreateForm(TfrmSendURL, TfSU);
    TfSU.Name:='SUForm';
    TfSU.lblUserName.Caption := 'Hahaha';
  end
  else
  begin
    (Application.FindComponent('SUForm') As TfrmSendURL).SetFocus;
  end;
end;
Allerdings halte ich diese Art der Schliessen/Neuöffnen Lösung mittlerweile auch für etwas ungeschickt.
Und ich kenn Application.FindComponent nicht so genau, also weiss ich auch nicht, ob du wirklich in deinen IF-Block kommst oder nicht. Bin zu faul es auszuprobieren :o)

mfg smk

woki 8. Jan 2004 11:27

Re: TForm.Close
 
siehe OH
Zitat:

Die Methode Release entfernt das Formular und gibt den von ihm belegten Speicher frei.

Delphi-Syntax:

procedure Release;

C++ Syntax:

void __fastcall Release(void);

Beschreibung

Mit Release können Sie das Formular aus dem Speicher entfernen.

Release gibt das Formular erst frei, nachdem die Ausführung der Ereignisbehandlungsroutinen des Formulars und seiner untergeordneten Komponenten beendet ist. Die Methode stellt auch sicher, daß alle Botschaften in der Ereigniswarteschlange des Formulars vor dessen Freigabe bearbeitet werden. Jede Ereignisbehandlungsroutine für das Formular oder für dessen untergeordnete Objekte sollte Release anstelle von Free (Delphi) oder Delete (C++) benutzen. Ansonsten kann ein Speicherzugriffsfehler auftreten.

Hinweis: Release gibt die Steuerung sofort an die aufrufende Routine zurück und wartet nicht, bis das Formular freigegeben wird.
Außerdem solltest du noch darauf achten, daß eventuelle Zeiger auf die Form auf nil gesetzt werden, also z.B. Form1:=nil

Grüsse
Woki

jonny 8. Jan 2004 17:32

Re: TForm.Close
 
Mit Free habe ich auch getestet es gab einen Speicherzugriffsfehler werde es jetzt noch mal mit Release testen aber danke schon mal werde mich dann melden.

jonny 8. Jan 2004 17:49

Re: TForm.Close
 
OK Wollte nur mal melden wenn man im OnClose Ereigniss Self.Release; reinstellt dann funktioniert das wunderbar keine Fehler mehr und wird auch alleas gut und mehrmals erstellt.

Danke für die Hilfe!!!!!!!!!!!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.
Seite 2 von 2     12   

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 by Thomas Breitkreuz