Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 23.02.2007, 00:47   #1
Dimon
Фрилансер
Пользователь
 
Аватар для Dimon
 
Регистрация: 12.01.2007
Сообщений: 15
По умолчанию предпросмотр при распечатке страниц

Здравствуйте, у меня проблемка.. подскажите пожалуйста кто знает, как организовать предпросмотр при распечатке страниц... ну смысле как сделать, чтобы посмотреть заранее, что будет напечатано на листе (листах)?
И кстати как организовать этот печатаемый лист... в смысле как можно расположить на нём в нужном формате текст, рисунки и т.п.?
Какие компоненты Delphi надо при этом использовать и желательно вкратце как с ними работать?
Буду очень благодарен за помощь, надо очень срочно... всем кто откликнется спасибо.

Последний раз редактировалось Dimon; 23.02.2007 в 00:53.
Dimon вне форума
Старый 23.02.2007, 10:42   #2
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Вот попробуй. Это только пример реализующий, если не ошибаюсь
предпросмотр исходного кода этого модуля.
Код:
unit printpreview; 
interface 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, ExtCtrls, ComCtrls; 
type 
  TForm1 = class(TForm) 
    Panel1: TPanel; 
    Panel2: TPanel; 
    PreviewPaintbox: TPaintBox; 
    Label1: TLabel; 
    Label2: TLabel; 
    LeftMarginEdit: TEdit; 
    TopMarginEdit: TEdit; 
    Label3: TLabel; 
    Label4: TLabel; 
    RightMarginEdit: TEdit; 
    Label5: TLabel; 
    BottomMarginEdit: TEdit; 
    ApplyMarginsButton: TButton; 
    OrientationRGroup: TRadioGroup; 
    Label6: TLabel; 
    ZoomEdit: TEdit; 
    ZoomUpDown: TUpDown; 
    procedure LeftMarginEditKeyPress(Sender: TObject; var Key: Char); 
    procedure FormCreate(Sender: TObject); 
    procedure PreviewPaintboxPaint(Sender: TObject); 
    procedure ApplyMarginsButtonClick(Sender: TObject); 
  private 
    { Private declarations } 
    PreviewText: string; 
  public 
    { Public declarations } 
  end; 
var 
  Form1: TForm1; 
