Autor |
Beitrag |
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 25.07.10 11:57
Ok,
Mittlerweile habe ich festgestellt, das ich doch gravierende Fehler drin habe, die ich nicht ganz nachvollziehen kann!?
Zur Laufzeit wird, soll eine Form3 als MDIChild mehrmals geöffnet werden können!
So wie ich das mal gelesen habe und auch schon gemacht habe geht der Aufruf so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TEdit_Audio.OpenDateiClick(Sender: TObject); var NewForm: TForm3; begin if OpenDialog1.Execute then begin files:= OpenDialog1.Filename; filename:= ExtractFileName(files); if not Assigned(NewForm) then begin
NewForm:= TForm3.Create(self); TabSet1.Tabs.Add(filename); playbutton.Enabled:= true; vorbutton.Enabled:= true; posendebutton.Enabled:= true; BearbeitungsButton.Enabled:= true; BearbeitungsButton.Down:= true; WiedergabeButton.Enabled:= true;
end else ErrorPop('Can''t create Form'); end;
end; |
Den Aufruf mit, 'if not assign NewForm' funct nur über das Mainmenu!
Mit den SpeedButton nicht! Dort würde es funcen wenn ich das mache ' if assign NewFrom'.
Dann functes aber nicht mehr über Mainmenu!??
Nehme ich den try block rein funct gar nichts mehr!!
Lass ich die, if .... then, weg funct es bei beiden???
Wie ist nun der richtige Aufruf dafür???
Selbst dies, NewForm:= TForm3.Create(self o. nil o. application) !!????
macht mich stutzig!!
Gelesen hab ich viel, nur die richtige Antwort/Erklärung nirgens gefunden!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 25.07.10 13:54
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TEdit_Audio.OpenDateiClick(Sender: TObject); var NewForm: TForm3; begin if OpenDialog1.Execute then begin files:= OpenDialog1.Filename; filename:= ExtractFileName(files); if not Assigned(NewForm) then |
Warum überprüfst du überhaupt auf Assigned? Eine lokale Variable hat irgendwas, aber vermutlich nichts vernünftiges ohne Initialisierung gespeichert. Und selbst wenn es jetzt eine Form wäre...warum Assigned überprüfen? Du willst doch (immer) ein neues Formular aufmachen.
DelphiBasics hat folgendes geschrieben: |
The Assigned function checks to see if a reference is not nil. It returns True if not nil, and False if nil. |
Im Endeffekt ist eine lokale Variable nie nil ohne Initialsierung (außer durch Zufall vielleicht). Wird auch bei der zitierte Website gezeigt.
Wenn du mit Assigned und so weiter arbeiten möchtest (ich schließe daraus dass du irgendwie die Form nach als Referenz zur Hand haben willst), dann mache ein Array, wo du die Referenzen reinpackst
Delphi-Quelltext 1:
| var Forms: array of TForm3; |
oder eine kleine Klasse.
Ist aber erstmal nicht nötig. Lass die Assigned-Abfrage einfach weg.
Zu dem Create-Parameter:
delphi.about.com hat folgendes geschrieben: |
Every Delphi component has an Owner property. Owner takes care of freeing the owned components when it is being freed.
[...]
If, on the other hand, we make another component (not the form) the owner of the component, then we are making that component responsible for disposing of the object when it is destroyed.
[...]
"Orphans"
Some controls (such as ActiveX controls) are contained in non-VCL windows rather than in a parent control. For these controls, the value of Parent is nil and the ParentWindow property specifies the non-VCL parent window.
The truth is that in most cases you do not need to care about Parents and Owners |
Wenn du also Self angibst, dann muss sich dein TEdit_Audio selbst drum kümmern. Wenn du nil angibst, dann musst du dich letztenendes auch drum kümmern. Wenn du Application angibst, dann werden deine Forms beim beenden des Programms automatisch gelöscht. 100% sicher bin ich mir aber nicht: Es ist gut möglich, dass auch die nil-Objekte am Ende gelöscht werden und dass die Objekte mit Self dann automatisch gelöscht werden, wenn das entsprechende Objekt (das mit self gemeint war) gelöscht wird. Es ist aber definitiv auch möglich Speicher-leaks zu bauen mit Delphi
//Edit: Die Kombination lokale Variable und Owner auf nil ist sicher nicht sehr gut für deinen Speicher. Die Referenz gehört zu niemanden UND du hast sie weggeworfen...armer "Orphan" 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 25.07.10 14:17
Xion hat folgendes geschrieben : | Lass die Assigned-Abfrage einfach weg. |
Hab ich mir schon fast gedacht! Werd ich auch machen!
Erklärt aber nicht warum bei den Clicks, einmal so und einmal so?
Xion hat folgendes geschrieben : | Es ist aber definitiv auch möglich Speicher-leaks zu bauen mit Delphi
//Edit: Die Kombination lokale Variable und Owner auf nil ist sicher nicht sehr gut für deinen Speicher. Die Referenz gehört zu niemanden UND du hast sie weggeworfen...armer "Orphan"  |
Das soll ja nicht sein
Eigentlich habe ich (self) drin!
Mich hat es nur gewundert, beim durchsuchen der Foren, die unterschiedlichen Aufrufe!??
Schliessen tu ich im onclose mit Action:= cafree!
Da hab ich auch wieder sowas gesehen 'FreeAndNil(Form3)!
War ich zumindestens im Ansatzt richtig!
Ok. Danke!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: So 25.07.10 14:32
ALF hat folgendes geschrieben : |
Schliessen tu ich im onclose mit Action:= cafree!
Da hab ich auch wieder sowas gesehen 'FreeAndNil(Form3)! |
Bin grad etwas verwirrt...ModalForms sind aber schon was andres, oder? ^^
(Modal Form = unterbrechen den Programmfluss mitten in der procedure bis sie wieder geschlossen werden, so wie OpenDialog)
Also FreeAndNil ist das Löschen der Form (von Hand).
Hah, guck mal da:
delphi.about.com/od/...05/qt/nilselfapp.htm
caFree löscht die Form also automatisch nach dem Schließen. Also wärs egal welches der beiden du jetzt nimmst.
Und da steht auch, dass wenn du Self nimmst, es automatisch gelöscht wird. Hmm, das Application ist mir noch etwas unklar. Du kannst eigentlich nur eine Form mit Owner=Application erzeugen. Ich glaube das ist das Haupt-Formular...
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 25.07.10 14:54
Sorry: Bitte nicht verwechsel! ES ist ein MDI und wird nicht auf ShowModal gesetzt!!
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
|