for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

Re: Запрет возврата на предыдущую страницу в web-контроле
Igor Korolyov

Сообщений: 34123
Дата: 26.10.10 16:46:49
И какая принципиальная разница открывалась она по клику на ссылке или по возврату? Мне реально интересно, зачем эти 2 варианта разделять


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 27.10.10 10:00:39
Ну вот, теперь придется объяснить все.

По ссылке у меня открывается не сама страница (она - всего лишь бланк), а временная, созданная по бланку (такой вот псевдо-ASP/PHP с передачей параметров по POST или адресу).
Следовательно, в историю попадают временные страницы, что мне, естественно, не надо.

Делаю интерфейс программы полностью на Web-контроле.
Такой вариант меня уже не устраивает - forum.foxclub.ru - т.е. когда из страницы открывается FoxPro-форма.
Хочу обойтись (точнее - уже обошелся) ВООБЩЕ без форм FoxPro.
1. Создается набор страниц, оформленных в виде локального сайта.
2. В нужных местах вставляются специальные управляющие теги. Их назначение - в момент открытия сформировать вместо себя некоторый html-текст (из кода FoxPro, полей, переменных, функций).
3. Запускается программа с указанием начальной страницы и получаю Интерфейс, полностью построенный БЕЗ FoxPro-форм.
4. Кликая по ссылкам - перехожу к нужной странице/форме (точнее - к временной странице, созданной на ее основе).

Теперь самое интересное...
Данная проблема возникает ТОЛЬКО в случае расположения страниц интерфейса в разных каталогах (у меня таких - два, это основной каталог-в нем программа запускается и в нем находится стартовая страница, и каталог размещения интерфейса, куда пользователь попадает со стартовой страницы).
Почему? Временные страницы ОДНОГО каталога формируются под ОДНИМ и ТЕМ ЖЕ именем, и в этом случае проблема сама собой прекрасно решается . Первоначально все страницы бланков находилось в одном каталоге, но потом захотелось полной свободы - и вот, на тебе, вылезла проблема...

В моем случае (у меня два каталога) - по Alt-влево, если пользователь нажмет эту комбинацию на элементе, он перейдет не на предыдущую страницу, а на самое начало - что не особенно критично ("это не ошибка, это фича", причем, данная возможность удобна для быстрого перехода от раздела к разделу ).
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Igor Korolyov

Сообщений: 34123
Дата: 27.10.10 15:43:48
При полном контроле над исходниками страниц IMHO ничего не мешает сделать их все "абсолютно различимыми" - вплоть до того, чтобы даже первый и второй заход на одну и ту-же страницу шёл по разным URL-ам... При том "историю" можно трактовать как угодно гибко, хоть блокировать переход по "старому" URL-у, хоть перегенерировать страницу...


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
piva

Сообщений: 18600
Откуда: Курган
Дата: 27.10.10 16:08:31
Я не знаю что там в контроле за проблемы и че там показывается, но у меня стоит как вкопанное - и никуда не возвращается, никакими средствами, даже пункты контекстного меню - вперед\назад не доступны

  
  Public o  
  o=CreateObject("form1")  
  o.show()  
    
  Define Class Form1 as Form  
    
  	Add Object ie as OleControl with OleClass="Shell.Explorer.2", width=300, height=200  
  	  
  	Procedure ie.init  
  	With this  
  		.navigate("About:blank")  
  	EndWith  
  	  
  	Procedure ie.beforenavigate2(pdisp, url, flags, targetframename, postdata, headers, cancel)  
  	With this  
  		If url="my://next1"  
  			.navigate2("about:blank")  
  			DO While .readystate <> 4   
  				Doevents 			  
  			Enddo  
  			.document.writeln("Next page 1")  
  			cancel=.t.  
  		EndIf  
  		If url="my://next2"  
  			.navigate2("about:blank")  
  			DO While .readystate <> 4   
  				Doevents 			  
  			EndDo  
  			.document.writeln("<body>Next page 2</body>")  
  			cancel=.t.  
  		EndIf  
  	EndWith  
  	  
  	procedure Init  
  	With this  
  		.resize  
  		.ie.document.write([<FONT SIZE="2" FACE="Arial">])  
  		.ie.document.write("Переходы ")  
  		.ie.document.write("<a href='my://next1'>next 1</a>")  
  		.ie.document.write("<br>")  
  		.ie.document.write("<a href='my://next2'>next 2</a>")  
  		  
  		.ie.document.write("</font>")  
  		  
  	EndWith  
    
  	Procedure Resize  
  	With this  
  		.ie.Width=.Width  
  		.ie.height=.Height  
  	EndWith	  
    
  EndDefine


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Igor Korolyov

