Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Delphi: nicht "finalisierten" Verbund in typisierten Dateien speichern

Empfohlene Antworten

Hallo allerseits.

Bin gerade eben auf ein eher theoretisches Problem gestoßen und mir fällt kein cleverer Ausweg ein- vielleicht kann ja jemand helfen. :)

Ich möchte einen Verbund, der dynamische Arrays enthält in typisierten Dateien speichern, um so praktischer darauf zugreifen zu können.

Der Verbund:

  user = record

      name:string[20];

      saw: array of movie;        

      favGenre: array of string[20];

      favActor: array[1..7] of string[20];    

      favDirec: array[1..3] of string[20];    

      end;
Die gewünschte Datei:
var datei:file of user;

Tja, nun liefert mir mein Freund der Compiler den Fehler:

Type user needs finalization- not allowed in file type

Ertappt! Mein saw ist dynamisch, damit unterscheiden sich also die User in ihrer Größe von einander...

Lässt sich hier trotzdem irgendwie der "file of user" verwenden?

Ich würde nur ungern auf TextFile umsteigen. :(

Vielleicht kennt ja jemand nen Ausweg, oder weiß das dies unmöglich ist?

Wäre für jeden Hinweis dankbar. :)

Ciao

Zakum

Bearbeitet von Zakum

Hallo Zakum,

ich hätte einen Lösungsansatz.


  userfile = record

      index:string[12];

      name:string[20];    

      saw: movie;      

      favGenre: string[20];

      favActor: array[1..7] of string[20];    

      favDirec: array[1..3] of string[20];    

      end;

Hast Du jetzt zwei Einträge - Array von Länge 2 - so musst Du zwei Einträge speichern jeweils mit dem gleichen Index - Index könnte Datum + Uhrzeit sein, hängt davon ab wie schnell du Daten erzeugst. Du kannst ja einen zweiten Typ anlegen der so ist: (wie der von Dir zuvor definierte)

  userram = record

      name:string[20];

      saw: array of movie;        

      favGenre: array of string[20];

      favActor: array[1..7] of string[20];    

      favDirec: array[1..3] of string[20];    

      end;

und dann eine Routine schreiben welche die Daten von userfile in den userram

umwandelt und zurück. Anhand des Indexes könntest Du dann erkennen welche Einträge zusammengehören.

Hoffe das ich meinen Gedankengang ausreichend gut in Wortform gebracht habe.

Der Fehler müsste doch für favGenre auch kommen, oder nicht?

Ja, ich nehme an, ich habe die Idee verstanden. :D

Clever gelöst! :uli

Ich glaube aber, das kann ich in dem Kontext nicht umsetzen:

Das ganze soll eine Content Providing Unit werden, in array of movies werden also alle Filme gespeichert, die ein User bereits gesehen hat. Auf dieser Basis soll das Programm dann Vorschläge für Filme liefern, die den User gefallen könnten.

Da für jeden Film (für jeden User) eine neue Datei zu speichern, würde wohl schnell in Chaos ausarten.

Aber den Trick merk' ich mir, der ist ziemlich praktisch!

Ist ja nicht das erste mal, das ich auf ein Finalization Problem stoße, und bestimmt nicht das Letze. ;)

Mit sivestrigen Grüßen,

Zakum

Hi,

[...] Da für jeden Film (für jeden User) eine neue Datei zu speichern, würde wohl schnell in Chaos ausarten. [...]

also eigentlich dachte ich das Du da nur eine Datei hast.

Beispiel:

name     movie       mov-index

user001  abc         0001     

user001  abc dek     0002     

user001  def         0003     

user039  akc         0001     

user040  dkeu        0001     

user001  dkudi       0004     

jetzt muss halt die "einlese-funktion" die einzelnen Datensätze lesen und in das dafür vorgesehene Array speichern.

  userram = record

      name:string[20];

      saw: array of movie;        

      end;

ungefähr so:

userram.name = "user001  "

for zeile in datei.txt do

   begin

     // angenommen du willst nur die daten von user001

      if userfile.name = userram.name

         begin

            // weiteren Platz für Array-Element schaffen

            setlength(userrram.saw, high(userram.saw)+1)

            // daten ablegen

            userram.saw[High(userram.saw)].name := userfile.movie

         end;

   end;

Wie mir soeben auffällt braucht man den Index nicht wirklich :D, aber egal.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.