Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Typ 'xxx' benötigt Finalization - nicht im Dateityp erlaub (https://www.delphipraxis.net/22925-typ-xxx-benoetigt-finalization-nicht-im-dateityp-erlaub.html)

TheMiller 26. Mai 2004 12:50


Typ 'xxx' benötigt Finalization - nicht im Dateityp erlaub
 
Hey Leute,

bin grade ein bissl am Üben mit Records. Was bedeutet folgende Meldung?

Delphi-Quellcode:
Compiler: Typ 'TToDo' benötigt Finalization - nicht im Dateityp erlaubt

So sehen meine Deklarationen aus:

Delphi-Quellcode:
type
  TToDo=record
  Name,Text:widestring;
  Datum:TDate;
  Active:Integer;
end;

...

  private
    RToDo:TToDo;
    recnow:Integer;
    DataFile:File of TToDo; <---- Hier meckert der Compiler!!!
    procedure LoadData;
    procedure AddData;
Was ist das für ein Fehler?

Stevie 26. Mai 2004 12:59

Re: Typ 'xxx' benötigt Finalization - nicht im Dateityp erla
 
Zitat:

Zitat von DJ-SPM
Was ist das für ein Fehler?

Ich vergess es auch immer wieder, aber auch bei Compiler-Fehlern hilft ein beherzter Griff zur F1-Taste! :zwinker:

Zitat:

Zitat von Delphi-Hilfe
Bestimmte Typen werden vom Compiler intern auf besondere Weise behandelt: Sie müssen zuerst ordnungsgemäß abgeschlossen werden, damit gegebenenfalls die gesamten von ihnen zur Zeit belegten Ressourcen freigegeben werden. Da der Compiler nicht feststellen kann, welcher Typ zur Laufzeit in dem Variantabschnitt eines Datensatzes gespeichert ist, kann nicht garantiert werden, daß diese speziellen Datentypen ordnungsgemäß abgeschlossen werden.
Delphi-Quellcode:
program Produce;

  type
    Data = record
      name : string;
    end;

  var
    inFile : file of Data;

begin
end.
String ist einer der Typen, für die ein besonderer Abschluß durchgeführt werden muß, und kann daher nicht in einem Dateityp gespeichert werden.
Delphi-Quellcode:
program Solve;

  type
    Data = record
      name : array [1..25] of Char;
    end;

  var
    inFile : file of Data;

begin
end.
Eine einfache Lösung für String ist die Neudeklaration des Typs als Array mit Zeichen. In anderen Fällen, in denen ein besonderer Abschluß durchgeführt werden muß, wird es immer schwieriger, eine binäre Dateistruktur mit Standard-Pascal-Merkmalen wie "file of" aufrechtzuerhalten. In diesen Situationen ist es wahrscheinlich einfacher, spezialisierte Datei-I/O-Routinen zu schreiben.


TheMiller 26. Mai 2004 13:06

Re: Typ 'xxx' benötigt Finalization - nicht im Dateityp erla
 
Danke. Werde ich demnächst machen.

aber dann gleich noch eine Frage. Ich habe jetzt kein Array genommen, sondern String[500]. Da sagt er mir, dass ein String nur 255 Zeichen hat. Ich denke das ist bei shortstring.

jedenfalls habe ich jetzt string[255] stehen und es funzt. Wie kann ich den String verlängern (wenn möglich ohne array)?

Muetze1 26. Mai 2004 14:14

Re: Typ 'xxx' benötigt Finalization - nicht im Dateityp erla
 
Moin!

Gar nicht. Ein AnsiString/WideString sind intern Klassen und die können keine feste Länge haben, da es keine Array Of Char mehr sind. Du kannst einen String[x] nur definieren, wenn x bis maximal 255 geht, weil er nur in dem Falle einen ShortString nehmen kann und begrenzt. Daher musst du entweder einen WideString/AnsiString nehmen und dann ordentlich mit Initialize/Finalize arbeiten. Dabei musst du aber beachten, das diese beiden String Typen nicht direkt als Record oder File Of XXX gelesen oder geschrieben werden können, da es intern wie oben geschrieben Klasseninstanzen sind und du somit nur die Adresse der Instanz, nicht aber die Daten schreibst. Diese String Definitionen sind nur 4 Byte in der Grösse, da Instanzenzeiger...

MfG
Muetze1

negaH 26. Mai 2004 14:18

Re: Typ 'xxx' benötigt Finalization - nicht im Dateityp erla
 
Zitat:

Ein AnsiString/WideString sind intern Klassen
Naja, Klassen sind es nicht gerade, aber es sind dynamische Datenstrukturen die eben ihren Speicherplatz dynamisch verwalten. Sogesehen ist eine Variable vom Type Strign/WideString nichts anderes als ein Pointer auf einen dynamisch allozierten Speicherbereich. Nun, in einem Record verbraucht ein Pointer nur 4 Bytes. Wird dieser Record 1 zu 1 gespeichert, was bei einem type File of Record, der Fall wäre dann speichert man nur die Zeiger in den Speicherbereich. Sowas würde in der Laderoutine eben NICHT den INHALT des Strings laden, sondern einen unsinnigen Zeiger.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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