Как сделать Printpreview у Twebbrowser

  • Автор темы zubr
  • Дата начала
Статус
Закрыто для дальнейших ответов.
Z

zubr

В общем проблема такая: мне надо сделать показ окна предварительной печати для TWebBrowser, но не в окне IE, а в собственном окне. Ну в общем то можно конечно самому высчитывать и форматировать, исходя из размеров печати страницу отображения, но может есть более простой способ.
 
B

Barmutik

Код:
// InvokeCmd
procedure InvokeCMD(InvokeIE: Boolean; Value1, Value2: Integer; var vaIn, vaOut: OleVariant);
var
CmdTarget: IOleCommandTarget;
PtrGUID, PtrGUID2: PGUID;
begin
New(PtrGUID);
try
 if InvokeIE then
 begin
  PtrGUID2 := PtrGUID;
  PtrGUID2^ := CLSID_WebBrowser;
 end
 else
  PtrGuid2 := nil;
 if DefaultInterface.Document <> nil then
 try
  DefaultInterface.Document.QueryInterface(IOleCommandTarget, CmdTarget);
  if CmdTarget <> nil then
  try
   CmdTarget.Exec(PtrGuid2, Value1, Value2, vaIn, vaOut);
  finally
   CmdTarget := nil; //._Release;
  end;
 except
 end;
finally
 Dispose(PtrGUID);
end;
end;

procedure PrintPreview;
var
vaIn, vaOut: Olevariant;
begin
InvokeCmd(FALSE, OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT, vaIn, vaOut);

end;

Точно работает с версии Эксплорера 5.5 и выше .. раньше не проверял...
 
Z

zubr

Вы меня не поняли - этот метод вызывает окно IE, в котором отображается просмотр печати. Для моей задачи (требование заказчика), окошко должено иметь свой интерфейс в едином стиле с другими окнами программы. До сих пор в общем то я вызывал похожим методом окно просмотра:
Код:
function TFView.GetIEHandle(WebBrowser: TWebbrowser; ClassName: string): HWND;
var 
hwndChild, hwndTmp: HWND; 
oleCtrl: TOleControl; 
szClass: array [0..255] of char;
begin
oleCtrl:=WebBrowser;
hwndTmp:=oleCtrl.Handle;
while (true) do
begin
hwndChild:=GetWindow(hwndTmp, GW_CHILD);
GetClassName(hwndChild, szClass, SizeOf(szClass));
if (string(szClass)=ClassName) then
begin
 Result:=hwndChild;
 Exit;
end;
hwndTmp:=hwndChild;
end;
Result := 0;
end;

procedure TFView.But_printClick(Sender: TObject);
var
i, com:Integer;
reg:TRegistry;
s, s1:string;
begin
reg:=TRegistry.Create;
try
reg.RootKey:=HKEY_LOCAL_MACHINE;
If reg.OpenKeyReadOnly('SOFTWARE\Microsoft\Internet Explorer') then
begin
 s:=reg.ReadString('Version');
 reg.CloseKey;
 For i:=1 to Length(s) do
 begin
 If (byte(s[i])>=48) and (byte(s[i])<=57) then
 begin
  s1:=s[i];
  If StrToInt(s1)<6 then
  com:=ID_IE_FILE_PRINT
  else
  com:=ID_IE_FILE_PRINTPREVIEW;
  break;
 end;
 end;
end
else
com:=ID_IE_FILE_PRINT;
finally
reg.Free;
end;
FlagPrint:=True;
ViewToWebBrowser;
SendMessage(GetIEHandle(WebBrowser1, 'Shell DocObject View'),
WM_COMMAND, com, 0);
end;
Хотя то же самое получается и с ExecWB.
На текущий момент вышел из положения не совсем красиво, но в принципе работает.
HTML-ский файл, отображающийся в WebBrowser, открываю в ворде в фоновом режиме, сохраняю его с нужными параметрами страницы, определяю сколько страниц, исходя из этого устанавливаю размер OleContainer, который лежит на ScrollBox, затем загружаю полученный вордовский файл в OleContainer:
Код:
procedure TForm1.FormShow(Sender: TObject);
var
i, n:Integer;
w, w1:Variant;
begin
OLEContainer1.CreateObjectFromFile('MyFile.doc', False);
OleContainer1.DoVerb(ovShow);
for i:=1 to OleContainer1.OleObject.CommandBars.Count do
if OleContainer1.OleObject.CommandBars.Item[i].Visible then
OleContainer1.OleObject.CommandBars.Item[i].Visible:=False;
w:=OleContainer1.OleObject;
w.ActiveWindow.DisplayRulers:=False;
w.Application.DisplayScrollBars:=False;
W1:=CreateOleObject('Word.Application');
W1.visible:=False;
W1.Documents.open('MyFile.doc');
n:=w1.Selection.Information[wdNumberOfPagesInDocument];
W1.Documents.Item('MyFile.doc').Close;
w1.Quit;
OleContainer1.Height:=1100*n;
OleContainer1.Enabled:=False;
end;
 
B

Barmutik

Да .. понял не верно ... но рисовать свой PrintPreview крайне муторнгое дело ...

Ваш вариант приемлим .. я бы единственное что посоветовал открывать потом вордовский документ не в ОлеКонтейнере (поблем с ним не оберёшся) а напрямую опять в эксплорере ..

Он туда тогда встаривается через ObjectView и всё гораздо красивее выглядит... и нет проблем с пропадающими в Ворде тулбарами...
 
Z

zubr

Ваш вариант приемлим .. я бы единственное что посоветовал открывать потом вордовский документ не в ОлеКонтейнере (поблем с ним не оберёшся) а напрямую опять в эксплорере ..
А что, это идея. Спасибо.
 
B

Barmutik

Да я просто сам с этим столько намучался .. что ужасТЬ... если в ОлеКонтейнере, то не дай бог пользователь откроет Ворд во время работы программы .. тулбаров нет .. рулера нет и т.д.. а уж говорить про стабильность работы .. когда надо 10 штук по очереди открыть .. так это вообще ...

Очень долго искалось как это обойти .. и показывать через браузер оказалось просто отличным вариантом ...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!