Typ 'String' benötigt Finalization -? im Dateityp

habe folgendes Problem im Programm wie unten:

„type“
" TDaten = array[0…41,0…12] of string;"
" …"
" …"
" "
„var“
" Basisdaten1 : TBasisdaten1;"
" f2 : File of TDaten;"
" FileName : string;"
" Daten_1X1 : TDaten;"
" Daten_1X2 : TDaten;"
" …"

Compiler bleibt in der Zeile „f2 : File of TDaten“ mit folgender Fehlermeldung stehen:
" Typ „String“ benötigt Finalization - nicht im Dateityp erlaubt "

Hier komme ich nicht weiter - kann mir jemand helfen ?

Vielen Dank!

Eyck

" Typ „String“ benötigt Finalization - nicht im Dateityp
erlaubt "

Hi Eyck (ziemlich ungewöhnlicher Name…),

jede Fehlermeldung ist (wie überhaupt ALLES) in der Online-Hilfe erklärt. Da ich vermute, daß Du dort noch nicht nachgeschaut hast, schlage ich für’s erste vor, daß Du das nachholst. Wenn dann immer noch Fragen offen sind, stelle sie hier im Forum.

Eine mögliche Lösung Deines Problems erreichst Du dadurch, daß Du den Typ „TDaten“ mit einem String fester Länge (z. B. 80 Zeichen) deklarierst:

TDaten = array[0…41,0…12] of string[80];

Möglicherweise ist diese Lösung im Kontext Deiner konkreten Datenspeicherungsaufgabe aber extrem ungünstig bis nicht realisierbar, nämlich dann, wenn die Länge der zu speichernden Strings unvorhersehbar (heißt: unvorhersehbar zur Entwicklungszeit) groß werden kann. Wenn das zutrifft, mußt Du mit sogenannten Streams arbeiten.

Gruß
Martin

Dank
Danke für Deinen Tip, Martin,

In der Onlinehilfe habe ich zuvor nichts gefunden und von Streams habe ich leider keine Ahnung.

Vielen Dank

Eyck

Nochmal Hi, Eyck,

und merci für Dein Feedback.

In der Onlinehilfe habe ich zuvor nichts gefunden

Es könnte daran liegen, daß Du nicht weißt, wie Du die Online-Hilfe effizient bedienst. Das Zauberwort heißt „kontextsensitive Hilfe“.

Die k. H. wird grundsätzlich immer über dieselbe Taste aufgerufen, und zwar die Taste „F1“. „Kontextsensitiv“ heißt sie deshalb, weil sie immer über den „Kontext“ Bescheid weiß, der einer aktuellen Hilfeanforderung zugrundeliegt. Was es damit auf sich hat, siehst Du am besten, wenn Du mal folgendes tust:

• Schreib im Editorfenster das Wort „TMenuItem“ (sollte nicht schon irgendwo eins stehen), setze den Cursor darauf (Du brauchst das Wort nicht zu markieren), und drücke die Taste „F1“.

• Setze den Cursor im Editorfenster auf das Wort „PROCEDURE“ und drücke die Taste „F1“.

• Erzeuge absichtlich eine Compiler-Fehlermeldung, indem Du etwa irgendwo ein „end“ auskommentierst. Klicke in dem Bereich des Editorfensters, wo die Fehlermeldungen angezeigt werden, die interessierende Fehlermeldung an, und drücke gleich danach die Taste „F1“.

• Klicke im Objektinspektor irgendein Property an (z. B. „Caption“ des Formulars) und drücke die Taste „F1“. Wiederhole das gleiche für irgendein Event.

• Klicke in der Komponentenpalette die Komponente „TEdit“ an (Palette „Standard“ ganz links) und drücke glich danach die Taste „F1“.

• Hol Dir im Hauptmenü den Menüpunkt „Suchen/Inkrementalsuche“, ohne ihn auszuführen (Maus „darüberhalten“, so daß er hervorgehoben wird, aber nicht klicken). Drücke dann die Taste „F1“.

So, das dürften genug Beispiele für die Leistungsfähigkeit der kontextsensitiven Hilfe gewesen sein. Ich hoffe, ich konnte Dich davon überzeugen, daß es sich um ein äußerst mächtiges und nützliches Tool handelt. Für mich ist das Drücken der „F1“-Taste beim Programmieren mit Delphi eine feste Gewohnheit, ebenbürtig mit dem Drücken der „F9“-Taste (Anwendung compilieren und starten).

und von Streams habe ich leider keine Ahnung.

Na, gut, was für eine Antwort erwartest Du darauf, außer der, daß Du Dir im Bedarfsfall das entsprechende Know-How eben aneignen müßtest. Wenn ich Dir mit einem Literaturtip dienen kann (soll jetzt keine Werbung sein): Ein Buch zur allgemeinen Delphi-Programmierung, auf das ich große Stücke halte , ist „Delphi 5“ von E. Warken aus dem Addison-Wesley-Verlag. Sehr kompetent und kompakt (d. h. ohne Sätze, die zu 30 % aus überflüssiger Laberei bestehen) vom Profi für Profis – oder solche, die es werden wollen – geschrieben. Ist zwar 'n dicker Schinken, hat aber einen hinsichtlich Quantität und Qualität erstklassigen Informationsgehalt.

Mit freundlichem Gruß
Martin

Hallo,

Der Typ String ist ein Zeiger auf einen Ansistring mit dynamischer Länge. Felder in einem Record müssen aber eine definierte Länge haben, wenn Du sie in einer typisierten Datei speichern willst. Entweder du verwendest einen String mit fester Länge (String[25]) oder den Typ Shortstring, der dem String aus Pascal und D1 mit Länge 255 entspricht.

Ich löse sowas, indem ich nicht Records sonder Nachfahren von TPersistent verwende und diese in einem Stream speichere.

Gruss und viel Erfolg

RQ

nachsatz:

such mal in den VCL-Sourcen nach Savetostream / Loadfromstream für Beispiele :o)

Hallo Martin,

Habe recht herzlichen Dank für Deine ausführliche Unterstützung zum effizienteren Umgang mit F1… und Deine Literaturempfehlung. Ich habe zwar einige Bücher über Pascal und Delphi, die sind aber zur Erklärung einiger Sachen etwas umständlich. Und mit Learn by doing kommt man in OOP und Co nicht sehr weit, leider.

Nochmals Vielen Dank

Eyck