implementation 
uses printers; 
{$R *.DFM} 
procedure TForm1.LeftMarginEditKeyPress(Sender: TObject; var Key: Char); 
begin 
  if not (Key in ['0'..'9', #9, DecimalSeparator]) then 
    Key := #0; 
end; 
procedure TForm1.FormCreate(Sender: TObject); 
var 
  S: string; 
  procedure loadpreviewtext; 
  var 
    sl: TStringList; 
  begin 
    sl := TStringList.Create; 
    try 
      sl.Loadfromfile(Extractfilepath(application.exename) + 'printpreview.pas'); 
      PreviewText := sl.Text; 
    finally 
      sl.free 
    end; 
  end; 
begin 
  {Initialize the margin edits with a margin of 0.75 inch} 
  S := FormatFloat('0.00', 0.75); 
  LeftMarginEdit.Text := S; 
  TopMarginEdit.Text := S; 
  RightMarginEdit.Text := S; 
  BottomMarginEdit.Text := S; 
  {Initialize the orientation radio group} 
  if Printer.Orientation = poPortrait then 
    OrientationRGroup.ItemIndex := 0 
  else 
    OrientationRGroup.ItemIndex := 1; 
  {load test text for display} 
  LoadPreviewtext; 
end; 
procedure TForm1.PreviewPaintboxPaint(Sender: TObject); 
var 
  pagewidth, pageheight: Double; {printer page dimension in inch} 
  printerResX, printerResY: Integer; {printer resolution in dots/inch} 
  minmarginX, minmarginY: Double; {nonprintable margin in inch} 
  outputarea: TRect; {print area in 1/1000 inches} 
  scale: Double; {conversion factor, pixels per 1/1000 inch} 
  procedure InitPrintSettings; 
    function GetMargin(S: string; inX: Boolean): Double; 
    begin 
      Result := StrToFloat(S); 
      if InX then 
      begin 
        if Result < minmarginX then 
          Result := minmarginX; 
      end 
      else 
      begin 
        if Result < minmarginY then 
          Result := minmarginY; 
      end; 
    end; 
  begin 
    printerResX := GetDeviceCaps(printer.handle, LOGPIXELSX); 
    printerResY := GetDeviceCaps(printer.handle, LOGPIXELSY); 
    pagewidth := GetDeviceCaps(printer.handle, PHYSICALWIDTH) / printerResX; 
    pageheight := GetDeviceCaps(printer.handle, PHYSICALHEIGHT) / printerResY; 
    minmarginX := GetDeviceCaps(printer.handle, PHYSICALOFFSETX) / printerResX; 
    minmarginY := GetDeviceCaps(printer.handle, PHYSICALOFFSETY) / printerResY; 
    outputarea.Left := Round(GetMargin(LeftMarginEdit.Text, true) * 1000); 
    outputarea.Top := Round(GetMargin(TopMarginEdit.Text, false) * 1000); 
    outputarea.Right := Round((pagewidth - GetMargin(RightMarginEdit.Text, true)) * 
      1000); 
    outputarea.Bottom := Round((pageheight - GetMargin(BottomMarginEdit.Text, false)) 
      * 1000); 
  end;
Umen вне форума
Старый 23.02.2007, 10:43   #3
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

продолжение
Код:
  procedure ScaleCanvas(Canvas: TCanvas; widthavail, heightavail: Integer); 
  var 
    needpixelswidth, needpixelsheight: Integer; 
    {dimensions of preview at current zoom factor in pixels} 
    orgpixels: TPoint; 
    {origin of preview in pixels} 
  begin 
    {set up a coordinate system for the canvas that uses 1/1000 inch as unit, 
    honors the zoom factor and maintains the MM_TEXT orientation of the 
    coordinate axis (origin in top left corner, positive Y axis points down} 
    scale := Screen.PixelsPerInch / 1000; 
    {Apply zoom factor} 
    scale := scale * StrToInt(Zoomedit.text) / 100; 
    {figure out size of preview} 
    needpixelswidth := Round(pagewidth * 1000 * scale); 
    needpixelsheight := Round(pageheight * 1000 * scale); 
    if needpixelswidth >= widthavail then 
      orgpixels.X := 0 
    else 
      orgpixels.X := (widthavail - needpixelswidth) div 2; 
    if needpixelsheight >= heightavail then 
      orgpixels.Y := 0 
    else 
      orgpixels.Y := (heightavail - needpixelsheight) div 2; 
    {change mapping mode to MM_ISOTROPIC} 
    SetMapMode(canvas.handle, MM_ISOTROPIC); 
    {move viewport origin to orgpixels} 
    SetViewportOrgEx(canvas.handle, orgpixels.x, orgpixels.y, nil); 
    {scale the window} 
    SetViewportExtEx(canvas.handle, Round(1000 * scale), Round(1000 * scale), nil); 
    SetWindowExtEx(canvas.handle, 1000, 1000, nil); 
  end; 
begin 
  if OrientationRGroup.ItemIndex = 0 then 
    Printer.Orientation := poPortrait 
  else 
    Printer.Orientation := poLandscape; 
  InitPrintsettings; 
  with Sender as TPaintBox do 
  begin 
    ScaleCanvas(Canvas, ClientWidth, ClientHeight); 
    {specify font height in 1/1000 inch} 
    Canvas.Font.Height := Round(font.height / font.pixelsperinch * 1000); 
    {paint page white} 
    Canvas.Brush.Color := clWindow; 
    Canvas.Brush.Style := bsSolid; 
    Canvas.FillRect(Rect(0, 0, Round(pagewidth * 1000), Round(pageheight * 1000))); 
    {draw the text} 
    DrawText(canvas.handle, PChar(PreviewText), Length(PreviewText), 
      outputarea, DT_WORDBREAK or DT_LEFT); 
    {Draw thin gray lines to mark borders} 
    Canvas.Pen.Color := clGray; 
    Canvas.Pen.Style := psSolid; 
    Canvas.Pen.Width := 10; 
    with Canvas do 
    begin 
      MoveTo(outputarea.left - 100, outputarea.top); 
      LineTo(outputarea.right + 100, outputarea.top); 
      MoveTo(outputarea.left - 100, outputarea.bottom); 
      LineTo(outputarea.right + 100, outputarea.bottom); 
      MoveTo(outputarea.left, outputarea.top - 100); 
      LineTo(outputarea.left, outputarea.bottom + 100); 
      MoveTo(outputarea.right, outputarea.top - 100); 
      LineTo(outputarea.right, outputarea.bottom + 100); 
    end; 
  end; 
end; 
procedure TForm1.ApplyMarginsButtonClick(Sender: TObject); 
begin 
  PreviewPaintbox.Invalidate; 
end; 
end.
Umen вне форума
Старый 23.02.2007, 10:44   #4
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Это файл формы для TForm1:
Код:
object Form1: TForm1 
  Left = 192 
  Top = 128 
  Width = 696 
  Height = 480 
  Caption = 'Form1' 
  Color = clBtnFace 
  Font.Charset = ANSI_CHARSET 
  Font.Color = clWindowText 
  Font.Height = -15 
  Font.Name = 'Arial' 
  Font.Style = [] 
  OldCreateOrder = False 
  OnCreate = FormCreate 
  PixelsPerInch = 120 
  TextHeight = 17 
  object Panel1: TPanel 
    Left = 503 
    Top = 0 
    Width = 185 
    Height = 453 
    Align = alRight 
    TabOrder = 0 
    object Label1: TLabel 
      Left = 8 
      Top = 8 
      Width = 92 
      Height = 17 
      Caption = 'Margins (inch)' 
    end 
    object Label2: TLabel 
      Left = 8 
      Top = 45 
      Width = 24 
      Height = 17 
      Caption = 'Left' 
    end 
    object Label3: TLabel 
      Left = 8 
      Top = 77 
      Width = 25 
      Height = 17 
      Caption = 'Top' 
    end 
    object Label4: TLabel 
      Left = 8 
      Top = 109 
      Width = 34 
      Height = 17 
      Caption = 'Right' 
    end 
    object Label5: TLabel 
      Left = 8 
      Top = 141 
      Width = 47 
      Height = 17 
      Caption = 'Bottom' 
    end 
    object Label6: TLabel 
      Left = 8 
      Top = 261 
      Width = 64 
      Height = 17 
      Caption = 'Zoom (%)' 
    end 
    object LeftMarginEdit: TEdit 
      Left = 60 
      Top = 40 
      Width = 100 
      Height = 25 
      TabOrder = 0 
      OnKeyPress = LeftMarginEditKeyPress 
    end 
    object TopMarginEdit: TEdit 
      Left = 60 
      Top = 72 
      Width = 100 
      Height = 25 
      TabOrder = 1 
      OnKeyPress = LeftMarginEditKeyPress 
    end 
    object RightMarginEdit: TEdit 
      Left = 60 
      Top = 104 
      Width = 100 
      Height = 25 
      TabOrder = 2 
      OnKeyPress = LeftMarginEditKeyPress 
    end 
    object BottomMarginEdit: TEdit 
      Left = 60 
      Top = 136 
      Width = 100 
      Height = 25 
      TabOrder = 3 
      OnKeyPress = LeftMarginEditKeyPress 
    end 
    object ApplyMarginsButton: TButton 
      Left = 24 
      Top = 304 
      Width = 137 
      Height = 25 
      Caption = 'Apply' 
      TabOrder = 4 
      OnClick = ApplyMarginsButtonClick 
    end 
    object OrientationRGroup: TRadioGroup 
      Left = 8 
      Top = 176 
      Width = 161 
      Height = 65 
      Caption = 'Orientation' 
      Items.Strings = ( 
        'Portrait' 
        'Landscape') 
      TabOrder = 5 
    end 
    object ZoomEdit: TEdit 
      Left = 80 
      Top = 256 
      Width = 40 
      Height = 25 
      TabOrder = 6 
      Text = '50' 
    end 
    object ZoomUpDown: TUpDown 
      Left = 120 
      Top = 256 
      Width = 17 
      Height = 25 
      Associate = ZoomEdit 
      Min = 0 
      Increment = 10 
      Position = 50 
      TabOrder = 7 
      Wrap = False 
    end 
  end 
  object Panel2: TPanel 
    Left = 0 
    Top = 0 
    Width = 503 
    Height = 453 
    Align = alClient 
    Font.Charset = ANSI_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -17 
    Font.Name = 'Times New Roman' 
    Font.Style = [] 
    ParentFont = False 
    TabOrder = 1 
    object PreviewPaintbox: TPaintBox 
      Left = 1 
      Top = 1 
      Width = 501 
      Height = 451 
      Align = alClient 
      OnPaint = PreviewPaintboxPaint 
    end 
  end 
end
Простите за 3 поста, просто в один всё не влезало...
Umen вне форума
Старый 23.02.2007, 11:40   #5
Dimon
Фрилансер
Пользователь
 
Аватар для Dimon
 
Регистрация: 12.01.2007
Сообщений: 15
По умолчанию

Спасибо Umen, а ты не мог бы выслать сами файлы исходника на da-ne@ya.ru, потому что мне больше интересно какие компоненты нужно при этом использовать и их свойства, а по коду очень трудно восстанавливать всю картину?
Dimon вне форума
Старый 23.02.2007, 12:25   #6
Umen
Форумчанин
 
Аватар для Umen
 
Регистрация: 10.11.2006
Сообщений: 189
По умолчанию

Почитай пост №4 там всё написано.
Делаешь так:
1) Создаёшь новый проект в Делфи.
2) Сохранияешь его куда-нибудь (Вместо Unit1.pas пишешь printpreview.pas)
3) Открываешь блокнотом файл *.dfm и вставляешь вместо текста,
текст из поста №4. Сохраняешь.
4) Открываешь блокнотом файл printpreview.pas и вставляешь вместо текста, текст из постов №2-№3. Сохраняешь.

5) Открываешь свой проект и видишь форму со всеми компонентами!
Umen вне форума
Старый 12.03.2011, 11:02   #7
xilnurx
Новичок
Джуниор
 
Регистрация: 13.03.2010
Сообщений: 2
По умолчанию

большое спасибо, помогло))
xilnurx вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нумерация страниц Александр Microsoft Office Word 3 09.01.2009 14:22
нумерация страниц chern Microsoft Office Word 3 10.05.2008 14:06
Сэйв HTML страниц... Black DeviL Общие вопросы Delphi 3 21.02.2008 21:45
Эскизы страниц в ShellListView Mitron Общие вопросы Delphi 1 16.02.2008 16:05
Эскизы страниц Mitron Общие вопросы Delphi 1 10.02.2008 23:16