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 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:39 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