Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > TWebBrowser нужно подменить скроллеры


Автор: B2_Russia 14.3.2006, 20:32
Дано:

Необходимо вывести в бровзер на приложении HTMLку НО! должен быть вертикальный скроллер заданного дизайна, следуя чему скорее всего его нужно будет рисовать самому.

Попытки:
Сделал HTML все загружается.
Убрал скроллеры.
Знаю как прокрутить HTML ScrollBy(x,y)

Что не получается:
1. Узнать высоту HTML - файла чтобы сделать перемещение ползунка в соответствии с размерами HTML (тексты разные будут)
2. С отрубанием полос прокрутки пропала прокрутка колесиком (MouseWheel).
3. Как узнать в каком положении прокрутки документ находится в данный момент. ТО есть ScrollBy есть а обратной ей ф-ии нету.

Если кто знает решение, не поленитесь, подскажите! горю! ярким пламенем!

M
Girder
Одна тема - один вопрос!
Пожалуйста, не нарушайте правил форума!

Автор: Alex 14.3.2006, 20:55
Код

<STYLE>
BODY {
    SCROLLBAR-FACE-COLOR: #000080; SCROLLBAR-HIGHLIGHT-COLOR: #bcdede; SCROLLBAR-SHADOW-COLOR: #bcdede; SCROLLBAR-3DLIGHT-COLOR: #555555; SCROLLBAR-ARROW-COLOR: #ffffff; SCROLLBAR-TRACK-COLOR: #f2f2f2; SCROLLBAR-DARKSHADOW-COLOR: #000080
}
</STYLE>

Автор: B2_Russia 14.3.2006, 21:11
Нет это не выход, там, к примеру кнопки тоже градиентные обрати внимание на верхнюю кнопку, то есть у нее еще состояния есть up, over, down smile Я б так уж давно сделал
Добавлено @ 21:12
smile

Автор: Alex 14.3.2006, 21:23
если там html страница, то значит это делали средствами html, это практически на верника, так, что я бы на вашем месте задал вопрос в разделе html

Автор: B2_Russia 14.3.2006, 21:29
Почему я думаю что сделано это не посредством WEB/JavaScript так это потому, чтобы сделать скроллеры с такими кнопками нужен JavaScript а в страницах которые грузит приложение голый HTML!!!
Добавлено @ 21:31
Там кроме текстов и тегов типа H2, BODY, A и тп ничего нету

Автор: Alex 15.3.2006, 01:03
Я конечно покажусь сейчас занудой, но все же настоятельно советаю спросить в разделе html или js нельзя ли их силами добиться, того, что представлено у вас на картинке.

Автор: B2_Russia 15.3.2006, 03:43
Да подсказали вариант, но всеже хотел бы выяснить вопрос, как это можно сделать в Delphi?

Автор: Girder 15.3.2006, 16:12
 Вот например... без подмены. 
Брось WebBrowser, 2 кнопочки... и подвесь обработку событий.

Короче... см. код smile
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
  TForm1 = class(TForm)
    WB: TWebBrowser;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure WBProgressChange(Sender: TObject; Progress,
      ProgressMax: Integer);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses MSHTML;

procedure TForm1.Button1Click(Sender: TObject);
begin
 //WB.Navigate('http://poligon.vingrad.ru/index.php?');
 WB.Navigate('http://www.mail.ru');
end;

procedure TForm1.WBProgressChange(Sender: TObject; Progress,
  ProgressMax: Integer);
begin
 if assigned(WB.Document) then
  Caption:=IHTMLDocument2(WB.Document).readyState;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,MsT:Double;
    j:Integer;
