Entwickler-Ecke
Dateizugriff - txt datei lesen und in einer tabelle wieder ausgeben
toxicmaster - So 19.12.04 18:40
Titel: txt datei lesen und in einer tabelle wieder ausgeben
hi,
habe ein programm womit ich gerechnete werte in eine txt datei mit datum speichere.
aus dieser datei will ich nun die werte rauslesen lassen und direkt in einer tabelle anzeigen lassen.
habe aber null ahnung wie ich das jetzt angehen soll. wäre nett wenn mir einer nen paar codes als hilfestellung geben würde, da ich ein delphi neuling bin
Basti - So 19.12.04 18:49
Also gut.
Wenn ich voraussetze, dass du das, was du schon has tselber gemacht hast,
hast du schon einiges Wissen, worauf ich zurückgreifen kann.
Zur Erinnerung: Mit Reset öffnest du eine Datei, mit ReadLn liest du eine Zeile ein (näheres in der Delphi Hilfe).
Du müsstest dir jetzt eine Struktur für die Datei ausdenken.
Ich habe 2 Vorschläge, wenn du Datum und Ergebnis speichern willst:
1. Vraiante für Dateistruktur
Datum
Ergebnis
Datum
Ergebnis
2. Vraiante für Dateistruktur
Datum TRENNZEICHEN Ergebnis
Datum TRENNZEICHEN Ergebnis
So, jetzt musst du dich entscheiden. 1. ist einfacher, weil du die gelesene Zeile nicht noch Spalten musst.
Also nimmst du dir eine Schleife, die so lange durhläuft, bis das Ende der Datei
erreicht ist. Schau dazu mal in der Delphi Hilfe unter EOF (End of File).
In der Schleife liest du dann jeweils 2 zeilen mit ReadLn ein.
Die 1. Zeile (Datum) schreibst du in die 1. Spalte der StringGrid,
die 2. Zeile in die 2. Spalte.
Damit du nicht immer die selbe Zeile der StringGrid überschreibst, musst du
pro Schleifendurchlauf eine Variable um 1 erhöhen.
Auf die StringGrid Zeillen greifst du so zu:
Delphi-Quelltext
1:
| StringGrid1.Cells[Spalte,Zeile] := 'Hallo'; |
Das war's dann ausch schon.
Datei wieder schließen und gut ist.
Versuch mal damit klarzukommen, wenn nicht helfen wir dir gerne nochmal.
Füge dann aber bitte bei Fehlermeldungen gleich den Quelltext hier mit ein, okay? :D
toxicmaster - So 19.12.04 19:09
hi,
also das ist mir alles nen wenig zu hoch :D
aber gut das prinzip versthe ich bloß ich dachte ich würde mit der stringgrid arbeiten und wenn man die macht, dann sind da schon 4 spalten nach rechts und nach unten. und ich habe 3 ergebnisse und ein datum daher würde sich das anbieten, dass ich die nach rechts eintragen würde.
aber gut ich habe null ahnung wie ich das jetzt mit dem read und den zeilen und dem ganzen zeugs angehen soll.
und ich denke ich werds auch nie hinbekommen (aber man kann es ja mal probieren)
ich glaub ich schau mal in die delphi hilfe (aber daraus werd ich eh nie schlau :D)
und wie gesagt wäre toll wenn du nen paar kleine code beispiele machen könntest
Basti - So 19.12.04 19:54
toxicmaster hat folgendes geschrieben: |
ich dachte ich würde mit der stringgrid arbeiten und wenn man die macht, dann sind da schon 4 spalten nach rechts und nach unten. und ich habe 3 ergebnisse und ein datum daher würde sich das anbieten, dass ich die nach rechts eintragen würde. |
Ja, das stimmt soweit erstmal.
Schau dir im Objektinspektor die Eigenschafte nRowCount und Colcount an, damit kannst du Spaltenanzahl
und eilenanzahl einstellen.
Entnehme ich deinem Text, dass du 4 Daten speicherst? Dann brauchst du halt 4 Spalten und in die 1. kommt
meinetwegen das Datum und in die restlichen die anderen Egebnisse.
Dazu musst du die Struktur der Datei und der Schleife entsprechend ändern: 3 Zeilen lesen / schreiben.
toxicmaster hat folgendes geschrieben: |
aber gut ich habe null ahnung wie ich das jetzt mit dem read und den zeilen und dem ganzen zeugs angehen soll.und ich denke ich werds auch nie hinbekommen (aber man kann es ja mal probieren)
ich glaub ich schau mal in die delphi hilfe (aber daraus werd ich eh nie schlau :D) |
Versuchen musst du es schon mal ;)
toxicmaster hat folgendes geschrieben: |
und wie gesagt wäre toll wenn du nen paar kleine code beispiele machen könntest |
Das macht man hier sehr ungerne, aber gut.
In der Delphi Hilfe steht zu ReadLn und AssignFile folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var F: TextFile; S: string; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); Reset(F); Readln(F, S); Edit1.Text := S; CloseFile(F); end; end; |
Mit ein wenig Bemühung hättest du das auch selber rausbekommen und ich hätte dir das
gleiche gesagt. Wenn du das also nicht versteht, dann kann ich dir auch nicht helfen.
1. AssignFile => Einer Variable wird der Dateiname zugewiesen.
2. Reset => Diese Variable wird hier übergeben, die Datei wird geöffnet, der Dateicursor ist am Anfang
3. ReadLn => Aus der Datei wird ein String gelesen
4. CloseFile => Die Datei wird wieder geschlossen.
Du willst das noch erweitern:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| Öffne Datei y = 1 Wiederhole Lies Datum (Zeile1) Lies Ergebnis1 (Zeile2) Lies Ergebnis2 (Zeile3) Lies Ergebnis3 (Zeile4) Füge Datum zu StringGrid Zelle 0,y hinzu Füge Ergebnis1 zu StringGrid Zelle 1,y hinzu Füge Ergebnis2 zu StringGrid Zelle 2,y hinzu Füge Ergebnis3 zu StringGrid Zelle 3,y hinzu Erhöhe y Erhöhe die Anzahl der StringGrid Zeilen um 1 bis Ende der Datei erreicht |
Mehr Code bekommst du nun aber wirklich nicht, damit müsstest du es schaffen.
Ist ja bloß noch Übersetzungsarbeit.
toxicmaster - Di 21.12.04 17:37
hi,
danke für die antwort.
also ich habe nen kleines problem habe aber verstanden was du im großen und ganzen meintest.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var filename:string; s:string; begin filename:=('Rechnung.txt'); if OpenDialog1.Execute then begin AssignFile(filename, OpenDialog1.FileName); Reset(filename); Readln(filename, S); memo1.Text := S; CloseFile(filename); end end; |
kannst du mir sagen was da falsch ist und was da wo hingehört?
also ich glaube da stimmt was nicht mit dem opendialog1.execute!
wozu brauche ich eigentlich die variable s:string; ?? was macht die??
AXMD - Di 21.12.04 17:43
toxicmaster hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var filename:string; s:string; begin filename:=('Rechnung.txt'); if OpenDialog1.Execute then begin AssignFile(filename, OpenDialog1.FileName); Reset(filename); Readln(filename, S); memo1.Text := S; CloseFile(filename); end end; | |
AXMD
toxicmaster - Di 21.12.04 17:57
okay thx.
weißt du auch wo mein fehler liegt?
denn irgentwie kreidet er mir immer die opendialog1 als falsch an!!!!
HSchaffi - Di 21.12.04 18:55
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var filename:string; s:string; begin filename:=('Rechnung.txt'); if OpenDialog1.Execute then begin AssignFile(filename, OpenDialog1.FileName); Reset(filename); Readln(filename, S); memo1.Text := S; CloseFile(filename); end end; |
Das ist nach meiner Ansicht der Fehler!!
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
toxicmaster - Di 21.12.04 19:00
nur so zur info ich habe jetzt nicht mehr vor die ergebnisse aus einer txt datei zu holen sondern eine notiz.
das ist für den anfang zum lernen ein wenig einfacher.
also ich habe ein memo ein button der das laden soll, (den code vom button habe ich schon gepostet) was in einer txt-datei (Rechnung.txt) steht (das ist eine notiz die ich dort per speichern aus meinem programm abgespeichert habe, was aber für mein problem jetzt keine auswirkung habe dürfte)
noch mal die kurzfassung:
memo wo text rein soll
+
button der den text für memo aus einer txt-datei holt(button code steht oben)
eigentlich müsst ihr mir nur den fehler an meiner oberen button konstruktion verraten.
thx ;D
HSchaffi - Di 21.12.04 19:02
Du musst den Variablentyp ändern. Denn du möchtest ja eine Textdatei lesen. Also.... Textfile!!!!!!!!
toxicmaster - Di 21.12.04 19:08
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var filename:textfile; s:string; begin filename:=('Rechnung.txt'); if OpenDialog1.Execute then begin AssignFile(filename, OpenDialog1.FileName); Reset(filename); Readln(filename, S); memo1.Text := S; CloseFile(filename); end; end; |
danke habe ich nicht gewusst :D
aber es geht trotzdem nicht. #:'(
HSchaffi - Di 21.12.04 19:13
Ich verstehe nicht, was du mit dem OpenDialog willst, wenn du den Namen schon vorher zuweist?
HSchaffi - Di 21.12.04 19:18
Ich muss jetzt noch mal fragen, was du so richtig willst? Wenn ich richtig verstanden habe, willst du eine vorhandene Textdatei öffnen und den Inhalt in ein Memofeld wieder geben. Ist das korrekt?
toxicmaster - Di 21.12.04 19:23
ja richtig.
HSchaffi - Di 21.12.04 19:40
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button3Click(Sender: TObject); var filename:textfile; s:string; begin
if OpenDialog1.Execute then begin AssignFile(filename, OpenDialog1.FileName); try Reset(filename); Readln(filename, S); memo1.Text := S; finally CloseFile(filename); end; end; end; |
Versuche es mal damit!!!!
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
toxicmaster - Di 21.12.04 19:48
ne geht nicht
immer noch das opendialog1
!undefinierter bezeichner!
HSchaffi - Di 21.12.04 19:53
Die Komponente hast du aber schon mit drinnne? Ansonsten weiß ich auch nicht weiter, sehe nicht das ganze Prog.
JayEff - Di 21.12.04 19:56
:shock: Wenn du einen Opendialog auf die Form gezogen hast, dann versteh ich nicht, woran s liegen könnte! Wenn nicht: TOpenDialog ist eine Komponente der Registerkarte "Dialoge".
aber interessanterweise gehts damit auch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var x:TOpenDialog; begin x:=TOpenDialog.Create(Button1); x.Execute; x.free; end; |
Damit erstelle ich mir einen Opendialog genannt x, mit dem Owner Button1 (OHA! :shock: keine ahnung, warum das einen owner braucht, und was ein owner ist! bau dir deinen dialog lieber auf die Form, statt ihn so zu erzeugen, da ich ka hab, was der owner sein soll. Vll änderst du iwas gravierendes... oO)
toxicmaster - Di 21.12.04 19:58
könnte es daran liegen, dass die variable filename nicht festgelegt ist?
das müsste doch dahin
filename:=('Rechnung.txt');
ach ja und noch etwas ich habe es so gespeichert, dass die txt datei in dem ordner wo die exe datei ist gespeichert wird.
Delphi-Quelltext
1:
| ExtractFilePath(Application.ExeName) |
das könnte auch noch ein grund sein. aber erstmal muss das programm ja mal laufen.
es lässt sich ja nichtmal kompilieren.(dank dem opendialog1).
HSchaffi - Di 21.12.04 20:06
Du kannst einer Textfile nicht einfachso den Namen zuweisen. Eine Textfile muss erzeugt werden.
Delphi-Quelltext
1:
| AssignFile(filename, Dateiname); |
Ich denke es liegt eher an deinem OpenDialog!!!
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
Christian S. - Di 21.12.04 20:10
Hallo, HSchaffi!
Bitte nutze für Deinen Delphi-Code die Delphi- anstatt der Code-Tags. Dadurch wird der Sourcecode mit Syntax-Highlighting angezeigt!
Danke
Christian :-)
HSchaffi - Di 21.12.04 20:12
Ok :D
Danke
toxicmaster - Di 21.12.04 20:13
aber die textfile isdt ja schon vorhandn wieso muss es dann nochmal erstellt werden?
HSchaffi hat folgendes geschrieben: |
Du kannst einer Textfile nicht einfachso den Namen zuweisen. Eine Textfile muss erzeugt werden.
Delphi-Quelltext 1:
| AssignFile(filename, Dateiname); |
|
HSchaffi - Di 21.12.04 20:17
AssignFile .... verknüpft eine Dateivariable mit einer Datei. Diese Verbindung wird erst mit CloseFile aufgehoben.
toxicmaster - Di 21.12.04 20:59
was ist opendialog1.execute ???????? :?: :shock:
JayEff - Di 21.12.04 21:07
damit wird der dialog zum öffnen einer datei angezeigt, vorausgesetzt OpenDialog1 ist vom Typ TOpenDialog oder TOpenPictureDialog
toxicmaster - Di 21.12.04 21:26
ist es in meinem fall richtig angewandt?
Basti - Di 21.12.04 22:11
Wenn du keinen Öffnen-Dialog willst kannst du statt OpenDialog.FileName da deinen String mit der absoluten Adresse angeben!
toxicmaster - Mi 22.12.04 15:41
mit abseluter adresse meinst du pfad oder???
EDIT:
ahhhhh ich verstehe jetzt was ihr mit open dialog meint.
das ist doch so ne fenster wie z.b. bei speichern unter und so.
ne das will ich ja nicht ich will, dass der sofort die datei nimmt und nicht erst diesen dialog öffnet. :D
Basti - Mi 22.12.04 16:46
Ja, ich meine den Pfad.
Darum sollst du auch den Dialog ersetzen. Willst du ja nicht.
Stand aber nun mal so in der Hilfe - da muss man halt etwas sortieren
können :)
Geht's ?
toxicmaster - Mi 22.12.04 16:49
aber wie muss das dann jetzt aussehen ????
mhhh null ahnung aber ich teste mal kurz was und poste dann mal etwas damit ihr mich verbessern könnt.
dann geht das besser.
EDIT:
so hier ist mein versuch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var filename:textfile; s:string; begin filename:=('Notiz.txt'); if filename:=('Notiz.txt'); then begin AssignFile(filename, OpenDialog1.FileName); Reset(filename); Readln(filename, S); memo1.Text := S; CloseFile(filename); end; end; |
ich kann aber keinen kompletten pfad eingeben,weil ich die txt-dat mit dem folgendem code in dem ordner wo die exe-datei ist gespeichert habe.
Delphi-Quelltext
1:
| Extractfilepath(application.exename); |
JayEff - Mi 22.12.04 18:17
toxicmaster hat folgendes geschrieben: |
so hier ist mein versuch:
Delphi-Quelltext 1: 2:
| filename:=('Notiz.txt'); if filename:=('Notiz.txt'); then | |
AHHHH! Erstmal kannst du wie bereits gesagt einem Textfile nicht einfach einen Pfad zuweisen. dann was soll das ('') ??!! dann eine Zuweisung anstelle einer Bedingung im IF ??!!! was ist das??!!
richtig:
Delphi-Quelltext
1:
| AssingFile(filename, Trim(ExtractFilePath(Appkication.exename))+'Text.txt'); |
Hiermit weist du dem Textfile "filename" die datei Text.txt in deinem Projekt Ordner zu. Warum du dann noch eine If-abfrage machenw illst, die auf jedenfall wahr ist, da du das ja vorher festlegst, kann ich dir nicht sagen, da meine Kristallkugel in reperatur ist...
HSchaffi - Mi 22.12.04 18:31
Und ich habe gedacht, du willst keinen OpenDialog? Warum nimmst du ihn dann wieder rein?
Ich denke du solltest versuchen mehr die Hilfe zu nehmen. Glaube mir, was du selber raus bekommst, durch lesen und ausprobieren, vergiss du nie und lernst es besser!!!!
toxicmaster - Mi 22.12.04 21:40
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button3Click(Sender: TObject); var filename:textfile; s:string; begin
AssingFile(filename, Trim(ExtractFilePath(Appkication.exename))+'text.txt'); Reset(filename); Readln(filename, S); memo1.Text := S; CloseFile(filename); end; |
das funktioniert immernochnicht.
aber ich habe wieder was falsch.
HSchaffi - Mi 22.12.04 22:48
Heißt deine Datei auch 'text.txt' ??????? Weil du schon mal diesen Namen 'Notiz.txt' zuweisen wolltest!!!!!!!!
Und es heißt application.exename und nicht Appkication.exename !!!!!!!!
toxicmaster - Mi 22.12.04 22:53
Delphi-Quelltext
1:
| AssingFile(filename, Trim(ExtractFilePath(Application.exename))+'notiz.txt'); |
sorry habe das falsche kopiert.
das ist das was ich in meinem delphi projekt habe.
HSchaffi - Mi 22.12.04 23:00
Schreibe doch bitte mal genau, was denn jetzt nicht geht!!!!
toxicmaster - Mi 22.12.04 23:03
edit
es kommt ne fehlermeldung wenn ich auf den button klicke (fehlermeldung kommt gleich)
AXMD - Mi 22.12.04 23:04
Weil es Assign heißten muss ;)
AXMD
toxicmaster - Mi 22.12.04 23:07
jop hab ich auch bemerkt! geht auch bloss er liest nur das datum und nicht die ganze datei.
also ich habe nen feld mit nem datum und nen feld mit einer notiz und die speicher ich dann.
wenn ich das prog wieder oeffne und die notiz lade, dann wird nur das datum aus der txt dat geladen.(also nur die erste zeile)
AXMD - Mi 22.12.04 23:09
Delphi-Quelltext
1: 2: 3: 4:
| while not(EOF(f)) do begin ReadLn(f, s); Memo1.Lines.Add(s); end; |
Hilft dir das viell. weiter?
AXMD
HSchaffi - Mi 22.12.04 23:19
Mit Readln(filename, S); liest du auch nur die erste Zeile aus einer Datei!!!!!
Narses - Mi 22.12.04 23:39
Moin!
Wir hatten noch nicht: :wink:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var Zeilen: TStringList; Dateiname: String;
Dateiname := 'C:\TEST.TXT'; Zeilen := TStringList.Create; Zeilen.LoadFromFile(Dateiname); Memo1.Assign(Zeilen); Zeilen.Free; |
cu
Narses
JayEff - Do 23.12.04 03:42
weist du woran das liegt? weil readln Read Line heist. er liest nur eine Zeile. ich vermute, du müsstest das ganze in eine schleife packen, und solange readln machen, bis das ende des dokuments erreicht ist.
und die sache mit dem Zeilen.LoadFromFile geht auch einfacher:
Memo1.Lines.LoadFromFile('C:\hallo.txt'); ... wollte ich grade sagen xD
ich seh grad: ihr seid alle imemr schneller als ich -.-
toxicmaster - Do 23.12.04 10:51
warum kann ich nicht einfach sowas wie das hier machen?
Delphi-Quelltext
1:
| repeat Readln(filename, S) until endoffile |
toxicmaster - Do 23.12.04 11:11
alles klar habe es jetzt geschafft. :D
ich danke euch habt mir gut geholfen.
Basti - Do 23.12.04 11:32
Ob du nun While oder Repeat nimmst ist Jacke wie Hose.
Allerdings möchte ich dich doch nochmal sehr sehr sehr aufdringlich darauf hinweisen,
dass ich dir am Anfang mal ganz genau beschrieben habe, was du programmieren musst. :wink:
Jeden einzelnen Schritt....
Da stand das auch mit der Schleife...
Ich vermute mal du hast jetzt einfach den Code kopiert.
Dann steht uns ja noch eine freudige Zeit bevor, wenn du jetzt wissen willst,
wie du die Tabelle in eine txt Datei schreibst :shock:
toxicmaster - Do 23.12.04 12:15
nein das ganze hier bezieht sich doch garnicht mehr auf eine tabelle sondern auf etwas einfacheres, nämlich einem memo. und aus nem memo in nen txt schreiben kann ich.
Jelzin - Mo 27.12.04 10:23
Im übrigen:
Quelltext
1:
| Memo1.Lines.LoadFromFile(filename); |
Ist
a.) Wesentlich einfacher zu handhaben und
b.) Wesentlich schneller als sequentiell einlesen zu lassen
Gruß Jelzin
toxicmaster - Di 28.12.04 21:42
ja habe auch das benutzt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!