Delphi - grafika nie jest drukowana

0

Próbuję użyć obiektu Printer klasy TPrinter z modułu Printers do drukowania grafiki. W skrócie wygląda to tak:

...........
with Printer do
begin
BeginDoc;
Canvas.Draw(0,0,Image1.Picture.Bitmap);
EndDoc;
..............

I niestety - pusta strona. Nic nie pomaga zmiana na Image1.Picture.Graphic, uzycie zamiast Draw CopyRect oraz wykorzystanie dodatkowego bufora typu TBitmap.
Mało tego! Nie dają efektu również procedury rysujące bezpośrednio na Printer.Canvas. Co dziwniejsze procedura Canvas.OutText jednak działa bez zarzutu i drukowanie bitmap wczytanych z plików również! Nie są drukowane tylko elementy rysowane w programie lub skopiowane z innych obiektów, gdzie również były rysowane w programie a nie wczytane z plików. Wydaje mi się, że zapisanie do pliku, odczytanie i kopiowanie dopiero wówczas, to nie jest najlepsza metoda. Może więc ktoś zna przyczynę tych niepowodzeń? Delphi 5.0 pod Windows XP.

0

This example uses a button and a memo on a form. When the user clicks the button, the content of the memo is printed with a 200-pixel border around the page.

To run this example successfully, add Printers to your uses clause.

procedure TForm1.Button1Click(Sender: TObject);
var
  r: TRect;
  i: Integer;
begin
  with Printer do
    begin
      r := Rect(200,200,(Pagewidth - 200),(PageHeight - 200));
      BeginDoc;
      Canvas.Brush.Style := bsClear;
      for i := 0 to Memo1.Lines.Count do
       Canvas.TextOut(200,200 + (i *
                   Canvas.TextHeight(Memo1.Lines.Strings[i])),
                   Memo1.Lines.Strings[i]);

      Canvas.Brush.Color := clBlack;
      Canvas.FrameRect(r);
      EndDoc;
    end;
end;

Oczywiscie z HELPA (magiczne F1)

0

Świetnie, ale właśnie drukowanie tekstu tworzonrgo procedura Printer.Canvas.OutText, jak pisałem, działa bez zarzutu. Problem dotyczy tylko grafiki i to jeszcze tworzonej w trakcie pracy programu bezpośrednio na płótnie drukarki (Printer.Canvas) lub skopiowanej przez Canvas.Draw lub Canvas.CopyRect i tym podobne z innych komponentów, gdzie grafika była też rysowana w trakcie pracy programu procedurami Canvas.RysujCosTam. Grafika wczytana z plików po skopiowaniu jest drukowana.

0

bo źródłem nie powinien być Canvas, tylko Bitmap - z Canvasa narysowane piksele giną bardzo łatwo i szybko.

0

Tylko jak narysować coś na Bitmap albo przynajmniej skopiować z innego obrazu, a nie wczytywać z pliku?

0
var 
  Bitmap:TBitamp;
begin
  Bitmap:=TBitamp.Create;
  Bitmap.Width:= 100;
  Bitmap.Height:=100;
  Bitmap.Canvas.TextOut( 10, 10, 'Działa jak trza.' );
0

Dzięki! Poszło, aż miło! Moje, być może naiwne, pytanie wzięło się stąd, że w książce (Andrzej Pasławski - Programowanie w Delphi) wyczytałem iż TImage.Picture.Bitmap.Canvas, to ta sama właściwość, co TImage.Canvas. Okazuje się, że jednak nie, ale wystarczyło przypisać:

var
R:TRect;

a potem w procedurze:

R:=Rect(0,0,Image1.ClientWidth,Image1.ClientHeight);
Image1.Picture.Bitmap.Canvas.CopyRect(r,Image1.Canvas,r);
Printer.Canvas.Daraw(0,0,Image1.Picture.Bitmap);

i wszystko dzial jak należy!

Jeszcze raz dzięki.

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