![]() |
Tlistview drucken
Wie kann man eine Tlistview mit subitems drucken und formatieren?
|
Hallo und willkommen im Forum!
Schau Dir mal folgende sachen in der OH an: AssignFile, WriteLn, CloseFile, AssignPrn. Du musst einfach eine Schleife bauen, bezogen auf die Anzahl der Items in der LV.
Delphi-Quellcode:
Vor der Schleife öffnest Du die Datei zum Drucken.
for i := 0 to ListView1.Items.Count -1 do
begin //Hier dann den Code zum schreiben. end; Also zwischen dem begin und end brauchst Du einfach diese WriteLn. Hier mal ein Beispiel aus einem Programm von mir.
Delphi-Quellcode:
So hat man alle Items und SubItems formatiert auf dem Blatt. Du musst halt die ganzen Namen der ListViews anpassen.
procedure TMainFormMC2004.DruckenErweitertClick(Sender: TObject);
//Daten Drucken; Im erweiterten Format var tf: TextFile; //tf = Variable zum Datei Schreiben pt: TextFile; //pt = Variable zum Datei Drucken p: string; //Stringvariable für die Druckdatei s, t, r, i, n, g: string; //String für LOKS a, b, c: string; //Strings für FUNKTIONEN iLok, iFkt{, iWei, iWeiSch, iWeiTri, iMtr, iMtrLok}: integer; begin if PrintDialog.Execute then begin AssignFile(tf, ExtractFilePath(ParamStr(0)) + 'DatenErweitert.mce'); ReWrite(tf); //Datei zum Schreiben Öffnen WriteLn(tf, '--------------------- LOKS ---------------------'); WriteLn(tf, '------------------------------------------------'); WriteLn(tf, ' ID: Name: Adr: Träg: Beschl: Verzög: '); WriteLn(tf, '------------------------------------------------'); for iLok := 0 to ListViewKKLok.Items.Count -1 do begin s := ListViewKKLok.Items.Item[iLok].Caption; t := ListViewKKLok.Items.Item[iLok].SubItems[0]; r := ListViewKKLok.Items.Item[iLok].SubItems[1]; i := ListViewKKLok.Items.Item[iLok].SubItems[2]; n := ListViewKKLok.Items.Item[iLok].SubItems[3]; g := ListViewKKLok.Items.Item[iLok].SubItems[4]; while Length(s) < 5 do //Falls die ID weniger als 5 Stellen hat begin s := s + ' '; //Mit Leerstellen füllen end; while Length(t) < 10 do //Falls der Name weniger als 10 Stellen hat begin t := t + ' '; //Mit Leerstellen füllen end; while Length(r) < 3 do //Falls die Adresse weniger als 3 Stellen hat begin r := r + ' '; //Mit Leerstellen füllen end; WriteLn(tf, ' ' + s + ' ' + t + ' ' + r + ' ' + i + ' ' + n + ' ' + g); end; Writeln(tf); //2 Leerzeilen zur Trennung Writeln(tf); //zwischen Loks und Funktionen WriteLn(tf, '------------------ FUNKTIONEN ------------------'); WriteLn(tf, '------------------------------------------------'); WriteLn(tf, ' ID: Name: Adr: '); WriteLn(tf, '------------------------------------------------'); for iFkt := 0 to ListViewKKFkt.Items.Count -1 do begin a := ListViewKKFkt.Items.Item[iFkt].Caption; b := ListViewKKFkt.Items.Item[iFkt].SubItems[0]; c := ListViewKKFkt.Items.Item[iFkt].SubItems[1]; while Length(a) < 5 do //Falls die ID weniger als 5 Stellen hat begin a := a + ' '; //Mit Leerstellen füllen end; while Length(b) < 10 do //Falls der Name weniger als 10 Stellen hat begin b := b + ' '; //Mit Leerstellen füllen end; while Length(c) < 3 do //Falls die Adresse weniger als 3 Stellen hat begin c := c + ' '; //Mit Leerstellen füllen end; WriteLn(tf, ' ' + a + ' ' + b + ' ' + c); end; Writeln(tf); Writeln(tf); Reset(tf); //Datei zum Lesen Öffnen AssignPrn(pt); //Drucker "Öffnen" Printer.Canvas.Font.Name := 'Courier New'; //Schriftart setzen Printer.Canvas.Font.Size := 10; //Schriftgrösse setzen ReWrite(pt); //Druckdatei zum Schreiben Öffnen while not EOF(tf) do //Falls Dateiende noch nicht erreicht begin ReadLn(tf, p); //Lies Zeile aus der Datei WriteLn(pt, p); //Schreib Zeile zum Drucker end; CloseFile(pt); //Schliesse Druckdatei CloseFile(tf); //Schliesse Datei end; Check; end; Grüsse, Daniel :hi: |
Hallo Daniel B,
sehr gut, genau das war ich gerade am suchen. Das sollte hier mal in die Code library gestellt werden! *@adminguck* Gruß Jan |
fehlpost! remove plz
|
THX an Daniel B. hat mir wirklich weiter geholfen. :idea: :D
Kann man beim formatieren auch farben von z.B. Linien ändern (ich meine nicht text) und wie kann man Linien machen? Keine ------ ! |
Zitat:
Grüsse, Daniel :hi: |
Hallo Jan,
Zitat:
Grüsse, Daniel :hi: |
Zitat:
Delphi-Quellcode:
Nur muss man dies halt immer bei jeder Zeilen die man Bunt und in Farbe haben möchte tun und anschliessend wieder auf Schwarz, damit der Text auch nicht Bunt erscheint.
Printer.Canvas.Font.Name := 'Courier New'; //Schriftart setzen
Printer.Canvas.Font.Size := 10; //Schriftgrösse setzen Printer.Canvas.Font.Color := clBlue; //Schriftfarbe setzen Grüsse, Daniel :hi: |
Irgendwie funzt das nicht.
hab ein paar farben genommen und immer wieder auf clblack umgestellt. nur die letzte zeile will ich grün drucken. jetzt ist der ganze text grün. :( |
Zitat:
Etwas hätte ich allerdings noch. Die Zeile mit Font.Color, wo hast Du die geschrieben? Doch nciht etwa hinter Font.Size usw.? War jetzt blöd von mir die genau dahinter zu schreiben. Die muss dort natürlich weg. Da wo es jetzt steht, bleibt es auf schwarz. Und vor den Zeilen die Du Bunt haben willst, musst Du nochmal diese ZEile schreiben, mit der anderen Farbe und direkt danach wieder zurück auf schwarz. Also im prinzip musst Du es vor Deiner letzten Zeile mal auf grün setzen und danach lassen oder vorsichtshalber wieder auf schwarz. Grüsse, Daniel :hi: //<-- Der jetzt weg muss. :cry: |
Doch hab ich, weil du die auch dahinter geschrieben hast. wo dann? :mrgreen:
|
Zitat:
Aber es muss auch dort bleiben. Also, da wo es jetzt ist, soll es mit schwarz bleiben. Da Du nur die letzte Zeile Bunt und in Farbe haben willst, musst man jetzt in der for-Schleife zwei ifs einbauen. Das sieht dann etwa so aus.
Delphi-Quellcode:
So, jetzt mal auf die schnelle und ungetestet. Dürfte aber gehen.
Printer.Canvas.Font.Color := clBlack;
for i := 0 to LV.Count -1 do begin if i <= LV.Count -2 then begin WriteLn(LV.Item[i]); end else begin Printer.Canvas.Font.Color := clGreen; //Hier also die Farbe für die letzte Zeile WriteLn(LV.Item[i]); //Letzte Zeile schreiben end; Printer.Canvas.Font.Color := clBlack; //Damit der Standard wieder da ist end; Also die drei Zeile lassen wie sie sind. Vor der letzten Zeile die Farbe umstellen und danach wieder zurück auf schwarz. Grüsse, Daniel :hi: |
Jo, nur das problem ist ich will mal am anfang oder mittendrin. zufällig halt. was der anwender eingibt. aus deinem qc lese ich dass nur die letzte zeile farbig wird. außerdem hatte ich am ende ein writeln außerhalb der schleife und erst nach der der schleife das clgreen. es war aber der gesammte text grün. auch die überschrift. :?:
Delphi-Quellcode:
[edit=Daniel B]Delphi-Tags gesetzt. Das nächste mal bitte [ delphi] anstatt [ code] benutzen. Danke. MfG Daniel B.[/edit]
var i: Integer;
p:string; s:string[40]; t:string[12]; r:string[13]; j,n:string[2]; g:string[10]; vorbereiten:textfile; PrintText: TextFile; begin with form1.listview1 do begin AssignFile(vorbereiten, 'druckfile.txt'); ReWrite(vorbereiten); WriteLn(vorbereiten); WriteLn(vorbereiten, ' Videoliste by TheReaper'); WriteLn(vorbereiten); WriteLn(vorbereiten, ' Titel Qualität Genre Nr. CDs Typ '); WriteLn(vorbereiten, ' ------------------------------------------------------------------------------------'); for i := 0 to ListView1.Items.Count -1 do begin s := ListView1.Items.Item[i].Caption; t := ListView1.Items.Item[i].SubItems[0]; r := ListView1.Items.Item[i].SubItems[1]; j := ListView1.Items.Item[i].SubItems[2]; n := ListView1.Items.Item[i].SubItems[3]; g := ListView1.Items.Item[i].SubItems[4]; while Length(s) < 40 do begin s := s + ' '; end; while Length(t) < 12 do begin t := t + ' '; end; while Length(r) < 13 do begin r := r + ' '; end; while Length(j) < 2 do begin j := j + ' '; end; while Length(n) < 2 do begin n := n + ' '; end; while Length(r) < 10 do begin g := g + ' '; end; WriteLn(vorbereiten, ' ' + s + ' ' + t + ' ' + r + ' ' + j + ' ' + n + ' ' + g); end; WriteLn(vorbereiten, ' ------------------------------------------------------------------------------------'); WriteLn(vorbereiten); Printer.Canvas.font.color:=clgreen; WriteLn(vorbereiten, ' Insgesammt '+inttostr(anzfilme)+' Filme auf '+inttostr(gesanzcd)+' CDs'); Reset(vorbereiten); AssignPrn(PrintText); Rewrite(PrintText); Printer.Canvas.Font.name := 'Courier New'; Printer.Canvas.Font.size := 10; while not EOF(vorbereiten) do begin ReadLn(vorbereiten, p); WriteLn(printtext, p); end; CloseFile(printtext); CloseFile(vorbereiten); end; end; |
Zitat:
Grüsse, Daniel :hi: |
Kann es sein dass man im "Textfile" nur eine farbe zuweisen kann und nicht mehrere? wäre ja möglich, weil ja auch größe und font an den drucker gesendet wird aber erst nachdem das textfile schon lange steht.
|
Zitat:
Delphi-Quellcode:
Grüsse, Daniel :hi:
procedure TForm1.Button1Click(Sender: TObject);
var tf: TextFile; begin AssignPrn(tf); ReWrite(tf); Printer.Canvas.Font.Color := clBlue; Printer.Canvas.Font.Size := 5; WriteLn(tf, 'Blau'); Printer.Canvas.Font.Color := clRed; Printer.Canvas.Font.Size := 10; WriteLn(tf, 'Rot'); Printer.Canvas.Font.Color := clGreen; Printer.Canvas.Font.Size := 15; WriteLn(tf, 'Gruen'); CloseFile(tf); end; |
die größe wird geändert aber trotzdem alles blau.
|
Bei mir kommt es Bunt, so wie ich es will und geschrieben habe!
Dann liegt es wohl an Deinem Rechner. Frag mich bitte nicht warum. :shock: Bei mir geht es ja. Grüsse, Daniel :hi: Nachtrag: Siehe Anhang, das ist der Beweis. ;) |
hmm. naja trotzdem danke. warst ne echte hilfe! THX! :tongue: :spin2:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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