Entwickler-Ecke

Dateizugriff - Brauche dringend Hilfe zwecks speichern eines RECORD


agdus - Do 02.02.06 00:21
Titel: Brauche dringend Hilfe zwecks speichern eines RECORD
Hallo erstmal und Gruß an alle,

dies ist mein erster Eintrag hier im Forum.

Ich möchte folgendes RECORD in einer Datei speichern


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TFragen = record
    Rubrik: String;
    frage: TStrings;
    antwort1: TStrings;
    antwort2: TStrings;
    antwort3: TStrings;
    punkte: integer;
    FrageGestellt: boolean;
  end;

var
  DatenForm: TDatenForm;
  Daten : array of TFragen;


meine PROCEDURE zum speichern sieht wie folgt aus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Procedure TDatenForm.speichern;

var
  i : integer;
  Datei : file of TFragen;

begin
  assignfile(Datei,'dat\'+ThemaBox.Items[ThemaBox.itemindex]+InttoStr(RubrikBox.itemindex)+'.dat');
  rewrite(Datei);
  for i:= low(daten) to high(daten) do
    begin
      write(Datei,Daten[i]);
    end;
  closefile(Datei);
  ShowMessage('Daten gespeichert');
end;


Das geht leider nicht, ich bekomme folgende Fehlermeldung

[Fehler] UDaten.pas(123): Typ 'TFragen' benötigt Finalization - nicht im Dateityp erlaubt

Könnt Ihr einem blutigen Anfänger bitte helfen?

Danke schon mal

LG
Jürgen


Narses - Do 02.02.06 00:45

Moin und :welcome: im Forum!

Du kannst einen langen String nicht in einer typisierten Datei speichern; das geht nur mit Strings einer festen Länge, also String[255] z.B.

cu
Narses


agdus - Do 02.02.06 18:05

Ja das habe ich in der Online-Hilfe auch gelesen, nutzt nix, die Strings sind länger als 255 Zeichen. Ich komme einfach nicht darauf wie ich die Daten in einem File speichern kann :-( Leider sind meine Kenntnisse auch nicht so berauschend.

Gibt es denn da keine Möglichkeit???


LLCoolDave - Do 02.02.06 18:17

Du könntest das ganze ja auch in einer INI Datei oder einer Textdatei speichern und die anschließend verschlüsseln, damit man die nicht einfach so auslesen kann.


Delete - Do 02.02.06 21:10

nimm doch einfach eine datenbank und leg eine tabelle an. da kannst du dann wunderbar speichern.

tip.: nimm einen primärschlüssel [ggf. noch eine laufnummer] und deine recordfelder als tabellenfelder... dann hast schon fast dein db design ;-)


Horst_H - Fr 03.02.06 09:51

Hallo,

Was soll denn TStrings dort?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 TFrage  = record
              Rubrik  : String;
              frage   : String;
              antwort1: String;
              antwort2: String;
              antwort3: String;
              punkte  : integer;
              FrageGestellt: boolean;
            end;

wenn Du alle Daten als Strings (booltostr,inttostr gibt es ja)speicherst, kannst Du einen Record in eine Stringliste umwandeln und als Delimetedtext oder Commatext zeilenweise in einer Textdatei speichern und einlesen.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
//Wegschreiben
Oeffne Datei;
Erzeuge Stringliste strl;
Fuer alle Dateinsaetze i :
  Stringliste Leeren;
  Alle Komponenten von Frage[i] als String in die Liste einfuegen{Strl.Add(Rubrik);Strl.Add(frrage);...}
  writeln(DAtei,strl.Commatext);

Datei Schliessen
Stringliste Freigeben);
..........
//Einlesen
Oeffne Datei;
Erzeuge Stringliste strl;
i := 0;
Solange Datei noch nicht am Ende (EOF(Datei)):
  Stringliste Leeren;
  Erhoehe die Anzahl der Fragen um 1{setlenght(Frage,High(Frage)+1);}
  readln(Datei,strl.Commatext);
  Alle Komponenten von Strl in Frage[i] uebertragen (Frage[i].Rubrik := strl[0];Frage[i].frage := strl[1]...}
  erhoehe i um 1

Datei Schliessen
Stringliste Freigeben);


Das bedeutet Du musst immer >alle< Fragen einlesen, das >kann< viel Speicherplatz kosten. Aber Das wirst Du selbst merken.

Gruss Horst

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt