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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2009, 21:31   #1
Terazoid
 
Регистрация: 09.06.2009
Сообщений: 9
Вопрос Печать текста на принтере

Здравствуйте.
У меня есть код. Он создает html страницу. Как отправить на печать эту страницу?
Буду благодарен любой помощи.
{-----------------------------}
Может попробовать как-то так:
Код:
WinExec('print "'+OpenDialog1.FileName+'"', 0);

Последний раз редактировалось Terazoid; 29.11.2009 в 22:04. Причина: Добавление
Terazoid вне форума Ответить с цитированием
Старый 29.11.2009, 23:08   #2
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Terazoid, а страница у тебя в чем создается? Покажи код тогда и поговорим...
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли

Последний раз редактировалось Marsel737; 29.11.2009 в 23:11.
Marsel737 вне форума Ответить с цитированием
Старый 29.11.2009, 23:32   #3
Terazoid
 
Регистрация: 09.06.2009
Сообщений: 9
По умолчанию

Страница создается через текстовый файл.
Код:
procedure TForm1.Action1Execute(Sender: TObject);
var htmlfile:textfile;
    text:string;
begin
  if HtmlExportDialog.Execute then
  begin
  assignfile(htmlfile, HtmlExportDialog.FileName);
  rewrite(htmlfile);
  writeln(htmlfile, '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
  writeln(htmlfile, '<html>');
  writeln(htmlfile, '<head>');
  writeln(htmlfile, '<title>'+DBEdit1.Text+'</title>');
  writeln(htmlfile, '<meta http-equiv=Content-Type content="text/html; charset=windows-1251">');
  writeln(htmlfile, '<meta name="Generator" content="'+Form1.Caption+'">');
  writeln(htmlfile, '</head>');
  writeln(htmlfile, '<body>');
  writeln(htmlfile, '<table style="marign: 5px; padding: 5px; border: sotid 1px #AAA;" width="100%"><tr><td>');
  writeln(htmlfile, '<h1>'+DBEdit1.Text+'</h1>');
  text:=DBMemo1.Lines.Text;
  text:=ReplaceSub(text, #13, '<br>'+#13);//Вставка в конце строк текста тег br
  writeln(htmlfile, text);
  writeln(htmlfile, '</td></tr></table>');
  writeln(htmlfile, '<table style="vertical-align:middle;border: solid 2px #EEE;position:absolute;bottom:1px;color:#181818;marign: 5px; padding: 5px;" width="98%" height="25"><tr><td>');
  writeln(htmlfile, '<div align="right"><b style="color: #151515;">© Terazoid, '+Form1.Caption+'</b></div>');
  writeln(htmlfile, '</td></tr></table>');
  writeln(htmlfile, '</body>');
  writeln(htmlfile, '</html>');
  closefile(htmlfile);
  end;
end;
Terazoid вне форума Ответить с цитированием
Старый 30.11.2009, 02:29   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Напечатать HTML-страницу не так то просто...
Я думаю, надо динамически создать WebBrowser, загрузить в него страницу из файла и потом распечатать средствами самого WebBrowser'а.

С динамическим созданием, я думаю, сами справитесь.

Вот пример загрузки в WebBrowser HTML-страницы как строки

Функция с ссылки:

Код:
uses ActiveX, COMObj, MSHTML, Variants;

procedure ShowWebString(WB: TWebBrowser; const Content: string);
var
  V: OleVariant;
  HtmlDoc: IHTMLDocument2;
begin
  WB.Navigate('about:blank'); //чтобы документ был
  while WB.Busy do
    sleep(50);
  OleCheck(WB.Document.QueryInterface(IHTMLDocument2, HtmlDoc));
  V := VarArrayCreate([0, 0], varVariant);
  V[0] := Content;
  //и просто пишем в пустой документ...
  //Как ни странно, VArray & PSafeArray - одно и то же :)
  HtmlDoc.write(PSafeArray(TVarData(V).VArray));
  HtmlDoc.close;
end;
Файл загружайте TStringList'ом. Вот пример использования функции:
Код:
var
 sl: TStrings;
begin
 sl := TStringList.Create;
 try
  sl.LoadFromFile('C:\File.html');
  ShowWebString(WebBrowser1, sl.Text);
 finally
  sl.Free;
 end;
end;
Печать содержимого WebBrowser'а можете найти тут.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 30.11.2009, 03:19   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Зачем создавать браузер?
Проще загрузить файл в мемо или стринглист...
Код:
uses Printers;

procedure PrintStrings(Strings: TStrings);
var
  Prn: TextFile;
  i: word;
begin
  AssignPrn(Prn);
  try
    Rewrite(Prn);
    try
      for i := 0 to Strings.Count - 1 do
        writeln(Prn, Strings.Strings[i]);
    finally
      CloseFile(Prn);
    end;
  except
    on EInOutError do
      MessageDlg('Error Printing text.', mtError, [mbOk], 0);
  end;
end;
Чтобы распечатать содержимое TMemo или TListbox, используйте следующие команды:
Код:
PrintStrings(Memo1.Lines);
или
Код:
PrintStrings(Listbox1.Items);
mihali4 вне форума Ответить с цитированием
Старый 30.11.2009, 03:24   #6
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

mihali4, дык не текст страницы печатать надо, а саму страницу...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 30.11.2009, 03:25   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А-а-а... Но тема-то звучит так - "Печать текста на принтере"...

Последний раз редактировалось mihali4; 30.11.2009 в 03:27.
mihali4 вне форума Ответить с цитированием
Старый 30.11.2009, 18:24   #8
Terazoid
 
Регистрация: 09.06.2009
Сообщений: 9
Смех

Neeter, спасибо, сейчас попробую.
mihali4, Спасибо за помощь, но мне самое важное сохранить форматирование текста. Как печатать через AssignPrn(); я знаю. Если-бы мне надо было печатать просто текст, я-бы не задавал вопрос. А мне, возможно, надо будет печатать текст с картинками.
Еще раз всем огромное спасибо.
Terazoid вне форума Ответить с цитированием
Старый 30.11.2009, 19:45   #9
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Terazoid, вот способ распечатать сразу всю форму, я этот метод использовал чуть меньше года назад, если не ошибаюсь здесь можно задать размер печатаемой области, например чтоб не печатать рамку и заголовок формы, но могу и ошибаться, всё таки давно это дело было...

Код:
procedure TForm1.Print;
var
  DC: HDC;
  bmpForm: TBitMap;
  inchW,inchH: real;
begin
  bmpForm := TBitMap.Create;
  DC := GetWindowDC(Handle);
  try
    try
      inchW := Form1.Width/Screen.PixelsPerInch;
      inchH := Form1.Height/Screen.PixelsPerInch;
      bmpForm.Width := Round(inchW*GetDeviceCaps(Printer.Handle, LOGPIXELSX));
      bmpForm.Height := Round(inchH*GetDeviceCaps(Printer.Handle, LOGPIXELSY));
    begin
      bmpForm.Width := Printer.PageWidth;
      bmpForm.Height := bmpForm.Width * Form1.Height div Form1.Width;
    end;
    if bmpForm.Height > Printer.PageHeight then
    begin
      bmpForm.Height := Printer.PageHeight;
    end;
    if bmpForm.Width > Printer.PageWidth then
    begin
      bmpForm.Width := Printer.PageWidth;
    end;
    if PrintDialog.Execute then
    begin
      printer.BeginDoc;
      StretchBlt(bmpForm.Canvas.Handle,0,0,bmpForm.Width, bmpForm.Height,DC,0,0,Form1.Width,Form1.Height,SrcCopy);
      BitBlt(Printer.Canvas.Handle,0,0,bmpForm.Width,bmpForm.Height,bmpForm.Canvas.Handle,0,0,SrcCopy);
      Printer.EndDoc;
    end;
    except
      on EPrinter do
      begin
        Abort;
        ShowMessage('Îøèáêà ïðè ðàáîòå ñ ïðèíòåðîì');
      end;
    end;
    finally ReleaseDC(Handle, DC);
    bmpForm.Free;
  end;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 30.11.2009, 20:51   #10
Terazoid
 
Регистрация: 09.06.2009
Сообщений: 9
Хорошо

Я уже написал как мне посоветовал Neeter. Печатает.
Всем спасибо!
Terazoid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
печать на PDF принтере Frost.sapr Мультимедиа в Delphi 1 12.10.2008 23:17
Обрезка на принтере чеков epson Родион Общие вопросы Delphi 0 07.10.2008 18:53
Печать на матричном принтере Dimon Общие вопросы Delphi 1 11.07.2008 13:20
печать текста в форме пилы OlifK@ Паскаль, Turbo Pascal, PascalABC.NET 3 13.04.2008 15:11
отмена печати на принтере в Delphi Юliana Общие вопросы Delphi 2 29.01.2008 19:51