Сообщений: 34123
Дата: 27.10.10 16:34:31
А, жульничаешь с навигацией


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 27.10.10 16:44:43
Мне не надо делать страницы различимыми
У меня временные страницы формируются под одним и тем же именем - следовательно, никакой истории нет (это как раз то, что мне надо!).

НО если временная страница формируется в другом каталоге - история появляется (почему в другом - завязано на картинках, стилях и т.д. ).
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
piva

Сообщений: 18600
Откуда: Курган
Дата: 27.10.10 16:46:22
А че жульничабю, я так понял у него чета самописное для своего html репортера, всяко страницы не лету фигачит, хотя может и не так.

Кстати - CommandStateChange - как раз рулить Enable для CSC_NAVIGATEBACK = 0x2 И не должно никуда возвращаться, хотя не пробовал

Цитата:
Syntax

Private Sub object_CommandStateChange( _
ByVal Command As Long, _
ByVal Enable As Boolean)
Parameters

object
Object expression that resolves to the objects in the Applies To list.
Command
A CommandStateChangeConstants enumeration value that specifies the command that changed.
Enable
A Boolean value that specifies the enabled state.
false
Command is disabled.
true
Command is enabled.



typedef enum CommandStateChangeConstants {
CSC_UPDATECOMMANDS = (int) 0xFFFFFFFF,
CSC_NAVIGATEFORWARD = 0x1,
CSC_NAVIGATEBACK = 0x2
} CommandStateChangeConstants;


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 27.10.10 17:09:17
спасибо, буду смотреть
хотя, слишком сложно...
одна надежда, что не все знают про Alt-влево (или только я не знал? )
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Igor Korolyov

Сообщений: 34123
Дата: 27.10.10 17:13:09
Ну ну, завтра в IE (а значит и в этом контроле) появится какая-нить поддержка "жестов" или голосовое управление, и опять буш бороться с ветряными мельницами


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата: 27.10.10 18:20:03
Igor Korolyov
Ну ну, завтра в IE (а значит и в этом контроле) появится какая-нить поддержка "жестов" или голосовое управление, и опять буш бороться с ветряными мельницами

Так вот и я о том же. Можно использовать монитор в качестве веера, но зачем? Пусть все будет использовано для того, для чего предназначено.


------------------
Совершенство - это не тогда, когда нельзя
ничего прибавить, а тогда, когда нечего убавить.




Исправлено: Влад Колосов, 27.10.10 18:20
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Рома

Сообщений: 1079
Дата: 27.10.10 19:18:11
maple4
Мне не надо делать страницы различимыми У меня временные страницы формируются под одним и тем же именем - следовательно, никакой истории нет (это как раз то, что мне надо!).

