Avatar billede anold Nybegynder
21. februar 2000 - 13:23 Der er 11 kommentarer og
1 løsning

Fejl i udskrivning af grafik

Er der en som kan vise mig, hvad der er
galt med denne procedure, for når jeg printer ud på forskellige printer så
bliver billedet ikke lige stort.

procedure TForm2.Button1Click(Sender: TObject);
var
Prnrect,imgrect: trect;
Centerx,centery,x1,y1,x2,y2,sdiv : integer;
pheight,pwidth : integer;
Begin
PrinterSetupDialog1.Execute;
Screen.Cursor := crHourGlass;
Panel1.Caption := ' Vent  Udskriver til printer ';
printer.begindoc;
pheight :=1435;
pwidth :=1435;
centerx := pwidth div 2;
centery := pheight div 2;
sdiv := 1;
x1 := centerx -(pwidth div (sdiv*2));
y1 := centery -(pheight div (sdiv*2));
x2 := centerx +(pwidth div (sdiv*2));
y2 := centery +(pheight div (sdiv*2));
prnrect := rect(x1,y1,x2,y2);
imgrect := rect(0,0,shape1.width,shape1.height);
printer.canvas.copyrect(prnrect,form2.canvas,imgrect);
printer.enddoc;
Screen.Cursor := crDefault;
Panel1.Caption := 'Udskrivning til printer er færdig ';
end;
Avatar billede blackthorne Nybegynder
21. februar 2000 - 13:32 #1
det kommer an på hvilken opløsning du printer ud i f.eks. hvis et billed er 300 x 300 pixel og printes ud i en opløsning på 300 x 300 dpi så er billedet kun 1 tomme stor, printes der i 600 x 600 dpi er den en ½ tomme. Du skal derfor kende udskrifts opløsningen og benytte strechcopy i stedet for copyrect så du kan skalér til den korrekt opløsning
Avatar billede blackthorne Nybegynder
21. februar 2000 - 13:32 #2
Grunden til printes er forskelligt er formentlig fordi printer er sat til forskellig opløsning
Avatar billede anold Nybegynder
21. februar 2000 - 13:40 #3
Hej blackthorne
Det lyder meget fornuftigt.
kunne du ikke vise mig, hvad der skal laves om i min procedure ?
Avatar billede blackthorne Nybegynder
21. februar 2000 - 13:52 #4
jeg kan ikke vise dig hvordan, da jeg sidder og arbejder. Men en nemere løsning er at benytte quickreport istedet for. det kan sagten benyttes uden at der benyttes en database.

Du kan læse hvormange pixel en page er på med printer.pageheight og pagewidth. Når du kender disse tal kan du gange det med en factor, som du kan skalere med så det passer til den ønskede størrelse.

desuden er det strechdraw istedet for strechcopy
Avatar billede michael2001 Nybegynder
23. februar 2000 - 21:01 #5
Problemet er at du bruger konstanter til pheight og pwidth. Der findes en funktion er returnerer værdierne fra printeren istedet.
Prøv at lege lidt med GetDeviceCaps()
og Printer.PageHeight

Bare for at være nysgerrig : Hvad gør din funktion hvis du skriver ud over den første side???

Jeg havde forventet at se et : Printer.NewPage et eller andet sted, men det er nok bare mig :-)
Avatar billede michael2001 Nybegynder
23. februar 2000 - 21:03 #6
PS : Hvis du får lavet din funktion rigtigt generel, kan du bruge den til også at lave et print preview (så skriver du bare til et TImage istedet.

Happy Coding
Avatar billede pellelil Nybegynder
24. februar 2000 - 16:17 #7
Jeg gætter på at du (efter at du har "valgt printer") skal have flg. 2 linier:

GetPrinter(Device, Name, Port, DevMode);
SetPrinter(Device, Name, Port, 0);

Disse sikre at PRINTER bliver initializeret med de "egenskaber" som din printer har (eksempelvis opløsning).
Avatar billede anold Nybegynder
25. februar 2000 - 07:52 #8
Ok pellelil

Men kunne du ikke lave et eks. der virker
Avatar billede anold Nybegynder
28. februar 2000 - 09:17 #9
Jeg har prøvet at lave et nyt program til
styring af grafik udskrift her har jeg mulighed
for at styre bredden på udskriftet.

Men når jeg printer, så kommer der ikke
noget billede ud, kun den tynde ramme der viser billedes størelse.

Er der en som kan se hvad det er jeg gør korkert




procedure TPrintBitmapForm.UdPrint(BilledBredde: Real;
                                  Image: TImage);
const
  CmPrTomme = 2.54;
var
  XPixelsPrTomme, YPixelsPrTomme: Integer;
  Forhold: Real;
  R: TRect;
begin
  if PrintDialog.Execute then
  begin
    Forhold := imgBitmap.Picture.Height / imgBitmap.Picture.Width;
    XPixelsPrTomme := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    YPixelsPrTomme := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
    R.Left := Round((Printer.PageWidth -
      BilledBredde / CmPrTomme * XPixelsPrTomme) / 2);
    R.Top := YPixelsPrTomme;
    R.Right := R.Left +
      Round(BilledBredde / CmPrTomme * XPixelsPrTomme);
    R.Bottom := R.Top +
      Round(BilledBredde * Forhold / CmPrTomme * YPixelsPrTomme);
    with Printer do
    begin
      BeginDoc;
      Canvas.StretchDraw(R, imgBitmap.Picture.Graphic);
      Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom);
      EndDoc;
    end;
  end;
end;
Avatar billede anold Nybegynder
28. februar 2000 - 09:18 #10
korkert !!! ja det danske sprog er en svær en (Forkert)
Hilsen Anold
Avatar billede anold Nybegynder
28. februar 2000 - 09:22 #11
Hej folket

Brug ikke mere tid på mit spørgsmål da jeg selv har fundet løsningen
Hilsen Anold
Avatar billede kratluskeren Nybegynder
05. maj 2002 - 13:01 #12
Hey Arnold, kan du ikke lige dele din viden med mig. har samme problem med udskrift af billeder. Får kun udskrevet den tynde ramme (Canvas.Rectangle(R.Left, R.Top, R.Right, R.Bottom); Hvad gør jeg.
Har nogle point du kan få, men er ny her og ved ikke helt hvordan jeg giver dig dem :-)
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