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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2008, 14:28   #1
Pitonio
Пользователь
 
Аватар для Pitonio
 
Регистрация: 11.07.2008
Сообщений: 17
По умолчанию Пакетная печать HTML документов из Delphi

Всем здрасте.
С Делфи общаюсь только неделю и уже столкнулся с такой проблемой: потребовалось написать прогу, которая печатает (разумеется на принтере) файлы, которые найдет (все, что печатать вобще можно, то и должна печатать). Офисовские документы как-то удается распечатать (ну и всякие там *.txt, *.rtf, *.pdf и тп)(при помощи ShellExecute), а вот с *.html возникают определенные трудности, а именно выплевывается окно с вопросом сколько копий печатать, как печатать и на чем. Сие явление для меня нежелательно, так как если послать на печать 6328463 файла, у пользователя пальцы устанут. Пробовал:
ShellExecute(Handle, 'Print', 'Файло',nil , nil, SW_hide), также
WinExec(PChar(C),SW_SHOW), где C - вытащен из HKCR\htmlfile\shell\print\command с замененным %1 на имя файла.
И если в первом случае он показывает окошко, описанное выше, то во втором случае он вобще никаких действий не производит.
Если кто-нибудь что-то про это может подсказать, буду очень признателен.
Краткость - сестра таланта.
Л.Н.Толстой
Pitonio вне форума Ответить с цитированием
Старый 11.07.2008, 15:54   #2
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию

html печатать можно только через браузер...
у меня по print вообще office загружается...
т.е. загружаешь iexplorer.exe, далее кидаешь ему команду VK_CONTROL + Ord('P'), далее VK_ENTER и так для всех файлов...
Тема по Ctrl+P есть здесь http://www.delphimaster.ru/cgi-bin/f...1203995675&n=5

Найти handle загруженного окна:
Код:
function soaFindWindow(ATitle: string): THandle;
var hwnd : integer;
    Buffer : ^TBuffer;
    count  : integer;
begin

 New(Buffer);
 hwnd := GetTopWindow(0);
 count := 0;
 while hwnd <> 0 do
  begin
       hwnd := GetNextWindow(hwnd, GW_HWNDNEXT);
       GetWindowText(hwnd, Buffer^, 254);



       if Pos(ATitle, Buffer^) <> 0 //(Buffer^ = ATitle)
         then begin
           Result := hwnd;
           Exit;
         end;
    if count >= 100 then Break;
  end;
  Dispose(Buffer);
  Result := 0;
end;
knight вне форума Ответить с цитированием
Старый 11.07.2008, 16:05   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Delphi World:
Цитата:
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.SwissDelphiCenter.com');
end;

// Print without Printer Dialog

procedure TForm1.Button2Click(Sender: TObject);
var
vaIn, vaOut: OleVariant;
begin
WebBrowser1.ControlInterface.ExecWB (OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,
vaIn, vaOut);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.07.2008, 16:37   #4
Pitonio
Пользователь
 
Аватар для Pitonio
 
Регистрация: 11.07.2008
Сообщений: 17
По умолчанию to Stilet

И еще вопрос: а под консольное приложение этот код должен работать?
Краткость - сестра таланта.
Л.Н.Толстой

Последний раз редактировалось Pitonio; 11.07.2008 в 16:48. Причина: Проверил с кнопочками, все работает
Pitonio вне форума Ответить с цитированием
Старый 14.07.2008, 10:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Pitonio
В принципе можно попробовать, но врядли WebBrowser будет работать в неоконке, даже если ты ему найдеш окно-родителя.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2008, 11:14   #6
Pitonio
Пользователь
 
Аватар для Pitonio
 
Регистрация: 11.07.2008
Сообщений: 17
По умолчанию

Ну да, в консольном виде у меня сразу после navigate выбрасывает в конец процедуры. А вот окном родителя может быть IE? Если да, то можно его вызывать его с помощью WebBrowser1.CreateParented? И еще: если делать так, как мне надо (т.е. по какому-либо событию программа должна и загружать и печатать без участия пользователя), то выбодится ошибка: "Попытна отменить конченое место переноса, которое не было зарегистрировано." Чует мое сердце, что программа не будет печатать, пока не загрузится страница. Если так, то надо вызвать процедуру печати после того, как загрузится страница. Вопрос только в том, как определить когда она загрузилась. Задержку выставлять - не совсем желательно. Я думаю есть флаг того, что страница уже загрузилась.
Краткость - сестра таланта.
Л.Н.Толстой
Pitonio вне форума Ответить с цитированием
Старый 14.07.2008, 11:19   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как определить когда она загрузилась
По событию OnDownloadComplete
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2008, 11:01   #8
Pitonio
Пользователь
 
Аватар для Pitonio
 
Регистрация: 11.07.2008
Сообщений: 17
По умолчанию

Чего-то не получается у меня ничего. Где и как надо объявлять событие OnDownloadComplete?
Пишу:
type
TForm1 = class(TForm)
....
private
procedure WebBrowser1OnDownloadComplete(Sende r:TObject);
{ Private declarations }
public
{ Public declarations }
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.ya.ru');
end;
Procedure Tform1.WebBrowser1OnDownloadComplet e(Sender:Tobject);
Var
vaIn, vaOut : OleVariant;
Begin
WebBrowser1.ControlInterface.ExecWB (OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, vaIn, vaOut);
end;

По кнопке загружается страница, дальше (по моим предположениям) сразу должна ползти печать но ничего не происходит. для контроля (ну если может какие глюки с принтером) вляпал Лэйбл1 и по событию OnDownloadComplete, текст Лейбла должен меняться, но не меняется.
Вот если кто-нибудь мне б дал сцылку на то, где описано как отрабатывать события, или так, в двух словах на пальцах мне объяснил что я неправильно делаю, было бы мне счастье. (но оно бы было бы не полным, если я не узнаю как представить WebBrowser в окне Internet Explorer'a).
А всем откликнувшимся людям Огромное Спасибо.
Краткость - сестра таланта.
Л.Н.Толстой
Pitonio вне форума Ответить с цитированием
Старый 15.07.2008, 11:30   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я наверное ошибся (извинтеляюсь) не то событие тебе нагнул.
Попробуй OnDocumentComplete юзать.

Давно уж забил на WebBrowser
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2008, 09:08   #10
Pitonio
Пользователь
 
Аватар для Pitonio
 
Регистрация: 11.07.2008
Сообщений: 17
По умолчанию

Ну вот. Все работает. Всем Огромное Спасибо. На консольный вариант забил. Буду теперь эту процедуру пытаться запихивать в DLL, но это уже совсем другая песня... Закрывайте тему, Господа Модераторы.
P.S.: Если нужен код программы, спрашивайте как-нибудь.
Краткость - сестра таланта.
Л.Н.Толстой
Pitonio вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать в Delphi Coda89 Помощь студентам 5 21.05.2008 17:32
Открытие документов Microsofrt Common Console через delphi )Игнат( Общие вопросы Delphi 6 24.01.2008 17:09
перехват отправления чужими программами отправки на печать документов Nat Win Api 7 20.04.2007 16:07
где найти инфу про программирование документов ms office в Delphi? нужно срочно! Алёна БД в Delphi 7 05.04.2007 12:57