Ну так если не надо различать - при нажатии на ссылку - просто перезаписывай innerHtml какого-нибудь DOM-эдемента содержимым временного файла(в принципе, тогда и файл не нужен)
Например,
  
  Set Safety Off  
  Text to lcApp noshow  
  <html>  
  <head>  
  <style type="text/css">  
  body  
  {  
  	margin: 0px;  
  	padding: 0px;  
  }  
  .menubar  
  {  
  	margin:0px;  
  	background-color: #dfdfd8;  
  	width:100%;  
  	padding:2px;  
  }  
  a.menuitem  
  {  
  	padding:3px; color:#000099;  
  	text-decoration:none;  
  }  
  a.menuitem:hover  
  {  
  	background-color: #000099;  
  	color: white;  
  }  
  .page  
  {  
  	margin:0px;  
  	padding:10px;   
  }  
  </style>  
  </head>  
  <body oncontextmenu="return false;" onkeydown="if(event.keyCode==116)event.keyCode=0;">  
  	<script type="text/javascript">  
  		var htmlapp = null; //will be set up in htmlapp.Init()  
  	</script>  
  	<div id="menubar" class="menubar">  
  		<a class="menuitem" onclick="htmlapp.DoForm('Form1.htm')" href="javascript:void(0)">Form1</a>  
  		<a class="menuitem" onclick="htmlapp.DoForm('Form2.htm')" href="javascript:void(0)">Form2</a>  
  		<a class="menuitem" onclick="htmlapp.DoForm('Form3.htm')" href="javascript:void(0)">Form3</a>  
  		<a class="menuitem" onclick="htmlapp.DoForm('Form4.htm')" href="javascript:void(0)">Form4</a>  
  	</div>  
  	<div id="page" class="page">  
  		<h1>Welcome</h1>  
  	</div>  
  </body>  
  </html>  
  EndText  
    
  Strtofile(lcApp, "htmlapp.htm")  
    
 *****************  
    
  htmlapp = Createobject("htmlapp")  
  htmlapp.Show(1)  
    
 ******************  
    
  Define Class htmlapp As Form  
  	Height = 500  
  	Width = 700  
  	Add Object html As OleControl With OleClass="Shell.Explorer.2"  
    
  	Procedure html.Init  
 		*Load master page  
  		This.Navigate("file:///"+Fullpath("htmlapp.htm"))  
  		Do While This.ReadyState!=4  
  			DoEvents  
  		Enddo  
  	Endproc  
    
  	Procedure Init  
  		With This.html  
  			.Move(0,0, This.Width, This.Height)  
  			.Anchor = 15  
  		EndWith  
 		*Set callback object to use it in javascript  
  		This.html.Document.Script.htmlapp = This  
  	EndProc  
    
 	*Script requests to load another page  
  	Procedure DoForm  
  	Lparameters formName  
  	With This.html.Document  
  		If File(formName)  
  			.getElementByID("page").innerHtml = filetostr(formName)  
  		Else  
  			.getElementByID("page").innerHtml = [<h1 style="color:red">File ']+formName+[' not found</h1>]  
  		EndIf  
  	Endwith  
  	Return .F.  
  	Endproc  
    
  	Procedure html.Refresh  
 		*** ActiveX Control Method ***  
  		Nodefault  
  	Endproc  
  Enddefine

Навигации как таковой здесь вообще не происходит - при нажатии на ссылку вызывается метод нашей формы,
а там просто в DIV с именем page пытаемся записать HTML из запрашиваемого файла.

При этом мы все время находимся на начальной странице - истории никак не может получиться



Исправлено: Рома, 27.10.10 19:19
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
piva

Сообщений: 18600
Откуда: Курган
Дата: 28.10.10 06:12:44
Крута , а я и не знал что так можно

This.html.Document.Script.htmlapp = This


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 28.10.10 10:33:19
Ничего себе ... возьму на вооружение
Предлагаю создать раздел по использованию ie-контрола (различные варианты создания, управление, нюансы использования и т.д.).
Если честно, узнал много нового. Стало ОЧЕНЬ интересно, "сколько же я не знаю" .

Возвращаясь к своей проблеме.
Я формирую временный файл в разных каталогах, так как страница будет использовать графику.
Пути к графике в основном относительные, поэтому НЕВОЗМОЖНО использовать один и тот же временный файл - картинки просто не будут отображаться.

Несколько вариантов запрета возврата на предыдущую страницу:
I. Запретить нажатие клавиш.
1) средствами FoxPro
одни и те же клавиши,тем не менее, должны работать при нахождении в разных элементах.
например, Backspace при редактировании текста ДОЛЖЕН работать, и должен удалять предыдущий символ.

2) средствами JavaScript
с Backspace - решено, с Alt-влево - срабатывает при нахождении в элементе.

3) запретить саму возможность срабатывания GoBack
используя DLL, доступ к реестру, код С и т.д.
слишком сложно... увидеть бы рабочий примерчик

II. Поиграться с историей.
1) формировать один временный файл.
если временная страница формируется в одном каталоге и не используется графика - тогда все ок.

2) УДАЛИТЬ историю.
есть ли такая возможность в принципе?



Исправлено: maple4, 28.10.10 10:35
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
piva

Сообщений: 18600
Откуда: Курган
Дата: 28.10.10 11:55:10
Хе - получилось отключить заполнение хистори, тока как всегда через задницу


Procedure ie.beforenavigate2(pdisp, url, flags, targetframename, postdata, headers, cancel)  
  	With this  
  		flags=2+8  
  		cancel=.t.  
  		.navigate(url, flags, targetframename, postdata, headers)  
  	EndWith

