экстенты карты Google

1

У меня есть приложение 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 намного больше, ценю любую помощь, которую я могу получить, и пытаюсь дать ответы, когда я могу (что, к сожалению, не часто).

  • 1
    Пожалуйста, смотрите stackoverflow.com/questions/1083472/…
  • 2
    Найдите вопрос об ЭЭ через Google, и ответ будет виден. EE отображает ответ, если реферер google.com.
Показать ещё 2 комментария
Теги:
google-maps

2 ответа

3
Лучший ответ

Я собирался предположить, что вы используете тот факт, что 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;
  • 1
    Извините, нет доступа к бирже экспертов. Вы не можете опубликовать решение здесь? (см. длинный ответ, приложенный к OP)
  • 1
    Дэвид уже включил решение: установите значение скрытого поля формы HTML, а затем прочитайте значение этого элемента из хост-приложения.
0

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>
  • 0
    Возможно, ExecScript должен вернуть результат как вариант, но это не так. Функция задокументирована так, чтобы всегда устанавливать параметр результата в VT_EMPTY.
  • 0
    Это интересно, спасибо. К счастью, метод IHTMLDocument.Script работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню