![]() |
Problem mit Stringlists (.free)
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin zurzeit bei einem Programm dabei ein wenig mit Stringlists zu hantieren.
Delphi-Quellcode:
Dabei ist jedoch beim schließen ein Fehler aufgetaucht:
...
var Form1: TForm1; sc : TStringlist; tx : TStringlist; ms : TStringlist; ... procedure TForm1.FormShow(Sender: TObject); begin sc := TStringlist.Create; tx := TStringlist.Create; ms := TStringlist.Create; end; ... procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin sc.free; tx.Free; ms.Free; end; |
Re: Problem mit Stringlists (.free)
Deine Aufrufe von *.free sollte nicht in die FormCloseQuery
sondern nach onClose. In FormClosQuery sollte nur die CanClose Variable entsprechend gesetzt werden. Grüße Klaus |
Re: Problem mit Stringlists (.free)
:gruebel: In OnClose passiert genau das selbe...
|
Re: Problem mit Stringlists (.free)
Erstellen im FormCreate-Ereignis und zerstören im FormDestroy-Ereignis ist imho die beste Lösung!
|
Re: Problem mit Stringlists (.free)
Bei mir tritt der Fehler nicht auf. Gibst Du die Stringlisten noch an anderer Stelle frei? Falls ja, dann ersetz mal ggf. StringList.Free durch FreeAndNil(StringList)
[edit] Zitat:
|
Re: Problem mit Stringlists (.free)
dann sollte er die globalen in lokale Klassen-Variablen umwandeln!
|
Re: Problem mit Stringlists (.free)
Sehe ich genauso.
|
Re: Problem mit Stringlists (.free)
Moin, Moin.
Ich gebe die Instanzen zwar auch immer am Programmende frei; trotzdem die folgende (vielleicht naive) Frage: Welche Auswirkungen hat es denn, wenn man das nicht tut? Bleibt der Speicher dann für Windows reserviert und ist bis zum nächsten Systemstart nicht mehr nutzbar? Gruß Ralph |
Re: Problem mit Stringlists (.free)
Nein, Windows räumt da schon selbst auf.
|
Re: Problem mit Stringlists (.free)
Und vor allem räumt zuerst Delphi bzw. der Speichermanager auf.
|
Re: Problem mit Stringlists (.free)
Ich will meine Hand nicht dafür ins Feuer legen, aber AFAIK tritt dann der Garbage Collector in Aktion (verlassen würde ich mich aber nicht darauf).
|
Re: Problem mit Stringlists (.free)
Hmmm, und warum gibt man dann diese Instanzen zum Programmende frei? Das ist doch dann überflüssig!?
|
Re: Problem mit Stringlists (.free)
... das heißt ich kann es theoretisch einfach weglassen?
|
Re: Problem mit Stringlists (.free)
GC unter Win32?
|
Re: Problem mit Stringlists (.free)
GC ??
// Garbage Collector - oder? |
Re: Problem mit Stringlists (.free)
Heißt der unter Win32 anders? Ich meine jetzt nicht den von Java :mrgreen:
|
Re: Problem mit Stringlists (.free)
Ja.
GC gibts imho nur unter .NET. Aber da Windows ja auch aufräumt, hat es ja auch eine Art GC :stupid: |
Re: Problem mit Stringlists (.free)
Gibt es eine abschließende Antwort der Experten auf die offene Frage:
Sollte man in Anbetracht dieser Tatsache dann nicht auf das Freigeben der Instanzen unmittelbar vor Beendigung des Programmes verzichten? Ralph |
Re: Problem mit Stringlists (.free)
Sollte? Ein klares Nein.
|
Re: Problem mit Stringlists (.free)
Hmmm, man sollte also nicht darauf verzichten.
Warum nicht, wenn es doch offenbar überflüssig ist? Ist das nicht etwas verwirrend? Gruß Ralph |
Re: Problem mit Stringlists (.free)
In Destruktoren werden ja auch andere Dinge gemacht als die eigentliche Zerstörung (die erfolgt in FreeInstance).
|
Re: Problem mit Stringlists (.free)
Deine Fragen wurden schon beantwortet...
Zitat:
Zitat:
Delphi-Quellcode:
Gruss
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } Fsc : TStringlist; Ftx : TStringlist; Fms : TStringlist; public { Public-Deklarationen } end; var Form1: TForm1; // hier werden niemals eigene Variablen deklariert. implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Fsc := TStringlist.Create; Ftx := TStringlist.Create; Fms := TStringlist.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin Fsc.free; Ftx.Free; Fms.Free; end; end. Thorsten |
Re: Problem mit Stringlists (.free)
@omata: ja, aber dann bitte mit einem F vor privaten Variablen!
|
Re: Problem mit Stringlists (.free)
Ups, du hast natürlich recht. Habs nur kopiert, sorry :oops:
|
Re: Problem mit Stringlists (.free)
Zitat:
|
Re: Problem mit Stringlists (.free)
Damit Du gleich erkennen kannst, dass Du auf ein privates Feld zugreifst.
|
Re: Problem mit Stringlists (.free)
Das ist keine Pflicht, aber praktisch alle Styleguides empfehlen, die Namen von Feldern mit f beginnen zu lassen.
|
Re: Problem mit Stringlists (.free)
Zitat:
|
Re: Problem mit Stringlists (.free)
Danke für die Erklärung!
aber mein Styleguides sagt das nicht - ist nämlich von mir :-) Ich komm so, wie ich es bisher mach ganz zurecht |
Re: Problem mit Stringlists (.free)
Ich hole mal ein bisschen aus: wenn Du Felder einer Klasse nach außen hin bekannt machen willst, gewährst Du keinen direkten Zugriff auf sie, sondern definierst Schnittstellen (Getter- und Settermethoden). Die Variable wird dann auch nicht als Variable angesprochen, sondern als Eigenschaft (property). Mal ein Beispiel (Feld soll nur einen Wert zwischen 1 und 1000 annehmen können):
Delphi-Quellcode:
So funktioniert OOP ;)
type
TMyClass = class ... private FFeld: integer; procedure SetFeld(value: integer); //Setter function GetFeld: integer; //Getter ... public property Feld: integer read GetFeld write SetFeld; ... end; procedure TMyClass.SetFeld(value: integer); begin if (value in [1..1000]) then FFeld := value; end; function TMyClass.GetFeld: integer; begin Result := FFeld; end; |
Re: Problem mit Stringlists (.free)
na so bau ich ja auch meine Sachen auf
aber eben nur ohne F |
Re: Problem mit Stringlists (.free)
Dann ersetz in meiner Setter-Methode mal FFeld durch Feld... *bumm*. Genau das ist der Grund, warum es StyleGuides gibt.
|
Re: Problem mit Stringlists (.free)
Wenn man konsequent einen Style durchzieht, egal ob dieser
jetzt empfohlen wird oder einfach selbst entwickelt wurde, dann passiert so was nicht aber egal - wir sind offtopic! |
Re: Problem mit Stringlists (.free)
Da es zur Originalfrage noch nicht so ganz heraus kam, noch folgende Ergänzung:
OnCloseQuery dient der Nachfrage, ob das Fenster geschlossen werden kann. Dort programmiert man den altbekannten Dialog rein: "Daten vorm beenden speichern" bzw. "Programm wirklich beenden" um bei einer negativen Antwort des Nutzers das Schliessen abzuwenden (CanClose := false). Somit kann diese Routine mehrfach aufgerufen werden und da in dem aufgezeigten Beispiel nur .Free verwendet wurde ohne die Instanzenvariable auf nil zu setzen, knallt es nach einmaligen durchlaufen des Ereignisses. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 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