[Delphi] Drukowanie

0

witam może ktoś mi pomóc ?
mam problem z drukowaniem
mam form1 który przyjmuje 4 wielkości
dla 3 wielkości wszystko drukuje się ok
a dla jednej drukarka wyrzuca kartkę nie drukując nic

(podczas drukowania form jest automatycznie skalowany żeby zmieścić się na kartkę)

i mam pytanie co może być źle ? czy jak drukarka ma cos do nadrukowania na kawałku marginesu gdzie nie może drukować to się wtedy 'wywala' ?

na drukarkę rysuje taka funkcja

 procedure PrintBitmap(Bitmap: TBitmap;margines:Integer = 0);
  var
    Info: PBitmapInfo;
    InfoSize: DWORD;
    Image: Pointer;
    ImageSize: DWORD;
    X, Y: Integer;
    sA,sX,sY : Extended;
    Margin : TPoint;
  begin
    with Bitmap do
    begin
      GetDIBSizes(Handle, InfoSize, ImageSize);
      Info := AllocMem(InfoSize); {<-- MemAlloc dla D1}
      try
        Image := AllocMem(ImageSize); {<-- MemAlloc dla D1}
        try
          GetDIB(Handle, Palette, Info^, Image^);
          with Info^.bmiHeader do
          begin

            Margin.x :=GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
            Margin.y :=GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);


            sX := (Printer.PageWidth-2*(Margin.x+2+margines))/Width;
            sY := (Printer.PageHeight-2*(Margin.y+2+margines))/Height;
            if sX < sY then sA := sX else sA := sY;

            X := floor((Printer.PageWidth - sA*Width)/2); Y := floor((Printer.PageHeight - sA*Height)/2);

            StretchDIBits(Printer.Canvas.Handle, X, Y, floor(cA*Width),  //Width
              floor(cA*Height), 0, 0, biWidth, biHeight, Image, Info^,
              DIB_RGB_COLORS, SRCCOPY);


          end;
        finally
          FreeMem(Image, ImageSize);
        end;
      finally
        FreeMem(Info, InfoSize);
      end;
    end;
  end;
0

A nie lepiej użyć Printer i Canvas??? Wygląda to np. tak

Printer.Orientation:= poLandscape;
Printer.BeginDoc;
Printer.Canvas.TextOut(10, 10, 'Twój tekst');
Printer.EndDoc;

Oczywiście to jest przykład.. można za jej pomocą wydrukować od Bitmapy po Jpg.. Metafile też wydrukujesz

Wszyskie operację na drukarce metodą Canvas wykonujesz tak samo jak na innych komponentach..

AHA aby skorzystać z modułu Printers umieść jego nazwę w sekcji USES

To chyba wszystko.. Mam nadzieję, że o niczym nie zapomiałem ;).. ten sposób oczywiście ma swoje wady... aby wydrukować bitmapę lub jpeg trzeba go rozszeżyć... można to zrobić za pomocą RECT z Metafile jest już prościej... oto kod:

Procedure Drukuj_Metafile(Pozycja_LEFT, Pozycja_TOP: integer; Rozciagniencie, Margines: Boolean; Obrazek: TMetafile);
begin
  if Rozciagniencie = True then
  begin
    Obrazek.Height:= Printer.PageHeight - Pozycja_LEFT;
    Obrazek.Width:= Printer.PageWidth - Pozycja_TOP;
    if Margines = True then
     begin
      Obrazek.Height:= Printer.PageHeight - (2*Pozycja_LEFT);
      Obrazek.Width:= Printer.PageWidth - (2*Pozycja_LEFT);
    end;
  end;
  Printer.Canvas.Draw(Pozycja_LEFT,Pozycja_TOP, Obrazek);
end;

W wydruku możesz używać rozciągnięcia i marginesu...

0
PoP_Gniezno napisał(a)

A nie lepiej użyć Printer i Canvas???

a czego on używa wg ciebie??

a do pytacza - może podasz te rozmiary formy :>

0

WIEM ŻE UŻYWA PRINTER I CANVAS-a

CHODZIŁO MI O UŻYWANIE C Z Y S T E G O CANVAS-a jeśli wiesz co mam na myśli...

0
PoP_Gniezno napisał(a)

WIEM ŻE UŻYWA PRINTER I CANVAS-a

CHODZIŁO MI O UŻYWANIE C Z Y S T E G O CANVAS-a jeśli wiesz co mam na myśli...

to jak wg ciebie ma na tym "czystym" canvasie formę wyrysować??

Zastanów się zanim coś napiszesz ...

0

CHODZI MI O TO ŻE BEZ WSKAŹNIKÓW I UCHWYTÓW TO SAMO DA SIĘ ZROBIĆ TYLK OWO WIELE PROŚCIEJ.. CAŁEGO KODU NIE ZROBIE BO W TEJ CHWILI JEST MI POTRZEBNY.. ale da się to zrobić o wiele prościej...

0

da się, ale nie to jest pytaniem

BTW przestań SIĘ WYDZIERAĆ WRESZCIE

1 użytkowników online, w tym zalogowanych: 0, gości: 1