Delphi XE6のFireMonkeyモバイルアプリケーションでTWebBrowserのHTMLページにJavaScriptを実行する(2)

前回のエントリー「Delphi XE6のFireMonkeyモバイルアプリケーションでTWebBrowserのHTMLページにJavaScriptを実行する」の続きです。

TWebBrowserのEvaluateJavaScriptメソッドは、定義されているJavaScriptに引数を与えて実行することができます。

作成するサンプルのアプリケーションでは、ボタンを押すとGoogleマップにマーカーを追加します。

フォームにTButtonとTWebBrowserを配置します。

00

フォームのOnCreateイベントを追加します。
起動時にTWebBrowserにGoogleマップを表示します。

procedure TForm1.FormCreate(Sender: TObject);
const
  HTML =
    '<!DOCTYPE html>' +
    '<html lang="ja">' +
    '<head>' +
    '<meta charset="UTF-8">' +
    '<meta name="viewport" content="initial-scale=1.0, user-scalable=no">' +
    '<style>' +
    'html, body, #map_canvas { width: 100%; height: 100%; }' +
    '</style>' +
    '<script src="http://maps.google.com/maps/api/js?sensor=true"></script>' +
    '<script>' +
    'var map;' +
    'function initialize() {' +
    '  var latlng = new google.maps.LatLng(34.693738, 135.502165);' +
    '  var myOptions = {' +
    '    zoom: 11,' +
    '    center: latlng,' +
    '    mapTypeId: google.maps.MapTypeId.ROADMAP' +
    '  };' +
    '  map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);' +
    '}' +
    'function AddMaker(name, lat, lng) {' +
    '  var marker = new google.maps.Marker({' +
    '    position: new google.maps.LatLng(lat, lng),' +
    '    map: map,' +
    '    title: name' +
    '  });' +
    '  var infowindow = new google.maps.InfoWindow({' +
    '    content: name' +
    '  });' +
    '  google.maps.event.addListener(marker, "click", function() {' +
    '    infowindow.open(map,marker);' +
    '  });' +
    '}' +
    '</script>' +
    '</head>' +
    '<body onload="initialize();">' +
    '<div id="map_canvas"></div>' +
    '</body>' +
    '</html>';
begin
  WebBrowser1.LoadFromStrings(HTML, '');
end;

表示しているHTMLには使用されていないJavaScriptの関数「AddMaker」があります。
このAddMaker関数をDelphiから実行します。

ボタンのOnClickイベントを追加します。

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.EvaluateJavaScript('AddMaker("ユニバーサルスタジオジャパン", 34.665442, 135.432338)');
  WebBrowser1.EvaluateJavaScript('AddMaker("通天閣", 34.652499, 135.506306)');
  WebBrowser1.EvaluateJavaScript('AddMaker("海遊館", 34.654518, 135.428965)');
  WebBrowser1.EvaluateJavaScript('AddMaker("大阪城", 34.687315, 135.526201)');
  WebBrowser1.EvaluateJavaScript('AddMaker("道頓堀", 34.668549, 135.502716)');
end;

アプリケーションを実行します。

01

ボタンを押します。

02

マーカーが追加されました。

マーカーをクリックすると、情報ウィンドウが表示されます。

Screenshot_2014-06-28-19-54-27

C++のstd::equalやstd::mismatchで指定範囲の要素を比較する

C++のstd::equalやstd::mismatchで指定範囲の要素を比較する

std::equalは指定した範囲をoperator==で比較します。

std::vector<std::string> vec1, vec2;
vec1.push_back("C++");
vec1.push_back("Java");
vec1.push_back("Python");

vec2.push_back("C++");
vec2.push_back("Java");
vec2.push_back("Python");

//vec1.begin()からvec1.end()までの範囲をoperator==で比較する
if (std::equal(vec1.begin(), vec1.end(), vec2.begin())) {
  std::cout << "equal" << std::endl;
} else {
  std::cout << "not equal" << std::endl;
}

std::equalの第4引数で、operator==の代わりに比較する関数を指定できます。

#include <algorithm>

//大文字小文字を区別しないで比較する
struct compare {
  bool operator()(const std::string& s1, const std::string& s2) {
    return (stricmp(s1.c_str(), s2.c_str()) == 0);
  }
};

std::vector<std::string> vec1, vec2;
vec1.push_back("C++");
vec1.push_back("Java");
vec1.push_back("Python");

vec2.push_back("c++");
vec2.push_back("java");
vec2.push_back("python");

if (std::equal(vec1.begin(), vec1.end(), vec2.begin(), compare())) {
  std::cout << "equal" << std::endl;
} else {
  std::cout << "not equal" << std::endl;
}

std::mismatchは2つのシーケンスの等しくない最初の要素を返します。

std::vector<std::string> vec1, vec2;
vec1.push_back("C++");
vec1.push_back("Java");
vec1.push_back("Python");

vec2.push_back("C++");
vec2.push_back("Java");
vec2.push_back("python");

std::pair<std::vector<std::string>::iterator, std::vector<std::string>::iterator> p = 
  std::mismatch(vec1.begin(), vec1.end(), vec2.begin());

std::cout << *(p.first) << std::endl; //Python
std::cout << *(p.second) << std::endl; //python

コンテナ中の最小の要素を取得する(std::min_element)

std::min_elementはコンテナ中の最小の要素を返します。

#include <vector>
#include <algorithm>

//コンテナにランダムな要素を設定する
std::vector<int> numbers(10);
std::generate(numbers.begin(), numbers.end(), rand);

//最小の要素
int min = *min_element(numbers.begin(), numbers.end());

コンテナ中の最大の要素を取得する(std::max_element)

std::max_elementはコンテナ中の最大の要素を返します。

#include <vector>
#include <algorithm>

//コンテナにランダムな要素を設定する
std::vector<int> numbers(10);
std::generate(numbers.begin(), numbers.end(), rand);

//最大の要素
int max = *max_element(numbers.begin(), numbers.end());