begin
 i:=Variant(WB.Document).documentElement.scrollTop;
 if i=0 then Variant(WB.Document).documentElement.scrollTop:=1;
 if (Variant(WB.Document).documentElement.scrollTop=1)or(i>0) then //или через проверку Variant(WB.Document).compatMode
  begin
  //!DOCTYPE - Oк!
   Variant(WB.Document).documentElement.scrollTop:=i;
   MsT:=Variant(WB.Document).documentElement.scrollHeight-Variant(WB.Document).documentElement.clientHeight;
   Caption:='Max_scrollTop: '+FloatToStr(MsT);
   Caption:=Caption+';'+'Cur_scrollTop: '+FloatToStr(Variant(WB.Document).documentElement.scrollTop);
   //Изменим не много scroll
   Variant(WB.Document).documentElement.style.setAttribute('scrollbar3dLightColor','red',0);
   //По перемещаем
   for j:=0 to Round(Mst) do
    begin
     Variant(WB.Document).documentElement.scrollTop:=j;
     Application.ProcessMessages;
     Sleep(5);
    end;
  end else
  begin
  //!DOCTYPE - Фу!
   MsT:=IHTMLDocument2(WB.Document).body.getAttribute('scrollHeight',0)-IHTMLDocument2(WB.Document).body.getAttribute('clientHeight',0);
   Caption:='Max_scrollTop: '+FloatToStr(MsT);
   Caption:=Caption+';'+'Cur_scrollTop: '+FloatToStr(IHTMLDocument2(WB.Document).body.getAttribute('scrollTop',0));
   //Изменим не много scroll
   IHTMLDocument2(WB.Document).body.setAttribute('scrollbar3dLightColor','red',0);
   //По перемещаем
   for j:=0 to Round(Mst) do
    begin
     IHTMLDocument2(WB.Document).body.setAttribute('scrollTop',j,0);
     Application.ProcessMessages;
     Sleep(5);
    end;   
  end;
{Другие доступны стили скролла
scrollbar3dLightColor
scrollbarArrowColor
scrollbarBaseColor
scrollbarDarkShadowColor
scrollbarFaceColor
scrollbarHighlightColor
scrollbarShadowColor
scrollbarTrackColor}
end;

end.
 

Автор: B2_Russia 15.3.2006, 21:55
Блин это не катит, стили подменять это конечно хорошо, но скроллер у меня нарисованый, делать его по дизайну нужно... Там не достаточно стиль поменять, нужно самому его нарисовать.
Ну допустим я вставил WebBrowser диалог (чилд) так что он перекрывает вертикальный скроллер, и wheel работает и стандартный закрыт можно на этом диалоге рисовать свой.

НО!

Не знаю как получить высоту документа загруженного в TWB и позицию текущую, чтобы расчитать нужное положение ползунка и его размер!!!
Вот!
Если подскажете как?!!! то проблема решена!

Автор: Girder 15.3.2006, 22:17
Цитата(B2_Russia @ 15.3.2006, 21:55 Найти цитируемый пост)
Не знаю как получить высоту документа загруженного в TWB и позицию текущую, чтобы расчитать нужное положение ползунка и его размер!!!
Вот!
Если подскажете как?!!! то проблема решена!
Смотри код... внимательно, там енто есть... как для коректного и не старого !DOCTYPE... так и для не коректного(опущенного или старого)

PS: Даже в Caption там выводиться енти значения.

Автор: B2_Russia 15.3.2006, 22:26
О! Буду проверять как работает!
Только я про DOCTYPE не совсем вкурсе!
Как правильно оформить страницу чтобы все было ?

Автор: Girder 15.3.2006, 22:53
Цитата(B2_Russia @ 15.3.2006, 22:26 Найти цитируемый пост)
Как правильно оформить страницу чтобы все было ?
Ну...
1. Одна тема... один вопрос smile
2. Енто уже не к Delphi
3. Начни от сюда http://webforus.com.ru/w/s/?id=102 ну а дальше... в соответствующий раздел на форуме smile

Автор: B2_Russia 15.3.2006, 22:58
Всеравно спасибо smile

Автор: B2_Russia 15.3.2006, 23:48
Оп! Стоп! А как поймать сообщение MOUSEWHEEL на TWebBrowser?

Автор: B2_Russia 18.3.2006, 21:32
Girder, ответь на последний вопрос плиз он тоже к этому посту относится, так как это тоже прокрутка окна и при создании полноценного скролбара без этого не обойтись!

В drkb не нашел smile


M
Girder
Нет. Так как ты нарушаеш правило...
о котором я уже два раза говорил!

