![]() |
Textdatei einlesen u. drucken
Hi @all
Ich habe da eine ziemlich dringende/eilige Frage bezüglich einem Delphi-Source: Wie kann ich aus einer Textdatei z.B. folgendes einlesen und dann schön in einer Tabelle untereinander aufgelistet ausdrucken? 13.01.2001|Homepage|Seite|URL|18|18:30|19:15|Besch reibung|Hits| 28.03.2002|Testseite|blabla|test|20|18:20|20:30|ad rgdfg|adhdfadh| (das Trennzeichen "|" heißt neue Spalte. Nach jedem 9. "|" kommt ein Zeilenumbruch und sollte neue Zeile in der Tabelle bedeuten.) Bitte helft mir :oops: *noch absoluter Anfänger in Delphi ist* |
Re: Textdatei einlesen u. drucken
Z.B. mit Hilfe einet StringListe.
Delphi-Quellcode:
var
sl: TStrings; tf: TextFile; s: string; ... sl := TStringList.Create; sl.Delimiter := '|'; AssignFile( <dateiname>, tf); Reset( tf); while not eof( tf) do begin ReadLn( tf, s); sl.DelimitedText := s; end; CloseFile(tf); |
Re: Textdatei einlesen u. drucken
Aber damit wird die Datei doch nur eingelesen oder? Gedruckt wird da doch nichts, oder?
|
Re: Textdatei einlesen u. drucken
Sorry, das fehlt natürlich noch: Dieser Code schreibet die Werte in ein StringGrid
Delphi-Quellcode:
Anschließen kannst du es mit diesem Code von Detlef Brettschneider drucken:
...
for i := 0 to sl.Count do begin StringGrid.Cells[i,j] := sl.Strings[i] end; inc(j); ... griddruck(stringgrid,0,0,1); ...
Delphi-Quellcode:
Uses
Printers, Grids; procedure GridDruck(grd:TStringGrid;links,oben:word;scal:double); var x,y,li,ob,re,un,waag,senk,h,a: integer; s: string; function rech(i,j:integer):integer; begin result:=round(((i*j) / 72) * scal); end; begin if scal > 0 then begin waag:=getdevicecaps(printer.handle,logpixelsx); senk:=getdevicecaps(printer.handle,logpixelsy); links:=rech(links,waag); oben:=rech(oben, senk); a:=rech(3,waag); li:=getdevicecaps(printer.handle,physicaloffsetx)+1+links; with printer do begin s:='Grid-Druck'; title:=s; BeginDoc; canvas.font:=grd.font; canvas.font.size:=round((grd.font.size / 0.72) * scal); h:=canvas.textheight(s); canvas.pen.color:=$333333; for x:=0 to grd.colcount-1 do begin if grd.gridlinewidth > 0 then begin canvas.pen.style:=pssolid; canvas.pen.width:=1; end else canvas.pen.style:=psclear; ob:=getdevicecaps(printer.handle,physicaloffsety)+1+oben; re:=li+rech(grd.ColWidths[x]+1,waag); for y:=0 to grd.rowcount-1 do begin un:=ob+rech(grd.RowHeights[y]+1,senk); if (x < grd.fixedcols) or (y < grd.fixedrows) then canvas.brush.color:=grd.fixedcolor else canvas.brush.color:=grd.color; canvas.rectangle(li,ob,re,un); canvas.brush.style:=bsclear; canvas.textrect(rect(li+a,ob+1,re-a,un-1), li+a,ob+(un-ob-h)div 2,grd.Cells[x,y]); ob:=un; end; canvas.brush.color:=clwhite; canvas.pen.style:=psclear; canvas.rectangle(li,ob+1,re,ob+h); li:=re; end; enddoc; end; end; end; |
Re: Textdatei einlesen u. drucken
Achso, kein Problem ^_____^ Danke schoneinmal an dieser Stelle ^^
(schaaaaade, dass die Scripts nicht auskommentiert sind :( ) Ich habe da aber noch eine Frage: Dieses procedure GridDruck(grd:TStringGrid;links,oben:word;scal:dou ble); was genau ist das? Wie kann ich die an einen Drucken-Button "heften"? Ist das eine Subprocedure? (und wenn ja, was sind das für Werte die mit der Subprocedure übergeben werden müssen?) |
Re: Textdatei einlesen u. drucken
Zitat:
Zitat:
![]() |
Re: Textdatei einlesen u. drucken
Na das von Detlef Brettschneider ^---^ bzw. den Source
Ich habe jetzt einfach mal das hier geschrieben, was ja dann eigentlich funktionieren müsste... Aber das tut es leider nicht...es kommt ein Fehler: Undefinierter Bezeichner: 'Delimiter'. Was ich vergessen habe zu erwähnen...ich Arbeite leider nur mit Delphi5 und bin leider schulisch gezwungen dabei zu bleiben...(auch wenns Delphi7 etc. kostenlos für Schüler/Studenten immer mal wieder auf der BornlandHP zum free Download gibt...)
Delphi-Quellcode:
procedure TForm1.DruckenClick(Sender: TObject);
var sl: TStrings; tf: TextFile; s: string; begin sl := TStringList.Create; sl.Delimiter := '|'; AssignFile('posts.ini', tf); Reset( tf); while not eof( tf) do begin ReadLn( tf, s); sl.DelimitedText := s; end; CloseFile(tf); for i := 0 to sl.Count do begin StringGrid.Cells[i,j] := sl.Strings[i] end; inc(j); griddruck(stringgrid,0,0,1); end; procedure GridDruck(grd:TStringGrid;links,oben:word;scal:double); var x,y,li,ob,re,un,waag,senk,h,a: integer; s: string; function rech(i,j:integer):integer; begin result:=round(((i*j) / 72) * scal); end; begin if scal > 0 then begin waag:=getdevicecaps(printer.handle,logpixelsx); senk:=getdevicecaps(printer.handle,logpixelsy); links:=rech(links,waag); oben:=rech(oben, senk); a:=rech(3,waag); li:=getdevicecaps(printer.handle,physicaloffsetx)+1+links; with printer do begin s:='Grid-Druck'; title:=s; BeginDoc; canvas.font:=grd.font; canvas.font.size:=round((grd.font.size / 0.72) * scal); h:=canvas.textheight(s); canvas.pen.color:=$333333; for x:=0 to grd.colcount-1 do begin if grd.gridlinewidth > 0 then begin canvas.pen.style:=pssolid; canvas.pen.width:=1; end else canvas.pen.style:=psclear; ob:=getdevicecaps(printer.handle,physicaloffsety)+1+oben; re:=li+rech(grd.ColWidths[x]+1,waag); for y:=0 to grd.rowcount-1 do begin un:=ob+rech(grd.RowHeights[y]+1,senk); if (x < grd.fixedcols) or (y < grd.fixedrows) then canvas.brush.color:=grd.fixedcolor else canvas.brush.color:=grd.color; canvas.rectangle(li,ob,re,un); canvas.brush.style:=bsclear; canvas.textrect(rect(li+a,ob+1,re-a,un-1), li+a,ob+(un-ob-h)div 2,grd.Cells[x,y]); ob:=un; end; canvas.brush.color:=clwhite; canvas.pen.style:=psclear; canvas.rectangle(li,ob+1,re,ob+h); li:=re; end; enddoc; end; end; end; |
Re: Textdatei einlesen u. drucken
Wenn sichergestellt ist das keine Kommas in der datei vorkommen kann mann statt .DelimitedText .CommText verwenden und die Trenner '|' vorher durch Kommas ersetzen:
Delphi-Quellcode:
Ich habe auch den
StringReplace( s, '|', ',', rfReplaceAll);
![]() |
Re: Textdatei einlesen u. drucken
Danke, aber das hier funktioniert leider immer noch nicht uu:
Delphi-Quellcode:
es kommt die Fehlermeldung: Undefinierter Bezeichner: 'StringReplace'
procedure TForm1.DruckenClick(Sender: TObject);
var sl: TStrings; tf: TextFile; s: string; begin sl := TStringList.Create; sl.StringReplace( s, '|', ',', rfReplaceAll); AssignFile('posts.ini', tf); Reset( tf); while not eof( tf) do begin ReadLn( tf, s); sl.StringReplace( s, '|', ',', rfReplaceAll) := s; end; CloseFile(tf); for i := 0 to sl.Count do begin StringGrid.Cells[i,j] := sl.Strings[i] end; inc(j); griddruck(stringgrid,0,0,1); end; |
Re: Textdatei einlesen u. drucken
Überprüfe mal ob die Unit SysUtils eingebunden ist.
|
Re: Textdatei einlesen u. drucken
Achso procedure GridDruck(grd:TStringGrid;links,oben:word;scal:dou ble); muss in eine eigene Unit?
Ich habe bisher nur eine Unit (nämlich: Unit1.pas) Muss ich eine neue Unit mit dem namen SysUtils anlegen? |
Re: Textdatei einlesen u. drucken
Zitat:
M Zitat:
|
Re: Textdatei einlesen u. drucken
Hi,
ich mein ja nur mal so, aber die Funktion die du da oben zum Einlesen der Datei in dein StringGrid benutzt, ist ja nicht sooo das wahre...
Delphi-Quellcode:
procedure TForm1.DruckenClick(Sender: TObject);
var SlFile: TStringList; SlLine: TStringList; i: Integer; j: Integer; begin SlFile:=TStringList.Create; SlLine:=TStringList.Create; SlFile.LoadFromFile('pfad zu deiner datei'); for i:=0 to SlFile.Count-1 do begin SlLine.Clear; SlLine.Delimiter:='|'; SlLine.DelimitedText:=SlFile[i]; for j:=0 to SlLine.Count-1 do StringGrid1.Cells[j, i]:=SlLine.Strings[j]; end; //hier könntest du jetzt die GridDruck-Prozedur aufrufen. FreeAndNil(SlFile); FreeAndNil(SlLine); end; |
Re: Textdatei einlesen u. drucken
Zitat:
|
Re: Textdatei einlesen u. drucken
Also sieh dir das mal an hier:
Delphi-Quellcode:
Kein Wunder das davon nichts geht? Da würden Fehlermeldungen wegen Listen-Index kommen, StringReplace ist keine Untermethode von TStringList und zudem Überflüssig, und auch sonst ist das etwas umständlich meiner Meinung nach...
procedure TForm1.DruckenClick(Sender: TObject);
var sl: TStrings; tf: TextFile; s: string; begin sl := TStringList.Create; sl.StringReplace( s, '|', ',', rfReplaceAll); AssignFile('posts.ini', tf); Reset( tf); while not eof( tf) do begin ReadLn( tf, s); sl.StringReplace( s, '|', ',', rfReplaceAll) := s; end; CloseFile(tf); for i := 0 to sl.Count do begin StringGrid.Cells[i,j] := sl.Strings[i] end; inc(j); griddruck(stringgrid,0,0,1); end; |
Re: Textdatei einlesen u. drucken
Zitat:
Zitat:
Delphi-Quellcode:
Hab sein Post nicht mehr durchgelesen und deshalb die Fehler übersehen ;-(
sl.CommText := StringReplace( s, '|', ',', rfReplaceAll);
[Edit: Vetippt noch mal!] |
Re: Textdatei einlesen u. drucken
Zitat:
Mir fiel nur das Chaos in dieser Prozedur auf, aber is ja nun auch egal :wink: |
DP-Maintenance
Dieses Thema wurde von "MrSpock" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Object-Pascal / Delphi-Language" verschoben.
Ist kein Beitrag zur Codelib. |
Re: Textdatei einlesen u. drucken
Auch wenn du vielleicht anderst verstanden hast, bin ich offen für Kritik. ;-) Ich hab mir nur gedacht, daß du nicht den ganzen Thread gelesen hast.
|
Re: Textdatei einlesen u. drucken
Ohje...das mit den Units etc. habe ich erlichgesagt nicht im geringsten verstanden uu
Ich bekomme leider immernoch einen Fehler, auch wenn ich Benedikt Version benutze uu [Fehler] Unit1.pas(157): Undefinierter Bezeichner: 'StringReplace' was mache ich nur falsch uu? |
Re: Textdatei einlesen u. drucken
In deiner Unit sollten 2 Uses-Clauses stehen. In einer muß SysUtils stehen.
|
Re: Textdatei einlesen u. drucken
du musst die unit Sysutils einbinden. hat man dir aber auch schon gesagt.
dzu hast oben in DEINER unit eine sogenannte "uses-klausel". da steht
Delphi-Quellcode:
und da muss noch "Sysutils" hin.
uses
System, Forms, .......; ach ja: ![]() // ja, sag ich doch.... |
Re: Textdatei einlesen u. drucken
achso *nickt*
aber ich habe oben in den uses stehen: Sysutils, Forms, Controls, Classes, StdCtrls, unitTStruckturdaten, Unit3, Dialogs, Printers, Grids; trotzdem kommt die Fehlermeldung: [Fehler] Unit1.pas(157): Undefinierter Bezeichner: 'StringReplace' |
Re: Textdatei einlesen u. drucken
Wieso alles so kompliziert!?
Packt den Text in ein TRichEdit, Schriftart auf ne Fix-Breiten-Schrift und dann einfach die print() Methode vom TRichEdit nehmen. Den Drucker kann man dann noch schön mit nem PrinterDialog abfragen. Fertig! |
Re: Textdatei einlesen u. drucken
Zitat:
Notfalls lasse ich mein Programm eine temporäre Datei erzeugen, die dann per ShellExecute vom Windows-Notepad/Wordpad per Kommandozeilenparameter gedruckt wird. Ist aber m.M.n. keine zufriedenstellende Antwort :-( mfg |
Re: Textdatei einlesen u. drucken
Kosmisch, dann gabs in D% StringReplace auch noch nicht :-(. Dann implementieren wir das halt schnell ;-(
Delphi-Quellcode:
Jetzt mußt du nur den letezten paramter weglassen. Also:
function StringReplace( str: string; alt: Char; neu: Char);
var i: Integer; begin for i := 1 to Length( str) do begin if str[i] = alt then str[i] := neu; end; result := str; end;
Delphi-Quellcode:
sl.CommaText := StringReplace( s, '|', ',');
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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-2025 by Thomas Breitkreuz