Autor Beitrag
agdus
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 02.02.06 00:21 
Hallo erstmal und Gruß an alle,

dies ist mein erster Eintrag hier im Forum.

Ich möchte folgendes RECORD in einer Datei speichern

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 212

Win XP
Delphi 2005
BeitragVerfasst: 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.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Fr 03.02.06 09:51 
Hallo,

Was soll denn TStrings dort?
ausblenden 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.
ausblenden 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