Автор: SAVANE 18.1.2008, 22:41
Сори что в закрытую тему стучу.
Большое спаибо чуть модефицировал код даный Grider и получилось то что доктор прописал. Но возникла проблема. Сайт находится локально. Я убрал полосы прокрутки с браузера. При попытке скролинга страницы что загружается первой все работает как часы. при переходе на следующюю страницу не работает. В чем могут быть причины.

Код

....
procedure HideWBScrolls;
var
  lDocument: IHTMLDocument2;
  lBody: IHTMLElement;
  lStyle: IHTMLStyle2;
begin
  if Assigned(Form1.WebBrowser1.Document) and
    (Succeeded(Form1.WebBrowser1.Document.QueryInterface(IHTMLDocument2,
    lDocument))) then
  begin
    lBody := lDocument.Body;
    if Assigned(lBody) and Assigned(lBody.style) and
      Succeeded(lBody.Style.QueryInterface(IID_IHTMLStyle2, lStyle)) then
    begin
      lStyle.overflowX := 'hidden'; //??????? ?????????????? ?????
      lStyle.overflowY := 'hidden'; //??????? ???????????? ?????
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
y:=0;
nowstr:=0;
with TRegistry.Create do
        try
                rootkey := HKEY_LOCAL_MACHINE;
                OpenKey('\SOFTWARE\UaKiosk', False);
                StartURL:=Readstring('IndexHTML');
                CloseKey;
        finally
        Free;
        end;
WebBrowser1.Navigate(StartURL);
ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_Hide);
Form1.WebBrowser1.BringToFront
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(FindWindow('Shell_TrayWnd', nil), SW_Normal);
end;


...
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
HideWBScrolls;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var i,MsT:Double;
    j:Integer;

begin
if key='+' then WebBrowser1.ScrollBy(0, -1);
if key='-' then
begin
 i:=Variant(WebBrowser1.Document).documentElement.scrollTop;
 if i=0 then Variant(WebBrowser1.Document).documentElement.scrollTop:=1;
 if (Variant(WebBrowser1.Document).documentElement.scrollTop=1)or(i>0) then //èëè ÷åðåç ïðîâåðêó Variant(WB.Document).compatMode
  begin
  //!DOCTYPE - Oê!
   Variant(WebBrowser1.Document).documentElement.scrollTop:=i;
   MsT:=Variant(WebBrowser1.Document).documentElement.scrollHeight-Variant(WebBrowser1.Document).documentElement.clientHeight;
   Caption:='Max_scrollTop: '+FloatToStr(MsT);
   Caption:=Caption+';'+'Cur_scrollTop: '+FloatToStr(Variant(WebBrowser1.Document).documentElement.scrollTop);
   //Èçìåíèì íå ìíîãî scroll
   Variant(WebBrowser1.Document).documentElement.style.setAttribute('scrollbar3dLightColor','red',0);
   //Ïî ïåðåìåùàåì
   for j:=0 to Round(Mst) do
    begin
     Variant(WebBrowser1.Document).documentElement.scrollTop:=j;
     Application.ProcessMessages;
     Sleep(5);
    end;
  end else
  begin
  //!DOCTYPE - Ôó!
   MsT:=IHTMLDocument2(WebBrowser1.Document).body.getAttribute('scrollHeight',0)-IHTMLDocument2(WebBrowser1.Document).body.getAttribute('clientHeight',0);
   Caption:='Max_scrollTop: '+FloatToStr(MsT);
   Caption:=Caption+';'+'Cur_scrollTop: '+FloatToStr(IHTMLDocument2(WebBrowser1.Document).body.getAttribute('scrollTop',0));
   //Èçìåíèì íå ìíîãî scroll
   IHTMLDocument2(WebBrowser1.Document).body.setAttribute('scrollbar3dLightColor','red',0);
   //Ïî ïåðåìåùàåì
   for j:=0 to Round(Mst) do
    begin
     IHTMLDocument2(WebBrowser1.Document).body.setAttribute('scrollTop',j,0);
     Application.ProcessMessages;
     Sleep(5);
    end;
  end;
 End;

end;

procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
  ProgressMax: Integer);
begin
 if assigned(WebBrowser1.Document) then
  Caption:=IHTMLDocument2(WebBrowser1.Document).readyState;
end;
......

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)