В целом это было так


  
  Text to lcStr Noshow TEXTMERGE   
  <html><body>  
  Page 1   
  <a href="<<FullPath(".")>>\page2.htm"> Next </a>  
  </body></html>  
  EndText   
  StrToFile(lcStr,"page1.htm")  
    
  Text to lcStr Noshow TEXTMERGE   
  <html><body>  
  Page 2  
  <a href="<<FullPath(".")>>\page3.htm"> Next </a>  
  EndText   
  StrToFile(lcStr,"page2.htm")  
    
  Text to lcStr Noshow TEXTMERGE   
  <html><body>  
  Page 3 - Last  
  </body></html>  
  EndText   
  StrToFile(lcStr,"page3.htm")  
    
    
  Public o  
  o=CreateObject("form1")  
  o.show()  
    
  Define Class Form1 as Form  
    
  	Add Object ie as OleControl with OleClass="Shell.Explorer.2", width=300, height=200  
  	  
  	Procedure ie.init  
  	With this  
  		.navigate2(FullPath("page1.htm"))  
  	EndWith  
    
    
  	Procedure ie.beforenavigate2(pdisp, url, flags, targetframename, postdata, headers, cancel)  
  	With this  
  		flags=2+8  
  		cancel=.t.  
  		.navigate(url, flags, targetframename, postdata, headers)  
  	EndWith  
  	  
  	procedure Init  
  	With this  
  		.resize  
  	EndWith  
    
  	Procedure Resize  
  	With this  
  		.ie.Width=.Width  
  		.ie.height=.Height  
  	EndWith	  
    
  EndDefine


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 28.10.10 12:32:45
piva
Procedure ie.beforenavigate2(pdisp, url, flags, targetframename, postdata, headers, cancel)
With this
flags=2+8
cancel=.t.
.navigate(url, flags, targetframename, postdata, headers)
EndWith

РАБОТАЕТ!!!!! - возврат не работает

Большущее спасибо!
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
piva

Сообщений: 18600
Откуда: Курган
Дата: 28.10.10 12:43:26
Правильнее будет ваще-то так, а то там получается рекурсия, хотя и продавливается как-то самим браузером

  
  	Procedure ie.beforenavigate2(pdisp, url, flags, targetframename, postdata, headers, cancel)  
  	With this  
  		If thisform.tag <> url   
  			cancel=.t.  
  			thisform.tag=url  
 			** Надо 2 раза, а то ловить рекурсию не хотелось          
  			.navigate("about:blank",10)  
  			.navigate(url, 10, targetframename, postdata, headers)  
  		EndIf  
  	EndWith


------------------
Часто бывает так, что есть над чем задуматься, а нечем.
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Рома

Сообщений: 1079
Дата: 28.10.10 15:40:17
piva
а я и не знал что так можно

Ничего хитрого, в принципе, нет - просто пользуемся тем, что при передаче VFP-объекта в COM-среду фокс создает для него IDispatch обертку,
а дальше работает позднее связывание.
Точно так же работает и в обратную сторону - фокс спокойно может использовать объекты, созданные в коде страницы с помощью javascript.
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 28.10.10 17:16:31
Цитата:
ничего хитрого
ага, а у меня мировоззрение поменялось

Цитата:
Точно так же работает и в обратную сторону - фокс спокойно может использовать объекты, созданные в коде страницы с помощью javascript.

А можно небольшой примерчик?



Исправлено: maple4, 28.10.10 17:18
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
Рома

Сообщений: 1079
Дата: 28.10.10 21:41:56
maple4
А можно небольшой примерчик?


Совершенно бесполезный пример

На странице имеем
  
  <script type="text/javascript">  
  	function getJSObject()  
  	{  
  		return {  
  			hello : "Hello, I'm JS object",  
  			num : 543534.33,  
  			bool : true  
  		};  
  	}  
  </script>

В VFP - вызываем это дело и обращаемся к свойствам объекта, полученного из js-функции
  
  Local jsObj  
  jsObj = thisform.WebBrowser.Document.Script.Eval("getJSObject()")  
    
  MessageBox( ;  
      jsobj.hello + Chr(13)+ ;  
      str(jsobj.num, 10, 2) + Chr(13)+ ;  
      Transform(jsobj.bool) )
Ratings: 0 negative/0 positive

Re: Запрет возврата на предыдущую страницу в web-контроле
maple4
Автор

Сообщений: 210
Откуда: Москва
Дата: 29.10.10 09:57:31
спасибо!
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 2 Simple777  (Гостей: 1)

© 2000-2021 Fox Club 
Яндекс.Метрика