« 2007年4月 | トップページ | 2007年6月 »

■Ribbon UI

tmssoftware.comのTMS Advanced Toolbars & Menus v2.8.0.3をいう製品を購入しました。
Microsoft Office 2007 の Ribbon UI風のツールバーが簡単にできます。
使い方が悪いのか、日本語が一部文字化けするところもありますが、今のところツールバーコントロールにありがちなメモリ違反もなく、とてもいい感じです。ただ、見た目的にツールバーはクールなのですが、他のコントロールが従来のままなので、なんとなく中途半端ですけどね。又、稚拙な自作アイコンはもはや通用せず、こちらもGlyFXとかのきれいなアイコンを揃えないといけないのかなって気がします。まあ社内で使うアプリに、「なんでそこまで見た目にこだわるんや~」って感じですけどね。

TMS Advanced Toolbars & Menus v2.8.0.3

|

☆Google Earthを操作する。No3

今回は、KMLファイルの作成に挑戦してみました。
KMLのリファレンスは、KML 2.1 Referenceを参考にしました。
KMLファイル自体は、実は普通のXMLファイルなので、リファレンスを読むだけで、他には特に説明することはないですね。(文字をUTF-8でエンコードしなきゃいけないぐらい?)
ただ、LoadKmlDataを使って、Google Earthの保留フォルダに登録してみたのですが、日本語が文字化けして使えませんでした。英語だとぜんぜん問題ないんだけど。とりあえず一時ファイルを作成して、OpenKmlFileで読み込むという方法で処理しました。

|

☆SecondaryShortCutsを使う

簡単なプレゼン用ソフトを作っていて、矢印キーでページ切り替えできるようにするためにショートカットの利用を考えてみました。

ActionListでalPriorというActionを作ったとして、ショートカットなら
alPrior.ShortCut := VK_LEFT;
とかになるけど、左矢印と上矢印を割り当てたい場合、どうすればいいのかと悩んでいたらSecondaryShortCutsが使えるんじゃないかと思い、試してみました。

alPrior.SecondaryShortCuts.Add('LEFT');
alPrior.SecondaryShortCuts.Add('UP');

これだけでちゃんと動きました。

|

☆Google Earthを操作する。No2

昨日、検索結果の位置取得のプログラムで、画面の中央を取得してみたいなコードを書きましたが、このパラメーターを0にするときちんと座標が取れました。
PointOnTerrainGE := GE.GetPointOnTerrainFromScreenCoords(0,0);

Google Earth COM API Documentationより
 ・(-1, -1) - bottom left hand corner of the screen. 
 ・(0,0) - center of the screen. 
 ・(1, 1) - top right hand corner of the screen. 

以下の部分を、上のコードに置き換える。
-----------------------------------------------------------------------------
// 画面の中央に検索した場所が表示されるみたいので、
  // 中央位置を取得する。
  // Google Earthの検索結果のプロパティと微妙にずれているので
  // もっと正確に取得する方法があると思う。
GetWindowRect(GE.GetRenderHwnd, Rect); PointOnTerrainGE := GE.GetPointOnTerrainFromScreenCoords(  Rect.Left+(Rect.Right-Rect.Left)/2,Rect.Top+(Rect.Bottom-Rect.Top)/2); -----------------------------------------------------------------------------

|

☆Google Earthを操作する。

Google Earth COM API Documentationというものを見つけたので、タイプライブラリを使ってGoogle Earthを操作するサンプルを作ってみました。このサンプルは、Google Earthを起動した上で試してみて下さい。

1.コマンドラインで次のように入力して Google Earth's COM API を登録します。
"C:\Program Files\Google\Google Earth\googleearth.exe" /RegServer
2.タイプライブラリの取り込み
 (1)コンポーネント → コンポーネントのインポートダイアログでタイプライブラリの取り込みを選択し、
   「次へ」ボタンを押す。
 (2)Earth 1.0 Type Libraryを選択して「次へ」ボタンを押す。
   (一覧にない場合には、「追加」ボタンを押して
    c:\Program Files\Google\Google Earth\googleearth.dllを選択する。)
 (3)コンポーネントラッパーの作成にチェックを入れて「次へ」ボタンを押す。
 (4)ユニットの作成にチェックを入れて(デフォルトのまま)「完了」ボタンを押す。

3.新規フォームにボタンを3つ配置します。

4.プログラムは下記の通りです。(uses にEARTHLib_TLBを追加し忘れないように)

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
     GE : TApplicationGE;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  GE := TApplicationGE.Create(Self);
end;


// 終了処理
procedure TForm1.FormDestroy(Sender: TObject);
begin
  GE.Free;
end;


// 緯度、経度による表示
procedure TForm1.Button1Click(Sender: TObject);
var
  lat, lon, range, Tilt, azimuth, speed: Double;
begin
  // JR京都駅
  lat := 34.98545833;
  lon := 135.7577556;
  // 表示設定
  range := 500;
  tilt := 0;
  azimuth := 0;
  speed := 0.3;
  // 表示
  GE.SetCameraParams(lat, lon, 0, AbsoluteAltitudeGE,
    Range, tilt, azimuth, speed);
end;


// ScreenShotの保存・・・なぜか白黒
procedure TForm1.Button2Click(Sender: TObject);
begin
  GE.SaveScreenShot('c:\ScreenShot.jpg', 100);
end;


// 検索
procedure TForm1.Button3Click(Sender: TObject);
var
  SearchControllerGE: ISearchControllerGE;
  PointOnTerrainGE: IPointOnTerrainGE;
  Rect : TRect;
begin
  SearchControllerGE := GE.SearchController;
  // 検索文字列は、住所でもOK!
  SearchControllerGE.Search('東京タワー');

  // 検索して表示するだけなら上記まででよい。
  // 以下、その場所の緯度、経度の取得に挑戦。

  // ウェイトをかける。--これでも変な値のときがある。
  // 「表示しました」イベントがあればいいのになぁ
  Sleep(5000);
  while GE.StreamingProgressPercentage < 100 do
  begin
    Application.ProcessMessages;
    Sleep(100);
  end;

  // どうでもいいけど、検索結果の消去
  SearchControllerGE.ClearResults;

  // 画面の中央に検索した場所が表示されるみたいので、
  // 中央位置を取得する。
  // Google Earthの検索結果のプロパティと微妙にずれているので
  // もっと正確に取得する方法があると思う。
  GetWindowRect(GE.GetRenderHwnd, Rect);
  PointOnTerrainGE := GE.GetPointOnTerrainFromScreenCoords(
    Rect.Left+(Rect.Right-Rect.Left)/2,
    Rect.Top+(Rect.Bottom-Rect.Top)/2);

  ShowMessage('緯度:'+FloatToStr(PointOnTerrainGE.Latitude)+#13#10+
              '経度:'+FloatToStr(PointOnTerrainGE.Longitude));
end;

end.

|

« 2007年4月 | トップページ | 2007年6月 »