Avatar billede zastrow Nybegynder
22. august 2004 - 18:56 Der er 8 kommentarer

print memo1

hvordan får jeg min print funktion til KUN at printe min text ud?
22. august 2004 - 20:16 #1
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.
Avatar billede hrc Mester
12. september 2004 - 00:46 #2
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);

      TopMarginStart := trunc(fMargins.Top * XPixelsPrTomme);
      LeftMarginStart := trunc(fMargins.Left * 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;
12. september 2004 - 14:40 #3
Lav en procedure der f.eks. hedder LPrint.

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;
04. oktober 2004 - 23:07 #4
Hvem fik point ?
Avatar billede hrc Mester
05. oktober 2004 - 08:37 #5
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:

PixelsPrMM := MulDiv(GetDeviceCaps(Printer.Handle, Logpixelsx)),10,254);
05. oktober 2004 - 19:17 #6
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.
Avatar billede hrc Mester
06. oktober 2004 - 12:27 #7
Desværre er muldiv en heltals tingest.
14. februar 2005 - 21:07 #8
Ikke fordi at jeg skal bestemme, men af principielle grunde synes jeg det er på tide at du lukker spørgsmålet.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester