Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   ReWrite() findet kein File? (https://www.delphipraxis.net/180311-rewrite-findet-kein-file.html)

Bjoerk 11. Mai 2014 08:13

AW: ReWrite() findet kein File?
 
Zitat:

Zitat von TForm1 (Beitrag 1258525)
Danke für die Beispiele, jetzt ist alles etwas klarer :-D.
Was ich noch nicht wusste, bzw nur am Rande mal gesehen habe, ist, dass man Records auch mit Funktionen und Prozeduren ausstatten kann; das werde ich definitiv des öfteren nutzen können. Eine Blöde Frage: Wenn man Records als Datentypen mit Prozeduren speichern kann, kann man dann auch Klassen als Typen in typisierten Files speichern (in der Art: file of TMyClass)? Wahrscheinlich doch nicht (habe es jedenfalls noch nie gesehen), oder?

Meines Wissens geht file of nur bei Records, nicht bei Klassen. Und wie Sir Rufo schon sagte, es werden nur die Felder gespeichert. Dasselbe bei Item[I] := Item[J]. Bei Klassen bräuchte man da ein Assign Item[I].Assign(Item[J]), hätte statt dem Array wohl eher eine TObjectlist und würde zum Beispiel in einem FileStream speichern.

JamesTKirk 11. Mai 2014 10:09

AW: ReWrite() findet kein File?
 
Zitat:

Zitat von TForm1 (Beitrag 1258499)
[EDIT] Ich weiß jetzt woran es lag, und zwar waren meine Records noch leer bzw. noch keine Variablen darin, da ich das später machen wollte. Wenn ich testweise eine Variable deklariere, funktioniert es. Warum macht es beim Schreiben der Datei etwas aus, wenn der Record noch keine Daten enthält? Im Grunde genommen ist das File beim Erstellen ja auch leer, oder?

Dass das Record leer war, ist genau das Problem. Wenn du ein
Delphi-Quellcode:
Rewrite()
auf eine
Delphi-Quellcode:
file of XYZ
Variable machst, dann ist
Delphi-Quellcode:
Rewrite()
keine der Funktionen, die du in systemh.inc siehst (zumindest im Vordergrund), sondern der Compiler ändert dies intern zu
Delphi-Quellcode:
fpc_rewrite_typed(filevar, sizeof(XYZ))
(deklariert in compproc.inc). Dieses ruft dann
Delphi-Quellcode:
Rewrite(var f: File; l: longint)
auf (deklariert in file.inc), in dem widerum
Delphi-Quellcode:
l
explizit auf
Delphi-Quellcode:
0
geprüft wird. In dem Fall wird
Delphi-Quellcode:
IOResult
auf
Delphi-Quellcode:
2
gesetzt und dann eben eine Exception ausgelöst, falls IO-Exceptions aktiviert sind.

Zitat:

Zitat von TForm1 (Beitrag 1258525)
Eine Blöde Frage: Wenn man Records als Datentypen mit Prozeduren speichern kann, kann man dann auch Klassen als Typen in typisierten Files speichern (in der Art: file of TMyClass)? Wahrscheinlich doch nicht (habe es jedenfalls noch nie gesehen), oder?

Sagen wir mal so... man könnte sowas durchaus implementieren, aber dann ist wiederum die Frage welchen Sinn das hätte. Außerdem kannst du zum Speichern/Laden von Klassen (zumindest, wenn du
Delphi-Quellcode:
published
Properties verwendest) die entsprechenden Writer-/Reader-Klassen verwenden, welche zum Beispiel auch von Delphi und Lazarus für die Formulardateien verwendet werden.

Gruß,
Sven

TForm1 11. Mai 2014 10:33

AW: ReWrite() findet kein File?
 
OK, dann weiß ich jetzt deutlich mehr als vorher! :thumb:
Eine Frage habe ich aber noch: Sollte man besser eine TObjectList für Klassen- Objekte verwenden und dann entsprechend casten und was macht das dann im Unterschied zu einer TList?

himitsu 11. Mai 2014 10:38

AW: ReWrite() findet kein File?
 
Es kommt drauf an, was man will.
Eine TList ist ja nur eine strunzdoofe Pointer-Liste.
Bei der TObjektList kann man der Liste dagegen auch die Verwaltung der Objekte übergeben. (z.B.: Wenn Eintrag gelöscht wird, dann gib automatisch das Objekt frei)

Und bei einer generischen TList/TObjektList kann man den Cast automatisch integrieren und den Compiler eine Typprüfung vornehmen lassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:27 Uhr.
Seite 3 von 3     123   

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