Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei in Record Muster überführen (https://www.delphipraxis.net/172584-textdatei-record-muster-ueberfuehren.html)

mabstudent 12. Jan 2013 12:53

Delphi-Version: 5

Textdatei in Record Muster überführen
 
Hallo zusammen, ich habe folgendes Problem:

Vorweg, worum gehts: Programm soll auf Knopfdruck einen per Zufall ermittelten Spruch aussuchen und in ein Memofeld schreiben. Die Sprüche sind in einer Textdatei, aufgebaut aus (spruch;autor<nächste Zeile>spruch;autor<nächste Zeile> usw.). Das Programm soll den Spruch aus der Recorddatei holen, die zuvor erzeugt wird und in das Memofeld schreiben. Erstmal der Ansatz:

Delphi-Quellcode:
type Tsprueche=record
spruch:string[200];
autor:string[50];
end;

procedure speichern(hilfe:string);
var s:Tsprueche; s1:string; posi:integer;
    f:textfile; //hier stehen ca. 20 Sprüche, Weisheiten, etc. drin
    datei:file of Tsprueche; //record vom Textfile
begin
assignfile(f,'C:\...'+'spruch.txt');
reset(f);
AssignFile(datei,'C:\...'+'sprueche.dat');
  IF fileexists('C:\...'+'sprueche.dat') THEN
  Reset(datei) ELSE Rewrite(datei);
posi:=0;
while not eof(f) do
  begin
  readln(f,hilfe);
  posi:=pos(';',hilfe);
  s1:=copy(hilfe,1,posi-1);
  case posi of
  0: s.spruch:=s1;
  1: s.autor:=s1;
  end;
  write(datei,s);
  end;
closefile(f);
closefile(datei);
Anschließend soll unter Button1Click folgendes passieren:

1. per Zufall einen der Sprüche ermitteln, die ja jetzt im record Muster vorhanden sind, also über seek(datei, nr des zufallsspruchs) angesprochen werden können

2. Spruch ins Memo schreiben (<spruch> +'von'+ <autor>)

Hier bekomme ich enorm Probleme mit den Typen der einzelnen Variablen und der Übernahme aus der anderen Prozedur. Kann mir an der Stelle jemand helfen?

DeddyH 12. Jan 2013 13:00

AW: Textdatei in Record Muster überführen
 
Ist das mit der typisierten Datei und dem Record eine Vorgabe, oder darfst Du das auch anders lösen? IMO ginge das z.B. mit einer T(Mem)IniFile bedeutend einfacher. Ansonsten sieht mir die case-Abfrage etwas sonderbar aus, was ist denn, wenn ";" gar nicht im String vorkommt? Möglicherweise habe ich den Code aber auch nur zu schnell überflogen und daher die Logik nicht begriffen.

Klaus01 12. Jan 2013 13:04

AW: Textdatei in Record Muster überführen
 
Hallo,

musst Du die TextDatei so einlesen?

Einfacher ginge es mit einer TStringList und dem entsprechenden Delimiter.

Grüße
Klaus

mabstudent 12. Jan 2013 13:08

AW: Textdatei in Record Muster überführen
 
Zitat:

Ist das mit der typisierten Datei und dem Record eine Vorgabe, oder darfst Du das auch anders lösen?
Zitat:

musst Du die TextDatei so einlesen?
Leider schreibe ich das Programm nicht für mich, sondern es ist eine vorgegebene Aufgabe, wo der Umgang mit Records gelernt werden soll. Hab auch schon gedacht, dass es ja anders viel einfacher ginge. Muss es leider genau so machen.

Zitat:

was ist denn, wenn ";" gar nicht im String vorkommt?
Also das in der Textdatei zwischen spruch und autor immer ein semikolon steht weiß ich ganz sicher.

DeddyH 12. Jan 2013 13:12

AW: Textdatei in Record Muster überführen
 
Dann teil doch das Gesamtproblem einmal in Teilprobleme auf und schreib die schön einzeln als Funktionen bzw. Prozeduren. Eine ordentliche Einrückung hilft beim Code-Verständnis übrigens ungemein, Du solltest darauf achten.

Klaus01 12. Jan 2013 13:23

AW: Textdatei in Record Muster überführen
 
.. auslesen könnte so gehen..

Delphi-Quellcode:
procedure readRandomDataset(fileName: TFilename; var dataSet: TSprueche);
var
  dataFile : file of TSprueche;
  idx : longInt;
begin
  assignFile(dataFile,fileName);
  reset(dataFile);                //Datei öffnen, Dateizeiger auf Pos. 0
  idx := random(sizeOf(dataFile)); // ermitteln eines zufälligen Datensatzes/Records
  seek(dataFile,idx);             // setze Dateizeiger auf den zufälligen Datensatz
  read(dataFile,dataSet);         // lese Datensatz/Record
  closeFile(dataFile);            // Datei schliessen
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  dataSet : TSprueche;
begin
  readRandomDataSet('...',dataSet);
  memo1.Lines.Add(format('%s von %s',[dataSet.author,dataSet.textValue]));
end;
Einbauen könnte man noch eine gescheite Fehlerbehandlung.

Grüße
Klaus

DeddyH 12. Jan 2013 13:29

AW: Textdatei in Record Muster überführen
 
Und hier noch ein Grobkonzept zur Konvertierung:
Delphi-Quellcode:
type
  Tsprueche=record
    spruch:string[200];
    autor:string[50];
  end;
 
procedure StringToSpruch(const Line: string; var Spruch: TSprueche);
const
  DELIM = ';';
var
  DelimPos: integer;
begin
  FillChar(Spruch, SizeOf(Spruch), #0);
  DelimPos := Pos(DELIM, Line);
  Spruch.autor := Copy(Line, 1, DelimPos - 1);
  Spruch.spruch := Copy(Line, DelimPos + 1, MAXINT);
end;
 
procedure Konvertieren(const SrcFilename, DestFilename: string);
var
  Spruch: Tsprueche;
  Zeile: string;
  Eingabe: textfile;
  Ausgabe: file of Tsprueche;
begin
  (* Eingabe öffnen *)
  (* Ausgabe öffnen *)
  (* Schleife *)
    (* Zeile aus Eingabe lesen *)
    StringToSpruch(Zeile, Spruch);
    (* Spruch in Ausgabe schreiben *)
  (* Ende Schleife *)
  (* Ausgabe schließen *)
  (* Eingabe schließen *)
end;
Ungetestet, da im Editor heruntergetippt.

mabstudent 12. Jan 2013 14:38

AW: Textdatei in Record Muster überführen
 
puh da ist zu viel bei wovon ich noch nie etwas gehört habe. Probiere gerade eure Tips so umzusetzen, dass ich nur das nutze was wir auch bisher an Werkzeug an die Hand bekommen haben, leider erfolglos.

Teilprobleme sind meiner Meinung nach:

1. Recorddatei 'sprueche.db' erzeugen (klappt noch)

Code:
type Tsprueche=record
spruch:string[200];
autor:string[50];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AssignFile(datei,'C:\...\'+'sprueche.dat');
  IF fileexists('C:\...\'+'sprueche.dat') THEN
  Reset(datei) ELSE Rewrite(datei);
end;

2. Die Sprüche aus der sprüche.txt Textdatei in die record datei namens datei schreiben, dabei nach spruch und autor trennen

:?:


3.Button1Click, also zufälligen Spruch ins Memo schreiben

Code:
procedure TForm1.Button1Click(Sender: TObject);
var spruch, autor:string;
 
begin
  nr:=random(filesize(datei));
  seek(datei,nr);
  //*Wie kann ich nun das was er da geseeked hat als string unter spruch speichern und den autor unter autor?
  spruch:= //alles vor ;
  autor:= //das nach ;
  memo1.Lines.Add(<spruch>+'von'+<autor>)
end;
Ich wäre für jeden weiteren Tipp sehr dankbar, dennoch habe ich die bereits vorhandenen Tipps auch noch nicht 100% durchschaut, daran arbeite ich gerade :wink:

mabstudent 12. Jan 2013 15:16

AW: Textdatei in Record Muster überführen
 
Zitat:

procedure Konvertieren(const SrcFilename, DestFilename: string);
var
Spruch: Tsprueche;
Zeile: string;
Eingabe: textfile;
Ausgabe: file of Tsprueche;
begin
(* Eingabe öffnen *)
(* Ausgabe öffnen *)
(* Schleife *)
(* Zeile aus Eingabe lesen *)
StringToSpruch(Zeile, Spruch);
(* Spruch in Ausgabe schreiben *) *//Könntest du den Teil konkretisieren?
(* Ende Schleife *)
(* Ausgabe schließen *)
(* Eingabe schließen *)
end;
Muss es heißen:

write(dateivariable,von, bis) oder write(dateivariable, was) ??

DeddyH 12. Jan 2013 15:20

AW: Textdatei in Record Muster überführen
 
Da steht Schleife, d.h. Du befindest Dich an der Stelle innerhalb einer solchen. Hier wurde die aktuell ausgelesene Zeile aus der Textdatei in den übergebenen Record geschrieben, es muss also heißen
Delphi-Quellcode:
write(Ausgabe, Spruch);
wobei Ausgabe die Dateivariable der typisierten Datei und Spruch die Variable vom Typ des Records ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Seite 1 von 3  1 23      

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