У меня есть приложение Delphi, которое загружает карту Google в TWebBrowser:
with WebBrowser1.Document as IHTMLDocument2 do
with parentWindow do
ExecScript('map.setCenter(new GLatLng(51.15917, 4.13889),10)', 'JavaScript');
Любая идея о том, как получить экстенты карты в моем приложении?
ТИА
Стивен
изменить
Rob отвечает на частичное решение: javascript знает о координатах. Я хотел бы получить их в моем приложении Delphi.
заметка об обмене экспертами
(длинный ответ на ответ давидинов)
Я был на Expert Exchange, когда они начали и когда он был еще свободным. Я ушел, когда они стали жадными.
Если кто-то достаточно хорош, чтобы помочь мне в технической проблеме, я не возражаю, чтобы заплатить ему за это, но я определенно не хочу платить кому-то еще за это.
И их 30-дневное испытание еще хуже. Почему я должен предоставить номер своей кредитной карты, если они не собираются ее взимать?
"Экспертная биржа - это самый надежный ИТ-ресурс в Интернете, и мы уверены, что вы согласитесь" (sic). Хорошо, я не был бы слишком уверен, Э.Е. Мне нравится SO намного больше, ценю любую помощь, которую я могу получить, и пытаюсь дать ответы, когда я могу (что, к сожалению, не часто).
Я собирался предположить, что вы используете тот факт, что javascript знает координаты, чтобы каким-то образом выполнить script с этим вызовом, чтобы вернуть координаты в ваше приложение. однако, посмотрев на эту тему - экспертный обмен, похоже, что это невозможно. но в том же потоке говорится: "вы можете настроить функцию JavaScript на значение элемента скрытого поля HTML, а затем прочитать это значение из вашего кода Delphi". пример снизу вниз. надеюсь, что немного полезно. определенно, не идеальный способ получить координаты.
edit: извините, я не понял, когда вы переходите к экспертной бирже отсюда, он блокирует контент. если вы заходите на эту страницу из Google, она появится. просто чтобы сэкономить время, вот копия и вставка решения:
DropZone: Я не думаю, что есть способ получить значение функции JavaScript напрямую, поскольку функции выполняются с помощью различных магических слоев абстракции. Однако вы можете указать, что ваша функция JavaScript задала значение элемента скрытого поля HTML, а затем прочитала это значение из вашего кода Delphi.
Первая часть тривиально проста: у вас просто функция JavaScript задает значение в скрытом поле:
<!-- Somewhere in the HTML form -->
<input type="hidden" id="HiddenFieldID" name="HiddenFieldName" value="">
--------------------
// JavaScript function
function MyFunc()
{
// Get the hidden field by its ID.
var elm = document.getElementById('HiddenFieldID');
if (elm) elm.value = '10086';
return 10086;
}
Вот пример того, как сделать эту последнюю часть: http://www.cryer.co.uk/brian/delphi/twebbrowser/read_write_form_elements.htm#GetValueOfField
В вашем случае вы захотите иметь что-то вроде прилагаемого кода.
-dZ.
function GetFieldValue(fromForm: IHTMLFormElement;
const fieldName: string): string;
var
field: IHTMLElement;
inputField: IHTMLInputElement;
selectField: IHTMLSelectElement;
textField: IHTMLTextAreaElement;
begin
field := fromForm.Item(fieldName,'') as IHTMLElement;
result := '';
if Assigned(field) and (field.tagName = 'INPUT') then
begin
inputField := field as IHTMLInputElement;
if inputField.type_ = 'hidden' then
result := inputField.value;
end
end;
IHTMLWindow2.execScript
из упомянутого примера EE должно возвращать возвращаемое значение выполненного script в качестве варианта. Но вам не нужно использовать свойство IHTMLDocument2.parentWindow
. Там также IHTMLDocument.Script
, который является IDispatch
, поэтому вы можете использовать его через позднюю привязку Variant:
var
Document: IHTMLDocument;
VScript, V: Variant;
begin
Document := WebBrowser.Document as IHTMLDocument;
VScript := Document.Script;
V := VScript.HelloJavaScript();
ShowMessage(V);
end;
HelloJavaScript - это функция javascript, возвращающая строку:
<script language="javascript">
function HelloJavaScript()
{
s = "Hello, world! (javascript)";
alert(s);
return s;
}
</script>