24. april 2003 - 10:51
Der er
1 løsning
Richedit margen
Jeg er igang med at lave et skriveprogram i RichEdit og har fundet et udskrivnings kode her på eksperten. Den laver en venstre margen ved en udskrivning, men ikke nogen højre margen. Jeg har sat richedits align til AlClient og dette medfører at skriften overskrider papirets højre grænse. Min kode er:
procedure TForm1.MUdskrivClick(Sender: TObject); //udskrivning
var
I, XPixelsPrTomme, YPixelsPrTomme, Margen,
LinieHoejde, LinieTaeller: Integer;
begin
if PrintDialog.Execute then
begin
Richedit.WordWrap:=true;
Printer.Canvas.Font := Richedit.Font;
XPixelsPrTomme := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
Margen := XPixelsPrTomme; // - altså én tomme
YPixelsPrTomme := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
LinieHoejde := Round(Abs(Printer.Canvas.Font.Size) / 72 * YPixelsPrTomme * 1.40);
LinieTaeller := 3;
Printer.BeginDoc;
for I := 0 to Richedit.Lines.Count - 1 do
begin
Inc(LinieTaeller);
Printer.Canvas.TextOut(Margen, LinieTaeller * LinieHoejde, Richedit.Lines.Strings[I]);
end;
Printer.EndDoc;
end;
Takker på forhånd
24. april 2003 - 12:43
#1
Årsagen er ikke så meget richedits align AlClient.
Årsagen til at teksten overskrider højre margen er at du bruger Printer.Canvas.TextOut. Printeren vil simpelthen ignorere resten af linien hvis linien er længere end sidebredden.
Du er nødt til at dele hver linie op i et antal linier der hver især kan være på papiret.
Du kan bruge (Printer.PageWidth - Margen) for at se hvor meget plads der er på siden og Printer.Canvas.TextWidth(Richedit.Lines.Strings[I]) til at finde længden af linien på printeren. Så må du opdele linien nogle passende steder, f.eks. ved mellemrum mellem ord.
Et andet problem i øvrigt med din kode er at du heller ikke tager hensyn til om du når bunden af siden så hvis du overskrider siden ((LinieTaeller+1) * LinieHoejde > Printer.PageHeight) din tekst også ignoreret.
Så her kan du bruge noget i stil med dette:
Inc(LinieTaeller);
if ((LinieTaeller+1) * LinieHoejde > Printer.PageHeight) then
begin
Printer.NewPage;
LinieTaeller := 3;
end;
Printer.Canvas.TextOut(Margen, LinieTaeller * LinieHoejde, 'din tekst');