Delphi-PRAXiS
Seite 9 von 9   « Erste     789   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Record zurücksetzen (löschen) (https://www.delphipraxis.net/120638-record-zuruecksetzen-loeschen.html)

Rosenwehr 9. Okt 2008 13:17

Re: Record zurücksetzen (löschen)
 
Lösungsvorschlag für Delphi 2005 Anwender:

1. Record definieren wie gehabt (ohne procedure)
2. Variable als Array erzeugen, z.B. MyRecord: Array of TMyRecord
3. Array leeren: SetLength(MyRecord,0)
4. Array mit "einem Record" erzeugen: SetLength(MyRecord,1)
5. Zugriff: MyRecord[0].ElementofRecord
Bsp. für zuweisen: MyRecord[0].string1:='abc'
Bsp. für auslesen: stringvariable:=MyRecord[0].string1

Hinweis: Für D7 wird zum Array leeren: MyRecord := NIL in der D7-Hilfe beschrieben.

DeddyH 9. Okt 2008 13:19

Re: Record zurücksetzen (löschen)
 
Damit löschst Du das Array, aber nicht den Record.

[edit] Nicht ganz richtig: Du löschst den Zeiger auf das Array. Wenn da vorher kein SetLength auf 0 aufgerufen wird, hast Du mit ziemlicher Sicherheit ein Speicherleck [/edit]

Rosenwehr 9. Okt 2008 19:47

Re: Record zurücksetzen (löschen)
 
Heist das also, das mit der oben genannten Reihenfolge alles i.o. ist?

Wie kann ich mein Programm auf Speicherleck prüfen? In meiner procedure rufe ich am Anfang einer Schleife SetLength(MyRecord,0) dann SetLength(MyRecord,1) auf.

Das Array (mit dem einen Record) wird in einer aufgerufenen Unterprocedure abschließend ausgewertet und der Inhalt auch nicht mehr benötigt. Beim nächsten Schleifeneintritt SetLength(MyRecord,0) dann SetLength(MyRecord,1) usw.

Gibt es eine elegantere Lösung für D2005? Inwiefern werden Ressourcen verschwendet bzw. liegt unsauberer Programmierstil vor?

Reinhard Kern 10. Okt 2008 09:55

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von Rosenwehr
Heist das also, das mit der oben genannten Reihenfolge alles i.o. ist?

Wie kann ich mein Programm auf Speicherleck prüfen? In meiner procedure rufe ich am Anfang einer Schleife SetLength(MyRecord,0) dann SetLength(MyRecord,1) auf.

Das Array (mit dem einen Record) wird in einer aufgerufenen Unterprocedure abschließend ausgewertet und der Inhalt auch nicht mehr benötigt. Beim nächsten Schleifeneintritt SetLength(MyRecord,0) dann SetLength(MyRecord,1) usw.

Gibt es eine elegantere Lösung für D2005? Inwiefern werden Ressourcen verschwendet bzw. liegt unsauberer Programmierstil vor?

Hallo,

bei der Abfolge lässt du nach der Bearbeitung den Array mit Länge 1 zurück, obwohl er nicht mehr benötigt wird. Das ist noch kein Speicherleck, aber man könnte nach Gebrauch die Länge wieder auf 0 setzen.

Eine weitere Möglichkeit: Setzen des Records und die Auswertung in eine Prozedur zusammenfassen und den record als lokale Variable definieren, und zwar als stinknormalen Record. Der wird bei Eintritt automatisch genullt und beim Verlassen aufgeräumt. Ist halt bloss normales Pascal und nicht so geil wie dynamische Arrays und Records mit Prozeduren.

Gruss Reinhard

shmia 10. Okt 2008 10:13

Re: Record zurücksetzen (löschen)
 
Ich frage mich, weshalb nach so vielen Beiträgen immer noch am Record festgehalten wird, obwohl doch hier alles für die Verwendung einer Klasse spricht.
Eine Klasse ist einem Record dann vorzuziehen, wenn Operationen mit dem Record durchgeführt werden sollen (wir im vorliegenden Beispiel Clear()).
Wenn dann noch der Bedarf nach weiteren Methoden da ist, braucht man gar nicht weiterüberlegen, sondern sofort zur Klasse greifen.
Das ist doch die Kernaussage der objektorientierten Programmierung, dass Daten und Methoden zu einer Klasse zusammengeführt werden.
Es gibt nur wenige Ausnahmen, wie z.B. Records die nur sehr wenige Daten enthalten (TPoint, TRect, TComplexNumber).
Hier kann man um Resourcen zu sparen weiterhin beim Record bleiben.

SubData 10. Okt 2008 10:48

Re: Record zurücksetzen (löschen)
 
Der Vorteil von Records ist, dass man diese wesentlich besser an DLLs übergeben kann ;-)

Reinhard Kern 10. Okt 2008 11:13

Re: Record zurücksetzen (löschen)
 
Zitat:

Zitat von shmia
...Es gibt nur wenige Ausnahmen, wie z.B. Records die nur sehr wenige Daten enthalten (TPoint, TRect, TComplexNumber).
Hier kann man um Resourcen zu sparen weiterhin beim Record bleiben.

Hallo,

man kann viel für und gegen Records anführen, besonders dann, wenn man wie hier üblich jedes Problem auf möglichst komplizierte Weise lösen will, um damit anzugeben. Aber ganz sicher ist die Länge eines Records dafür KEIN Gesichtspunkt.

Im wahren Leben geht es um möglichst einfache Lösungen und nicht um fanatisch vertretene Ideologien. Ich habe schon vor vielen Jahren Programmiersysteme getestet, in denen zur absolut konsequenten Umsetzung der OO auch ein einzelnes Bit eine Klasse war mit Methoden für und, oder usw. Das war Blödsinn, ist es immer noch und wird es auch bleiben. Kein Kühlschrank und keine Waschmaschine funktioniert so, Theorie her oder hin.

Gruss Reinhard

Guido Eisenbeis 10. Okt 2008 11:18

Re: Record zurücksetzen (löschen)
 
Ein wahres Wort, gelassen ausgesprochen! *zustimm*

Guido.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.
Seite 9 von 9   « Erste     789   

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