![]() |
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:
Anschließend soll unter Button1Click folgendes passieren:
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); 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? |
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.
|
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 |
AW: Textdatei in Record Muster überführen
Zitat:
Zitat:
Zitat:
|
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.
|
AW: Textdatei in Record Muster überführen
.. auslesen könnte so gehen..
Delphi-Quellcode:
Einbauen könnte man noch eine gescheite Fehlerbehandlung.
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; Grüße Klaus |
AW: Textdatei in Record Muster überführen
Und hier noch ein Grobkonzept zur Konvertierung:
Delphi-Quellcode:
Ungetestet, da im Editor heruntergetippt.
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; |
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:
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:
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; |
AW: Textdatei in Record Muster überführen
Zitat:
write(dateivariable,von, bis) oder write(dateivariable, was) ?? |
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:
wobei Ausgabe die Dateivariable der typisierten Datei und Spruch die Variable vom Typ des Records ist.
write(Ausgabe, Spruch);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz