Drukowanie StringGrid za pomocą PrinterSetupDialog

0

Witajcie. Koniecznie chcę zrobić w Delphi7 drukowanie StringGrida za pomocą komponentu PrinterSetupDialog1. Niby już kod poniżej działa, większość ustawień drukarki funkcjonuje prawidłowo (co prawda nie drukuje jeszcze "Kratek" tabeli StringGrida i mam problem z funkcją dopasowania wielkości do strony), ale co ważniejsze nie mogę dojść dlaczego nie drukuje mi się pierwsza kolumna StringGrid (z lewej strony). Może ktoś dopatrzy się gdzie jest błąd bo ja trzeci dzień nad tym siedzę i nie mogę dojść... Pozdrawiam.

kod:

Procedure TForm1.Drukuj1Click(Sender: TObject);

Var
  X1, X2, Y1, Y2: Integer;
  XRes, YRes : Integer;
  I, F: Integer;
  TR: TRect;

Begin
  If PrinterSetupDialog1.Execute then
     begin
      Printer.Title := 'Wydruk';
      Printer.BeginDoc;
      Printer.Canvas.Pen.Color  := 0;
      Printer.Canvas.Font.Name  := 'ArialCE';
      Printer.Canvas.Font.Size  := 10;
      Printer.Canvas.Font.Style := [fsBold, fsUnderline];
      Printer.Canvas.TextOut(150, 250,'Wydruk');

      for F := 0 to StringGrid1.ColCount - 1 do
        begin
         X1 := 0;
         for I := 1 to (F - 1) do
         X1 := X1 + 5 * (StringGrid1.ColWidths[I]);
         Y1 := 300;
         X2 := 0;
         for I := 1 to F do
         X2 := X2 + 5 * (StringGrid1.ColWidths[I]);
         Y2 := 450;
         TR := Rect(X1, Y1, X2 - 30, Y2);
         Printer.Canvas.Font.Assign(StringGrid1.Font);
         Printer.Canvas.TextRect(TR, tr.right, 350, StringGrid1.Cells[F, 0]);
             for I := 1 to StringGrid1.RowCount - 1 do
               begin
                Y1 := 150 * I + 300;
                Y2 := 150 * (I + 1) + 300;
                TR := Rect(X1, Y1, X2 - 30, Y2);
                SetTextAlign(Printer.Canvas.Handle, TA_RIGHT);
                Printer.Canvas.TextRect(TR, tr.Right-2, tr.Top+2, StringGrid1.Cells[F, I]);
             end;
        XRes := GetDeviceCaps(Printer.Canvas.Handle, HORZRES);
        YRes := GetDeviceCaps(Printer.Canvas.Handle, VERTRES);
      end;
  Printer.EndDoc;
  end;
End;
2

Masz skopane wyliczanie współrzędnych, sprawdź sobie pod debuggerem że już dla pierwszej kolumny pojawiają się ujemne wartości w zmiennej TR

0

@zebmcs: jeśli już działa jak trzeba :) to wklej działający kod, może przyda się komuś

0

Już wstawiam kod, który zadziałał, chociaż nadal pracuję nad kilkoma rzeczami. Między innymi nad odpowiednim DPI przy wydruku, kolejną stroną w razie braku możliwości wydruku na jednej stronie, wydruku siatki StringGrida oraz auto-skalowaniu tabeli StringGrida do formatu strony A4.

kod:

procedure TForm1.Drukuj1Click(Sender: TObject);

var
  X1, X2, Y1, Y2: Integer;
  I, F: Integer;
  TR: TRect;

begin
 if PrinterSetupDialog1.Execute then
  begin
   Printer.Title := 'Wydruk1';
   Printer.BeginDoc;
   Printer.Canvas.Font.Name  := 'ArialCE';
   Printer.Canvas.Font.Size  := 10;
   Printer.Canvas.Font.Style := [fsBold, fsUnderline];
   Printer.Canvas.Pen.Color  := clBlack;
    
    for F := 0 to StringGrid1.ColCount +1 do
     begin
      X1 := 0;
       for I := 1 to (F - 0) do
        X1 := X1 + 3 * (StringGrid1.ColWidths[I]);
        Y1 := 300;
        X2 := 0;
         for I := 0 to F do
          X2 := X2 + 3 * (StringGrid1.ColWidths[I]);
          Y2 := 450;
          TR := Rect(X1, Y1, X2 - 15, Y2);
          Printer.Canvas.Font.Assign(StringGrid1.Font);
          Printer.Canvas.TextRect(TR, tr.right, 350, StringGrid1.Cells[F, 0]);
           for I := 0 to StringGrid1.RowCount - 1 do
            begin
             Y1 := 150 * I + 300;
             Y2 := 150 * (I + 1) + 300;
             TR := Rect(X1, Y1, X2 - 15, Y2);
             SetTextAlign(Printer.Canvas.Handle, TA_RIGHT);
             Printer.Canvas.TextRect(TR, tr.Right-2, tr.Top+2, StringGrid1.Cells[F, I]);
            end;
     end;

    Printer.EndDoc;
  end;
end;
1

Jeżeli komuś będzie potrzebne więcej opcji niż jest w standardowym StrinGrid to polecam taki darmowy komponent jak KControls (odmiana StringGrida - z bardzo dużą ilością dodatkowych opcji, w tym nawet podgląd wydruku StringGrida).
Dodaję jako załącznik ten komponent, więcej informacji o nim jest tutaj: http://www.tkweb.eu/en/delphicomp/
Drukowanie KGrid1 za pomocą KPrintSetupDialog1 (tak właśnie nazywa się tutaj StringGrid1 i PrinterSetupDialog1) jest na prawdę banalnie proste. W paczce są przykłady użycia komponentu. Jeśli ktoś chciałby mieć spolszczoną wersję ustawień drukarki (KPrintSetupDialog1) oraz podglądu wydruku (KPrintPreviewDialog1) to należy wejść w katalog "source" i odpowiednio w plikach kprintsetup.dfm oraz kprintpreview.dfm zamienić nazwy z angielskich na polskie.

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