AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TForm Freigeben

Ein Thema von Pro_RJ · begonnen am 3. Sep 2008 · letzter Beitrag vom 10. Aug 2009
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#1

TForm Freigeben

  Alt 3. Sep 2008, 13:30
Hallo,

Ich hab da ml eine einfache Frage zum Thema Forms im BDS 2006:

Ich Habe mir eine eigene Klasse geschrieben :


Delphi-Quellcode:
type
  TMeinForm = class(TForm)
  private
    { Private-Deklarationen }
    U_Ist_Destroy : Boolean;
    U_Ist_Close : Boolean;
    U_WarDeactivate : Boolean;
    U_Activate_Arbeitet : Boolean;
    U_DeActivate_Arbeitet : Boolean;
.....
  protected
    { Protected-Deklarationen }
....
  public

    Fensternr : Integer;
    DSFensterEinstellungen : TIBDataSet;
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }

  end;

constructor TMeinForm.Create(AOwner: TComponent);
begin
  U_Ist_Destroy := false;
  U_Ist_Close := False;
  U_WarDeactivate := False;
  U_Activate_Arbeitet := False;
  U_DeActivate_Arbeitet := False;
  // Hier ist das Fenster noch nicht erzeugt
  inherited;
  // Hier ist das Fenster erzeugt -> nach dieser Proc (Create) kommt erst FormCreate aus dem jeweiligen Fenster

  U_Fensternr := FensterNr(Self);
  DSFensterEinstellungen := TIBDataSet.Create(Self);
.....
end;


destructor TMeinForm.Destroy;
Var I : Integer;
    OBJ : TObject;
    warStamm : Boolean;
begin
  U_Ist_Destroy := true;
 {
  For i := Self.ComponentCount -1 downto  0 do
  Begin
    OBJ := Self.Components[I];
    FreeAndNil(OBJ);
  End;
}

  FreeAndNil(DSFensterEinstellungen );

  inherited;
// if warStamm then Self := NIL;
end;


Aus dieser Fenstervorlage wird dann ein Fenster gebaut, wie man es in Delphi gewöhnt ist. Mit Panels, Buttons usw.....
bsp:
Delphi-Quellcode:
type
  TForm1 = class(TMeinForm)
    OpenDialog1: TOpenDialog;
    Tabelle_Gestalten: TMenuItem;
    PopUpINS: TMenuItem;
    PopUpDEL: TMenuItem;
    PopUpSAVE: TMenuItem;
    Panel1: TPanel;
    N1: TMenuItem;
....

das Fenster wird mit "Application.CreateForm(TForm1, Form1)" erzeugt und anschliesend mit Form1.Show; angezeigt.

Beim beenden des Fensters wird in FormClose Action auf CAFree gesetzt.

Und jetzt kommt das Phänomen:
Wenn der destructor komplett abgearbeitet worden ist haben einige Objecte auf Form1 haben noch einen Wert. (Form1.OpenDialog1 hat "$2621000").
Obwohl es das Fenster und damit auch semtliche Objecte auf ihm ja nichtmehr geben dürfte.Da Alle Objecte Form1 als Owner haben.

Und genauso ist es auf mit der Variable "Form1". Wenn ich jetzt also Abfragen möchte

Delphi-Quellcode:
  
  if not Assigned(Form1) then Application.CreateForm(TForm1, Form1);
  Form1.show;
bekomme ich nur Leider bekomme ich dann bei "Form1.show;" eine Zugriffsferletzung.
Da Form1 nicht Nil wird es nicht erzeugt. Obwohl es ja nicht da sein dürfte/ ist.

Wenn ich jetzt aber in den destructor nach inherited; Self:= NIL; rein schreibe bekomme ich eine Zugriffsverletzung.(Was ja klar ist, da es ja auch eigentlich unsinn ist)

Ich hoffe ihr könnt mir Dabei helfen, wie ich alle Objecte auf dem Form "Sauber" Zerstören kann und die Variable "Form1" auf NIL bekomme.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:38
Man sollte mit FreeAndNil() Freigeben, wenn man die Variable wiederverwenden will.
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#3

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:43
Aber wann bzw wo?
Im destructor kann ich Form1 nicht auf NIL setzten da anschließend eien Zugriffsverletzung kommt.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:46
Deshalb sollst du den Destruktor auch nicht direkt aufrufgen, sondern immer .Free() aufrufen. In diesem Fall
dann
FreeAndNil( Form1); statt Form1.Free(); oder gar Form1.Destroy();
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#5

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:48
Das Fenster wird aber mit Form1.CLose geschlossen. Und nicht mit Destroy oder Free.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:52
Im Event onCloseAction kannst du Steuern, was beim Close geschehen soll
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#7

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:55
Ich habe bei mir im BDS2006 kein Event "onCloseAction".
Ich habe nur OnClose:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := CAFree;
end;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: TForm Freigeben

  Alt 3. Sep 2008, 13:58
Den meinte ich
Dort caHide nehmen, dann wird Fenster nicht geschlossen sondern nur ausgeblendet und kann mit .Show wieder geöffnet werden
Markus Kinzler
  Mit Zitat antworten Zitat
Pro_RJ

Registriert seit: 16. Apr 2008
146 Beiträge
 
#9

Re: TForm Freigeben

  Alt 3. Sep 2008, 14:00
Ich will das Fenster aber "Richtig" schließen um den Speicher wieder frei zu geben. Da das Programm aus ca 150 Fenstern besteht.
  Mit Zitat antworten Zitat
HenKst

Registriert seit: 7. Jul 2008
113 Beiträge
 
#10

Re: TForm Freigeben

  Alt 3. Sep 2008, 14:10
Wenn du .free machst ist der Speicher ja Freigegeben, nur stehen halt immernoch Werte drin.
Freigeben heist nur das andere Programme den Speicher neu beschreiben dürfen.

Mit FreeAndNi(form1) wird auch nur der Pointer vom Form auf nil gesetzt.

Wenn du den Speicher neu verwenden willst musst du ihn schon explizit auf 0 bzw das setzen was halt drinstehen soll.
Wenn du auf nicht alocierten speicher zugreifst steht da halt drin was zuletzt reingeschrieben wurde.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 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