Avatar billede 01-gjk Nybegynder
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
Avatar billede tolderlund Nybegynder
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');
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