
Опытный
 
Профиль
Группа: Участник
Сообщений: 338
Регистрация: 2.11.2008
Репутация: нет Всего: 6
|
1) тинц сюди =>>> http://sources.ru/delphi/delphi_print.shtml =>>> Код | uses CommDlg;
{$IFNDEF WIN32} const MAX_PATH = 144; {$ENDIF}
procedure TForm1.Button1Click(Sender: TObject); var Pd : TPrintDlg; DocInfo: TDocInfo; begin FillChar(Pd, sizeof(Pd), #0); Pd.lStructSize := sizeof(Pd); Pd.hWndOwner := Form1.Handle; Pd.Flags := PD_RETURNDC; if PrintDlg(pd) then begin FillChar(DocInfo, sizeof(DocInfo), #0); DocInfo.cbSize := SizeOf(DocInfo); GetMem(DocInfo.lpszDocName, 32); GetMem(DocInfo.lpszOutput, MAX_PATH); lStrCpy(DocInfo.lpszDocName, 'My Document'); {Следующая строка указывает на файл, который надо распечатать } lStrCpy(DocInfo.lpszOutput, 'C:\Download\Test.doc'); StartDoc(Pd.hDc, DocInfo); StartPage(Pd.hDc); TextOut(Pd.hDc, 100, 100, 'Page 1', 6); EndPage(Pd.hDc); StartPage(Pd.hDc); TextOut(Pd.hDc, 100, 100, 'Page 2', 6); EndPage(Pd.hDc); EndDoc(Pd.hDc); FreeMem(DocInfo.lpszDocName, 32); FreeMem(DocInfo.lpszOutput, MAX_PATH); end; end;
|
2)ище есть такое: Код | // Инициализируем поля структуры TPrintDlg FillChar(pd, SizeOf(pd), 0); pd.lStructSize := SizeOf(pd); pd.hwndOwner := hRichEdit; pd.hInstance := hInstance; pd.Flags := PD_RETURNDC or PD_NOPAGENUMS or PD_NOSELECTION or PD_PRINTSETUP or PD_ALLPAGES; pd.nFromPage := $ffff; pd.nToPage := $ffff; pd.nMinPage := 0; pd.nMaxPage := $ffff; pd.nCopies := 1;
// Выводим на экран диалоговую панель, предназначенную // для печати документа if PrintDlg(pd) = True then begin PrintDC := pd.hDC;
// Инициализируем поля структуры TFormatRange FillChar(fr, SizeOf(fr), 0); // Будем печатать с использованием контекста // принтера, полученного от функции PrintDlg fr.hdc := PrintDC; fr.hdcTarget := PrintDC;
// Печатаем весь документ fr.chrg.cpMin := 0; fr.chrg.cpMax := -1; // Устанавливаем размеры страницы в TWIPS-ах with fr.rcPage do begin Top := 0; Left := 0; Right := MulDiv(GetDeviceCaps(PrintDC, PHYSICALWIDTH), 1440, GetDeviceCaps(PrintDC, LOGPIXELSX)); bottom := MulDiv(GetDeviceCaps(PrintDC, PHYSICALHEIGHT), 1440, GetDeviceCaps(PrintDC, LOGPIXELSY)); end; fr.rc := fr.rcPage;
// Оставляем поля if (fr.rcPage.Right > 2 * 3 * 1440 / 4 + 1440) then begin fr.rc.Left := 3 * 1440 div 4; dec(fr.rc.Right, fr.rc.Left); end; if (fr.rcPage.Bottom > 3 * 1440) then begin fr.rc.top := 1440; dec(fr.rc.Bottom, fr.rc.top); end; // Заполняем поля структуры DOCINFO FillChar(DocInfo, SizeOf(DocInfo), 0); with DocInfo do begin cbSize := SizeOf(DocInfo); lpszOutput := ''; lpszDocName := 'DIMTable document'; end;
// Начинаем печать документа nRc := StartDoc(PrintDC, DocInfo); // Если произошла ошибка, получаем и выводим на экран код ошибки if (nRc < 0) then begin dwErr := GetLastError; MessageBox(0, PChar(Format('Ошибка печати = %ld', [dwErr])), AppName, MB_OK or MB_ICONEXCLAMATION); DeleteDC(PrintDC); Exit; end;
// Начинаем печать страницы StartPage(PrintDC); lLastChar := 0;
// Определяем длину текста в байтах lTextSize := SendMessage(hRichEdit, WM_GETTEXTLENGTH, 0, 0);
// Цикл по всем страницам документа //==================================== // этот цткл и клинит, а почему не понял //==================================== while (lLastChar < lTextSize) do begin // Форматируем данные для принтера и печатаем их lLastChar := SendMessage(hRichEdit, EM_FORMATRANGE, 1, Longint(@fr)); if (lLastChar < lTextSize) then begin // Завершаем печать очередной страницы EndPage(PrintDC); // Начинаем новую страницу StartPage(PrintDC); fr.chrg.cpMin := lLastChar; fr.chrg.cpMax := -1; end; end;
// Удаляем информацию, которая хранится в // органе управления Rich Edit SendMessage(hRichEdit, EM_FORMATRANGE, 1, 0);
// Завершаем печать страницы EndPage(PrintDC);
// Завершаем печать документа EndDoc(PrintDC);
// Удаляем контекст принтера DeleteDC(PrintDC); end;
|
--------------------
Ради зачета студент идет на все, даже на лекции........................
|