Der er flere metoder, ingen af den er lige til at gå til. Der står lidt i hjælpen om det. Enten skal du åbne en kanal til printeren, og så sende tekstlinierne ud en ad gangen, og så slutte med at lukke kanalen.
procedure TForm62.UdskrivClick(Sender: TObject); var X: LongInt; Pr : Textfile; begin { Udskriv indholdet af notat filen } if ListBox1.Items.Count > 0 then begin if PrintDialog1.Execute then begin AssignPrn(Pr); Rewrite(Pr); Writeln(Pr, ' Udskrift af notat filen'); Writeln(Pr, ''); for X := 1 to ListBox1.Items.Count do Writeln(Pr, ListBox1.Items[X - 1]); System.Close(Pr); end; end; end;
Du kan også bruge kombinationen BeginDoc, printe en hel masse og så slutte med, EndDoc. Den første er nemmest hvis det er en masse linier der skal printes ud, det virker ligesom en gammeldags linie skriver. den anden har den fordel at du kan bestemme hvor på papiret alt skal stå, nærmest som en slags print at. Hvis du skal have yderligere hjælp til den sidste så skal du bare sige til, men den fylder flere sider.
Jeg bryggede dette sammen i et andet Ekspert spørgsmål:
procedure TfrmMain.Button2Click(Sender: TObject); var st : string; Row, i : integer; RowHeight : integer; WorkWidth, WorkHeight : integer; XPixelsPrTomme, YPixelsPrTomme : integer; TopMarginStart, LeftMarginStart : integer; begin st := trim(Edit1.Lines.Text); // Måske skal man løbe strengen igennem og fjerne CrLf's
with Printer do begin BeginDoc; try // Sæt fonten på printerens canvas Canvas.Font.Size := 100; // Lidt en massiv størrelse Canvas.Font.Name := 'Balloon Lt BT'; // Lidt en underlig font
// Find ud af printerens opløsning XPixelsPrTomme := GetDeviceCaps(Printer.Handle, LOGPIXELSX); YPixelsPrTomme := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
// Bestem liniehøjde i pixels RowHeight := Canvas.TextHeight('X') + 2;
// Bestem udskriftsområde hvori der skal udskrives. Jeg har en record, fMargins, // der indeholder oplysninger om marginer - i pixels WorkWidth := trunc(PageWidth - (fMargins.Left + fMargins.Right) * XPixelsPrTomme); WorkHeight := trunc(PageHeight - (fMargins.Top + fMargins.Bottom) * YPixelsPrTomme);
// Start udskrift Row := TopMarginStart; while st <> '' do begin i := trunc(length(st) * (WorkWidth / Canvas.TextWidth(st))); if i > 0 then begin Canvas.TextOut(LeftMarginStart,Row,copy(st,1,i)); delete(st,1,i); end;
inc(Row,RowHeight); if Row > WorkHeight then begin NewPage; Row := TopMarginStart; end; // if end; // while finally EndDoc; end; // try end; // with end;
procedure TForm1.Lprint(X, Y: Real; Txt: String); var // Print X mm hen og Y mm ned. Tx, Ty: LongInt; // Tx pixels hen og Ty pixels ned. begin Tx := Round((X * GetDeviceCaps(Printer.Handle, Logpixelsx)) * 10 / 254); Ty := Round((Y * GetDeviceCaps(Printer.Handle, Logpixelsy)) * 10 / 254); Printer.Canvas.TextOut(Tx, Ty, Txt); end;
Jeg har brugt en TListBox, men det er næsten det samme som en TMemo Jeg har omdøbt ListBox'en til Musik.
Printer.BeginDoc; Printer.Canvas.Font := Musik.Font; Linie := 140; // Musik ønskerne skrives 140 mm nede på siden. LinieHojde := 8; if Musik.Items.Count > 3 then // Er der mange musik ønsker? begin // Så skal der bruges mindre bogstaver. LinieHojde := 24 div Musik.Items.Count; Printer.Canvas.Font.Size := 30 div Musik.Items.Count; end; for X := 0 to Musik.Items.Count - 1 do begin ---> LPrint(16, Linie, Copy(Musik.Items[X], 0, 81)); // 16 mm hen og Linie mm ned. Linie := Linie + LinieHojde; end; Printer.EndDoc;
Tjaa, godt spørgsmål Anton (alle de 15 points står bare og venter ...).
I øvrigt bør du flytte "GetDeviceCaps(Printer.Handle, Logpixelsx og y)) * 10 / 254"-beregningen væk fra LPrint. Det er spild af gode CPU-cycles at beregne hver gang der skrives en linie.
I øvrigt kan du bruge muldiv til at gøre det med. Funktionen har den fordel, at selvom du laver muldiv(maxint, maxint, maxint) så resulterer multiplikationen af de to første maxint' ikke i en overflow-exception selvom tallet er større end en integer kan rumme:
Hej hrc Du kan have ret i at programmet ville optimeres hastighedsmæssig hvis GetDeviceCaps... blev udført en gang for alle, men så skulle den være lige efter 'if Printer.Execute then' for at passe til den valgte printer. Det program jeg har plukket eksemplet fra har jeg mange forskellige forms hvorfra der er printer options, så for ikke at glemme at få det med alle steder, er det pakket ind i LPrint routinen. MulDiv functionen kendte jeg ikke, den skal jeg lege lidt med, hvis den ellers kan tage Real tal, ellers kan man ikke printe 6,25 mm nede på siden.
Ikke fordi at jeg skal bestemme, men af principielle grunde synes jeg det er på tide at du lukker spørgsmålet.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.