Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei einlesen u. drucken (https://www.delphipraxis.net/66756-textdatei-einlesen-u-drucken.html)

Sturmrider 3. Apr 2006 19:20


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*

mkinzler 3. Apr 2006 19:26

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);

Sturmrider 3. Apr 2006 19:27

Re: Textdatei einlesen u. drucken
 
Aber damit wird die Datei doch nur eingelesen oder? Gedruckt wird da doch nichts, oder?

mkinzler 3. Apr 2006 19:37

Re: Textdatei einlesen u. drucken
 
Sorry, das fehlt natürlich noch: Dieser Code schreibet die Werte in ein StringGrid

Delphi-Quellcode:
...
    for i := 0 to sl.Count do
    begin
      StringGrid.Cells[i,j] := sl.Strings[i]
    end;
    inc(j);
...
    griddruck(stringgrid,0,0,1);
...
Anschließen kannst du es mit diesem Code von Detlef Brettschneider drucken:

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;

Sturmrider 3. Apr 2006 19:45

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?)

mkinzler 3. Apr 2006 19:51

Re: Textdatei einlesen u. drucken
 
Zitat:

Zitat von Sturmrider
(schaaaaade, dass die Scripts nicht auskommentiert sind :( )

Welche Skripts?
Zitat:

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?)
das ist eine Prozedur welche du als Methode, Globale Prozedur oder Subprozedur nutzen kannst. Sie stammt aus der Delphi-Source. IDie Procedure erwartet vier Parameter. Dem ersten Parameter muss das zu druckende StringGrid übergeben werden (z.B. StringGrid1), dem zweiten Parameter den linken und oberen Rand beim Drucken. Der vierte Parameter ist für die Skalierung zuständig.

Sturmrider 3. Apr 2006 19:57

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;

mkinzler 3. Apr 2006 20:08

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:
StringReplace( s, '|', ',', rfReplaceAll);
Ich habe auch den Originalbeitrag gefunden

Sturmrider 3. Apr 2006 20:17

Re: Textdatei einlesen u. drucken
 
Danke, aber das hier funktioniert leider immer noch nicht uu:
Delphi-Quellcode:
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;
es kommt die Fehlermeldung: Undefinierter Bezeichner: 'StringReplace'

mkinzler 3. Apr 2006 20:21

Re: Textdatei einlesen u. drucken
 
Überprüfe mal ob die Unit SysUtils eingebunden ist.

Sturmrider 3. Apr 2006 20:27

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?

mkinzler 3. Apr 2006 20:31

Re: Textdatei einlesen u. drucken
 
Zitat:

Zitat von Sturmrider
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)

Nein, sie kann in der selben Unit sein. es würde sich aber anbieten diese in eine andere Unit auszulagern, zwecks Wiederverwendung.
M
Zitat:

uss ich eine neue Unit mit dem namen SysUtils anlegen?
Nein, auf keinen Fall. sysUtils ist eine Standard-Unit in der sich u.a. die Funktion StringReplace befindet.

Benedikt 3. Apr 2006 20:36

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;

mkinzler 3. Apr 2006 20:58

Re: Textdatei einlesen u. drucken
 
Zitat:

Zitat von Benedikt
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...

Warum nicht?

Benedikt 3. Apr 2006 21:02

Re: Textdatei einlesen u. drucken
 
Also sieh dir das mal an hier:

Delphi-Quellcode:
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;
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...

mkinzler 3. Apr 2006 21:12

Re: Textdatei einlesen u. drucken
 
Zitat:

StringReplace ist ... Überflüssig, und auch sonst ist das etwas umständlich meiner Meinung nach...
Aber notwendig, da Delimiter/DelimitedText erst ab D6 vorhanden sind. Anfänglich war dies ja auch so im Code.
Zitat:

StringReplace ist keine Untermethode von TStringList
Da hat er mich falsch verstanden, hatte ihm geraten statt .DelimitedText .CommaText zu nehmen und vorher die Pipes durch Kommas zu ersetzen. Also:

Delphi-Quellcode:
sl.CommText := StringReplace( s, '|', ',', rfReplaceAll);
Hab sein Post nicht mehr durchgelesen und deshalb die Fehler übersehen ;-(

[Edit: Vetippt noch mal!]

Benedikt 3. Apr 2006 21:15

Re: Textdatei einlesen u. drucken
 
Zitat:

Zitat von mkinzler
Aber notwendig, da Delimiter/DelimitedText erst ab D6 vorhanden sind.

Ok, das hab ich net bedacht wenn es so ist bzw. auch weiter oben wohl überlesen, sry dafür...
Mir fiel nur das Chaos in dieser Prozedur auf, aber is ja nun auch egal :wink:

DP-Maintenance 3. Apr 2006 21:19

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.

mkinzler 3. Apr 2006 21:25

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.

Sturmrider 3. Apr 2006 21:28

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?

mkinzler 3. Apr 2006 21:33

Re: Textdatei einlesen u. drucken
 
In deiner Unit sollten 2 Uses-Clauses stehen. In einer muß SysUtils stehen.

DGL-luke 3. Apr 2006 21:36

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:
uses
  System, Forms, .......;
und da muss noch "Sysutils" hin.

ach ja: http://dst.info/tutorials/ da könnts was für dich geben ;)

// ja, sag ich doch....

Sturmrider 3. Apr 2006 22:38

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'

StefanDP 3. Apr 2006 23:05

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!

rory 4. Apr 2006 01:06

Re: Textdatei einlesen u. drucken
 
Zitat:

Zitat von StefanDP
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!

So - oder so ähnlich - mogle ich mich auch (mit einem unsichtbaren RichEdit) oft ums leidige Drucken herum.

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

mkinzler 4. Apr 2006 05:36

Re: Textdatei einlesen u. drucken
 
Kosmisch, dann gabs in D% StringReplace auch noch nicht :-(. Dann implementieren wir das halt schnell ;-(

Delphi-Quellcode:
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;
Jetzt mußt du nur den letezten paramter weglassen. Also:

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