Подскажите как в Delphi можно распечатать содержимое формы, но не в виде картинки, а чтобы Labels печатал в виде текста, отображал полоски в виде прямых линий и остальные компоненты, я нигде не нашла как это сделать, выходит вывести на печать только StringGrid, Memo в текстовом и табличном формате, а Labels и остальные компоненты не выходят на печать :( Подскажите, как.
17 лет Pilum при Form1.print форма выходит на печать в виде фотографии в пикселях.
Нужно, чтобы он перебрал все объекты на форме распознал их и каждый распечатал.
Я сделала так, но у меня выходит на печать только StringGrid.
function ScaleToPrinter(RR: TRect): TRect;
begin
RR.Top:=(RR.Top+Form.VertScrollBar.Position)*ScaleY;
RR.Left:=(RR.Left+Form.HorzScrollBar.Position)*ScaleX;
RR.Bottom:=(RR.Bottom+Form.VertScrollBar.Position)*ScaleY;
RR.Right:=(RR.Right+Form.HorzScrollBar.Position)*ScaleY;
Result:=RR;
end;
procedure PrintMComponent(MC: TMemo);
var C: array[0..255] of char; CLen: integer; Format: Word; RR: TRect;
begin
Printer.Canvas.Font:=MC.Font;
DC := Printer.Canvas.Handle; {??? DrawText ????? ? ??????}
RR:=ScaleToPrinter(MC.BoundsRect);
if (not (Form.Components is TCustomLabel)) and (MC.BorderStyle = bsSingle) then Printer.Canvas.Rectangle(RR.Left, RR.Top, RR.Right, RR.Bottom);
Format:=DT_LEFT;
if (Form.Components is TEdit) or (Form.Components is TCustomMaskEdit) then
Format:=Format or DT_SINGLELINE or DT_VCENTER
else
begin
if MC.WordWrap then Format:=DT_WORDBREAK;
if MC.Alignment=taCenter then Format:=Format or DT_CENTER;
if MC.Alignment=taRightJustify then Format:=Format or DT_RIGHT;
RR.Bottom:=RR.Bottom+Printer.Canvas.Font.Height;
end;
CLen:=MC.GetTextBuf(C, 255);
RR.Left:=RR.Left+ScaleX+ScaleX;
WinProcs.DrawText(DC,C,CLen,RR,Format);
inc(Count);
end;
procedure PrintShape(SC: TShape);
var H,W,S: integer; RR: TRect;
begin {PrintShape}
Printer.Canvas.Pen:=SC.Pen;
Printer.Canvas.Pen.Width:=Printer.Canvas.Pen.Width*ScaleX;
Printer.Canvas.Brush:=SC.Brush;
RR:=ScaleToPrinter(SC.BoundsRect);
W:=RR.Right-RR.Left; H:=RR.Bottom-RR.Top;
if W<H then
S:=W
else
S:=H;
if SC.Shape in [stSquare, stRoundSquare, stCircle] then
begin
Inc(RR.Left,(W-S) div 2);
Inc(RR.Top,(H-S) div 2);
W:=S;
H:=S;
end;
case SC.Shape of
stRectangle, stSquare:
Printer.Canvas.Rectangle(RR.Left,RR.Top,RR.Left+W,RR.Top+H);
stRoundRect, stRoundSquare:
Printer.Canvas.RoundRect(RR.Left,RR.Top,RR.Left+W,RR.Top+H,S div 4,S div 4);
stCircle, stEllipse:
Printer.Canvas.Ellipse(RR.Left,RR.Top,RR.Left+W,RR.Top+H);
end;
Printer.Canvas.Pen.Width:=ScaleX;
Printer.Canvas.Brush.Style:=bsClear;
inc(Count);
end; {PrintShape}
procedure PrintSGrid(SGC: TStringGrid);
var j,K: integer; Q,RR: TRect; Format: Word; C: array[0..255] of char; CLen: integer;
begin
Printer.Canvas.Font:=SGC.Font;
DC:=Printer.Canvas.Handle; {DrawText}
Format:=DT_SINGLELINE or DT_VCENTER;
Q:=SGC.BoundsRect;
Printer.Canvas.Pen.Width:=SGC.GridLineWidth*ScaleX;
for j:=0 to SGC.ColCount-1 do
for K:=0 to SGC.RowCount-1 do
begin
RR:=SGC.CellRect(J,K);
if RR.Right>RR.Left then
begin
RR.Left:=RR.Left+Q.Left;
RR.Right:=RR.Right+Q.Left+SGC.GridLineWidth;
RR.Top:=RR.Top+Q.Top;
RR.Bottom:=RR.Bottom+Q.Top+SGC.GridLineWidth;
RR:=ScaleToPrinter(RR);
if (J<SGC.FixedCols) or (K<SGC.FixedRows) then
Printer.Canvas.Brush.Color:=SGC.FixedColor
else
Printer.Canvas.Brush.Style:=bsClear;
if SGC.GridLineWidth>0 then
Printer.Canvas.Rectangle(RR.Left,RR.Top,RR.Right,RR.Bottom);
StrPCopy(C,SGC.Cells[J,K]);
RR.Left:=RR.Left+ScaleX+ScaleX;
WinProcs.DrawText(DC,C,StrLen(C),RR,Format);
end;
end;
Printer.Canvas.Pen.Width:=ScaleX;
inc(Count);
end;
function PrintForm(AForm: TForm; ATag: Longint): integer;
begin {PrintForm}
Count:=0;
Form:=AForm;
Printer.BeginDoc;
try
DC:=Printer.Canvas.Handle;
ScaleX:=WinProcs.GetDeviceCaps(DC,LOGPIXELSX) div Form.PixelsPerInch;
ScaleY:=WinProcs.GetDeviceCaps(DC,LOGPIXELSY) div Form.PixelsPerInch;
for i:=0 to Form.ComponentCount - 1 do
if TControl(Form.Components).Visible then
if (ATag = 0) or (TControl(Form.Components).Tag and ATag = ATag) then
begin
if (Form.Components is TCustomLabel) or (Form.Components is TCustomEdit) then
PrintMComponent(TMemo(Form.Components));
if (Form.Components is TShape) then
PrintShape(TShape(Form.Components));
if (Form.Components is TStringGrid) then
PrintSGrid(TStringGrid(Form.Components));
end;
finally
Printer.EndDoc;
Result:=Count;
end;
end; {PrintForm}