Delphi-PRAXiS

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)

jonny 8. Jan 2004 07:46


TForm.Close
 
Hallo ich bau gerade an einem Programm in dem ich Formulare Dynamisch während der Laufzeit ertelle.

Mein Problem ist jetzt Folgendes also wenn ich das Formular jetzt schliesse

Code:
Form.Close;
dann kann ich keine Fenster mit dem gleichen Namen mehr erstellen warum?

Ist das Fenster nur unsichtbar?
Ich habe es auch mit

Code:
Form.Free;
versucht aber das liefert nur eine Fehlermeldeung was soll ich tun?

Luckie 8. Jan 2004 07:48

Re: TForm.Close
 
Bevor du es neu öffnen kannst, musst du logischerweise vorher das Form-Objekt neu erzeugen.

jonny 8. Jan 2004 07:53

Re: TForm.Close
 
Ja das tue ich auch

Hiermal ein Beispiel aus dem Code:
Code:
procedure TForm1.irgendwasClick(Sender: TObject);
var TfSU: TfrmSendURL;
begin
  If Application.FindComponent('SUForm') = Nil Then
  begin
    Application.CreateForm(TfrmSendURL, TfSU);
    TfSU.Name:='SUForm';
    TfSU.lblUserName.Caption := 'Hahaha';
  end
  else
  begin
    (Application.FindComponent('SUForm') As TfrmSendURL).SetFocus;
  end;
end;
Beim ersten mal klappt alles aber wenn ich die Form Schliesse mit

Code:
Close
dann sagt er mir beim nächsten Click auf "irgendwas" das man kein Focus auf eine Unsichtbare Form setzen kann.

Luckie 8. Jan 2004 08:01

Re: TForm.Close
 
Also kuck dir mal meinen Code an:
Delphi-Quellcode:
var
  Form1: TForm1;
  ZweiteForm: TForm;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Application.CreateForm(TForm2, ZweiteForm);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(ZweiteForm) then
    ZweiteForm.Show;
end;
Wenn ich die zweite Form mit Close schließe, kann ich sie direkt mit dem zweiten Button wieder anzeigen lassen.

jonny 8. Jan 2004 08:07

Re: TForm.Close
 
Ja aber das soll nicht der Sin der Sache sein das Fenster soll komplett geschlossen werden das es nicht mehr da ist wenn ich es schliesse damit mit der meiner Methode ein neues erstellt werden kann es soll nur dann den Focus bekommen wenn es irgendwo hinten liegt aber noch nicht geschlossen wurde.

Luckie 8. Jan 2004 08:11

Re: TForm.Close
 
Wenn es nur "hinten" ist dann existiert es ja. Dann frag ab, ob es visible ist. Man müsste dann noch prüfen, ob es minimier (IsIconic) ist.

jonny 8. Jan 2004 08:15

Re: TForm.Close
 
Mit dem Focus setzen das functioniert ja es gibt nur ein Problem wenn ich es schliesse mit Close dann kann ich kein neues mit dem gleichen Namen erstellen weil das alte ja noch da ist wie kriege ich es ganz weg?

mit Free anstaat Close hab ich auch schon versucht aber ich krieg ne Fehlermeldung.

Luckie 8. Jan 2004 08:25

Re: TForm.Close
 
Zitat:

Zitat von jonny
wenn ich es schliesse mit Close dann kann ich kein neues mit dem gleichen Namen erstellen weil das alte ja noch da ist wie kriege ich es ganz weg?

Hm.
Delphi-Quellcode:
var
  Form1: TForm1;
  MyForm2: TForm;

implementation

{$R *.dfm}

uses
  Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, MyForm2);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(MyForm2) then
    MyForm2.Show;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  if Assigned(MyForm2) then
    MyForm2.Free;
end;
Mit Button1 erzeuge ich die zweite Form. Mit Button2 zeige ich sie an. Wenn ich sie jetzt mit Button3 wieder schließe / freigebe, kann ich sie mit Button1 wieder ohne Probleme erzeugen. Also irgendwas machst du da falsch, aber sehen tue ich es jetzt auch nicht.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
begin
  if (Assigned(MyForm2)) and (MyForm2.Visible) then
    MyForm2.BringToFront;
end;
Und wenn sie gerade nicht sichtbar ist, bekomme ich sie mit Button4 wieder "nach vorne".

galex 8. Jan 2004 08:45

Re: TForm.Close
 
Moin,

ich benutze folgendes:
Delphi-Quellcode:
var frmSendURL: TfrmSendURL;
1.Formular erzeugen
Delphi-Quellcode:
  Application.CreateForm(TfrmSendURL, frmSendURL);
2.Formular anzeigen
Delphi-Quellcode:
  frmSendURL.Show;
3.Formular schließen
Delphi-Quellcode:
  frmSendURL.Hide;
{
anzeigen
schließen
anzeigen
schließen
anzeigen
}

4. Formular verniechten
Delphi-Quellcode:
  frmSendURL.Free;
oder
Delphi-Quellcode:
FreeAndNil(frmSendURL);

Luckie 8. Jan 2004 08:48

Re: TForm.Close
 
Hide macht das Formular nur unsichtbar, schließt es baer nicht, dies tut nur, wie der Name auch schon sagt, Close();.

galex 8. Jan 2004 09: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 09: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 09: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 10: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 16: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 16: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 08:34 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