1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

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

Тема в разделе "Delphi - программирование", создана пользователем zubr, 24 фев 2006.

Статус темы:
Закрыта.
  1. zubr

    zubr Гость

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

    Barmutik Гость

    Репутация:
    0
    Код:
    // 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 и выше .. раньше не проверял...
     
  3. zubr

    zubr Гость

    Репутация:
    0
    Вы меня не поняли - этот метод вызывает окно 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;
     
  4. Barmutik

    Barmutik Гость

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

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

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

    zubr Гость

    Репутация:
    0
    А что, это идея. Спасибо.
     
  6. Barmutik

    Barmutik Гость

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

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

Поделиться этой страницей