<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE feed [
      <!ENTITY lt "&#38;#60;">
      <!ENTITY gt "&#62;">
      <!ENTITY amp "&#38;#38;">
      <!ENTITY apos "&#39;">
      <!ENTITY quot "&#34;">
      <!ENTITY nbsp "&#160;">
      <!ENTITY copy "&#169;">
]>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title type="text">開発ブログ</title>
    <subtitle type="text">MASA Lab softlab-Software Architecture Laboratory</subtitle>
    <updated>2026-04-17T14:40:39+09:00</updated>
    <id>http://softlab.masa-lab.net/modules/d3blog/index.php</id>
    <link rel="alternate" type="text/xhtml" hreflang="ja" href="http://softlab.masa-lab.net/" />
    <link rel="self" type="application/atom+xml" href="http://softlab.masa-lab.net/modules/d3blog/index.php?page=atom" />
    <rights>Copyright &copy; 2008-2019 by MASA-Lab</rights>
    <generator uri="http://softlab.masa-lab.net/">D3BLOG - XOOPS BLOG MODULE</generator>
    <entry>
        <title>FireMonkey TListBox removeObject でメモリリークした</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=252" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=252</id>
        <published>2017-02-11T21:00:00+09:00</published>
        <updated>2018-02-16T15:16:27+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">Berlin upd2TListBox に AddObject するときにTListBoxItem を
ListBoxItem := TListBoxItem.Create(nil);
...
ListBox.AddObject(ListBoxItem);
のようにして作成するとRemoveObject したときにメモリリークを起こしてしまっ...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>Berlin upd2<br /><br />TListBox に AddObject するときに<br />TListBoxItem を<br /><pre class="blogCode"><code>
ListBoxItem := TListBoxItem.Create(nil);
...
ListBox.AddObject(ListBoxItem);
</code></pre><br />のようにして作成すると<br />RemoveObject したときにメモリリークを起こしてしまった。<br /><br />作成時に<br /><pre class="blogCode"><code>
ListBoxItem := TListBoxItem.Create(ListBox);
</code></pre><br />とすれば、メモリリークは発生しなかった</div>]]>
       </content>
    </entry>
    <entry>
        <title>DesignVisible がなくなった？</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=201" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=201</id>
        <published>2015-09-18T21:30:00+09:00</published>
        <updated>2016-02-25T19:41:11+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">XE5 で作っていたアプリケーションを 10 Seattle でコンパイルしてみましたFMX.Controls.TControl.DesignVisible がなくなっているようでエラーが...ちょっと便利に使っていたりしたので、困ってしま...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>XE5 で作っていたアプリケーションを 10 Seattle でコンパイルしてみました<br /><br />FMX.Controls.TControl.DesignVisible がなくなっているようで<br />エラーが...<br /><br />ちょっと便利に使っていたりしたので、困ってしまいました...<br />結構色々変わりますねー</div>]]>
       </content>
    </entry>
    <entry>
        <title>FireMonkey XE8 クロスプラットフォームでの画像ファイルフォーマット</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=193" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=193</id>
        <published>2015-06-23T18:10:11+09:00</published>
        <updated>2015-09-16T11:07:12+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">それぞれのプラットフォームで扱えるビットマップデータの種類は以下の模様です。 Windows ＝ bmp, gif, jpg, hdp, ico, png, .tif MacOS ＝ bmp, icns, jpg, gif, png, tif, tga iOS ＝ jpg, png Android ＝ gif, jpg, pngiOS...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>それぞれのプラットフォームで扱えるビットマップデータの種類は以下の模様です。<br /> Windows ＝ bmp, gif, jpg, hdp, ico, png, .tif<br /> MacOS ＝ bmp, icns, jpg, gif, png, tif, tga<br /> iOS ＝ jpg, png<br /> Android ＝ gif, jpg, png<br /><br />iOS のことを考えると jpg, png の2択<br />写真系なら jpg 通常の画像なら png ということ<br /><br /><a href="http://docwiki.embarcadero.com/Libraries/XE8/ja/FMX.Graphics.TBitmapCodecManager#.E3.82.B5.E3.83.9D.E3.83.BC.E3.83.88.E3.81.95.E3.82.8C.E3.81.A6.E3.81.84.E3.82.8B.E7.94.BB.E5.83.8F.E5.BD.A2.E5.BC.8F" target="_blank">FMX.Graphics.TBitmapCodecManager</a></div>]]>
       </content>
    </entry>
    <entry>
        <title>FireMonkey で poOwnerFormCenter</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=98" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=98</id>
        <published>2014-08-26T22:50:00+09:00</published>
        <updated>2014-12-25T11:44:27+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">Delphi XE5なぜか FireMonkey on Windows では poOwnerFormCenter が効かないんですよね？必ず poScreenCenter になってしまうのです。ネットで情報を検索してみたら、とりあえずこんなのが見つかりました...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>Delphi XE5<br /><br />なぜか FireMonkey on Windows では poOwnerFormCenter が効かないんですよね？<br />必ず poScreenCenter になってしまうのです。<br /><br />ネットで情報を検索してみたら、とりあえずこんなのが見つかりました。<br /><br /><a href="http://stackoverflow.com/questions/8195106/firemonkey-and-showing-modal-dialog-center-of-the-owner-form" rel="external">http://stackoverflow.com/questions/8195106/firemonkey-and-showing-modal-dialog-center-of-the-owner-form</a><br /><br /><pre class="blogCode"><code>
Position is not implemented in FireMonkey by ShowModal.
</code></pre><br />と書いてあります！！<br />それはないでしょう？と思ったのですが、poOwnerFormCenter が機能しないのは事実なので、これを使ってみました。<br />しかし、うまくいきません。<br />仕方がないのでトレースしてみると、折角FormHelper でSetBounds しているのに、ShowModal 中で置き換えられてしまっています。<br /><br />ソースを見る限りでは poOwnerFormCenter がサポートされていないわけではないようですが、なぜか ParentForm がアサインされていない場合は poScreenCenter に変えられてしまっているようなのです。<br />これはバグなのではないだろうか？と思っても仕方ありません。<br /><br />先ほどのコードの最後の部分にちょっと細工をしてごまかしてみたら、無事にオーナーフォームセンターに表示ができました。<br />あまりお行儀良くないですけど...<br /><br />ただ、このコードには問題があります。<br />Position を poDesigned に書き換えてしまうので...<br />私は通常 Form を自分で動的に生成しているので問題ありませんが、そうでない場合はきっと、2回目以降の動作に問題が発生してしまいますね<br />(前の位置に表示されてしまう？)<br /><br /><br />[追記]<br /><br />私もいつも参考にさせていただいている山本隆さんのブログにこの件の記事がありました。<br /><a href="http://www.gesource.jp/weblog/?p=6830" target="_blank">FireMonkey on WindowsではpoOwnerFormCenterが効かない</a>(山本隆の開発日誌)<br />ここでは実行時型情報を使って ParentForm を設定することで、この問題を回避しています。<br />なるほどこんなやり方もあるんですね。</div>]]>
       </content>
    </entry>
    <entry>
        <title>Delphi Android アプリケーションパスが取得できない？</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=63" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=63</id>
        <published>2014-04-03T23:30:00+09:00</published>
        <updated>2018-01-18T18:58:24+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">
VCL ではアプリケーションのパスは Application.ExeName で取得していました。
FM では代わりに ParamStr(0) を使っていたのですが…
</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div><p>
VCL ではアプリケーションのパスは Application.ExeName で取得していました。<br />
FM では代わりに ParamStr(0) を使っていたのですが…<br />
</p>
<p>
android の実機で試したところ ParamStr(0) は空文字でした？！<br />
どうすればいいのでしょう？
</p>

<p>
まずは docwiki を見てみると、
TPath (System.IOUtils) を使ってプラットフォームに関わらずに、ホームパスなどを取得できるようです。<br />
<a href="http://docwiki.embarcadero.com/RADStudio/XE5/ja/サポートされているターゲット_プラットフォームに適した標準の_RTL_パス関数" target="_blank">サポートされているターゲット_プラットフォームに適した標準の_RTL_パス関数 (docwiki)</a><br />
これによると TPath.GetLibraryPath が、アプリケーションのパスだということのようですね。
</p>

<p>
DDMS を使ってファイルの配置状態を確認<br />
DDMS は 
c:\ユーザ\パブリック\パブリックのドキュメント\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86-20130522\sdk\tools
にあります。<br />
<br />
android debug monitor<br />
monitor.bat を使った方が良いみたいです。
</p>

<h4>追記</h4>
<p>
ちなみにアプリケーションファイル名は以下で取れる模様
</p>
<pre class="blogCode"><code>
JStringToString(TAndroidHelper.Context.getPackageCodePath())
</code></pre></div>]]>
       </content>
    </entry>
    <entry>
        <title>TStringHelper.Chars でエラーが起きたら</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=45" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=45</id>
        <published>2014-01-12T22:00:00+09:00</published>
        <updated>2014-01-22T10:29:57+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">
ソースコードをモバイルコンパイラに対応しようとして s[1] を s.Chars[0] という具合に書き換えていたときのことです。 
下記のようなコンパイルエラーが発生しました。
これは何でし...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div><p>
ソースコードをモバイルコンパイラに対応しようとして s[1] を s.Chars[0] という具合に書き換えていたときのことです。 <br />
下記のようなコンパイルエラーが発生しました。<br />
これは何でしょう？
</p>
<pre class="blogCode"><code>
[dcc32 エラー] xxxxx.pas(56): E2018 レコード，オブジェクトまたはクラスのいずれかが必要です
</code></pre>
<p>
一瞬何が起きたのかよくわかりませんでしたが、よく考えてみれば簡単なことでした。<br />
.Chars[] 構文は TStringHelper によって実現されており、TStringHelper は System.SysUtils で定義されています。<br />
つまり、System.SysUtils を Uses していなかったからこのエラーが出てしまったという訳でした。
</p>

<br />
<br />
<h4>[関連記事]</h4>
<p>
<a href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=51" target="_blank">Delphi 過去ソースからモバイルへポーティング(文字列処理2)</a><br />
</p></div>]]>
       </content>
    </entry>
    <entry>
        <title>Delphi 過去ソースからモバイルへポーティング(文字列処理2)</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=51" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=51</id>
        <published>2014-01-12T20:30:00+09:00</published>
        <updated>2014-01-21T10:48:57+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">
過去のプログラムから、モバイルアプリケーションへポーティングをする際の文字列処理の問題。
文字列へのインデックスアクセスはどのように変えましょうか。
</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div><p>
過去のプログラムから、モバイルアプリケーションへポーティングをする際の文字列処理の問題。
文字列へのインデックスアクセスはどのように変えましょうか。
</p>
<h3>文字列へのインデックスアクセス</h3>
<p>
文字列にインデックスでアクセスするのはとてもよく使います。<br />
インデックスが 1から始まっていたものが 0始まりに変わるということですが、デスクトップコンパイラは 1始まりのままですから、両方に対応するように書かなければなりません。<br />
以下のようなコードを書き換えるには、大きく二通りの方法がありそうです。
</p>
<pre class="blogCode"><code>
var
  i: Integer;
  S: String;
begin
  for i := 1 To Length(S) do begin
    S[i];
  end;
end;
</code></pre>
<br />

<h3>Low, High を使って、適切なインデックス範囲にアクセス</h3>
<p>
Low() と High() は、デスクトップ/モバイルコンパイラ それぞれで適切な値を返すので、それを使ってアクセスする方法です。<br />
(デスクトップでは 1～Length, モバイルでは 0～Length-1)<br />
</p>
<pre class="blogCode"><code>
var
  i: Integer;
  S: String;
begin
  for i := Low(S) To High(S) do begin
    S[i];
  end;
end;
</code></pre>
<p>
この書き方は配列アクセスするときにやっていた書き方ですね。<br />
ループ処理をしているときには、ループ部分だけを書き換えればいいので楽かもしれません。<br />
ただ、デスクトップとモバイルで添え字の値が違っているので、添え字の値を永続化して使う場合などには注意が必要かもしれません。<br />
</p>
<br />

<h3>すべて 0 始まりでアクセスする</h3>
<p>
インデックスを 0始まりとしてアクセスする方法です。<br />
この場合は S[n] でアクセスすることはできません。<br />
かわりに S.chars[n] としてアクセスします。
</p>
<pre class="blogCode"><code>
var
  i: Integer;
  S: String;
begin
  for i := 0 To Length(S)-1 do begin
    S.chars[i];
  end;
end;
</code></pre>
<p>
この場合、Copy や Pos のような関数も使うことができなくなります。<br />
代わりに S.Substring や S.IndexOf のように TStringHelper のメソッドを使って書き換える必要があります。
</p>

<br />
<p>
1番目のやり方の方がコードの書き換え量は少なくて済みそうです。<br />
ただ、2番目のやり方の方が Cなどと近くなるのでわかりやすいような...<br />
とりあえず新規で書くときには 2番目のやり方が良いでしょう。<br />
既存のものをメンテナンスするときには、適宜どちらかに決めて使うという感じでしょうか。<br />
</p>

<br />
<br />
<h4>[関連記事]</h4>
<p>
<a href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=44" target="_blank">Delphi 過去ソースからモバイルへポーティング(文字列処理1)</a><br />
</p></div>]]>
       </content>
    </entry>
    <entry>
        <title>Delphi 過去ソースからモバイルへポーティング(文字列処理1)</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=44" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=44</id>
        <published>2014-01-12T16:00:00+09:00</published>
        <updated>2014-01-21T10:48:36+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">
過去のプログラムから、モバイルアプリケーションへポーティングをする際に問題になることは色々ありますが、ありがちなのは文字列のインデックスの問題でしょうか。


Delphi モバ...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div><p>
過去のプログラムから、モバイルアプリケーションへポーティングをする際に問題になることは色々ありますが、ありがちなのは文字列のインデックスの問題でしょうか。<br />
</p>
<pre class="blogCode"><code>
Delphi モバイル コンパイラの場合、文字列は 0 から始まるインデックス方式を
採用しています。さらに、今後、文字列は不変（一定）になる見込みです。
</code></pre>
<p>
from <a href="http://docwiki.embarcadero.com/RADStudio/XE4/ja/デスクトップ_アプリケーションから_iOS_アプリケーションへの_Delphi_コードの移行" target="_blank">デスクトップ アプリケーションから iOS アプリケーションへの Delphi コードの移行</a><br />
</p>
<p>
結構これは影響大きいですね。<br />
この手の処理はロジックのコードのほうが影響を受けるように思います。<br />
さらに今後、文字列は一定になると!<br />
可変文字列を扱う場合は TStringBuilder を使うとか…<br />
これについては私の場合、文字列の一部を変更する処理はあまり書かないので、影響はなさそうですけれど。<br />
</p>
<p>
さて、今後に向けてどのように対応しておけば良いのでしょうか？
</p>

<h3>String -> PChar 変換</h3>
<p>
私のソースコードでは結構あるのが以下のようなものです<br />
</p>
<pre class="blogCode"><code>
var
  S: String;
  Ptr: PChar;
begin
  S := &#039;foo&#039;;
  Ptr := @S[1];
end;
</code></pre>

<p>
これは次のように書き換えます。
</p>
<pre class="blogCode"><code>
var
  S: String;
  Ptr: PChar;
begin
  S := &#039;foo&#039;;
  Ptr := PChar(S);
end;
</code></pre>

<br />
<br />
<h4>[関連記事]</h4>
<p>
<a href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=51" target="_blank">Delphi 過去ソースからモバイルへポーティング(文字列処理2)</a><br />
</p></div>]]>
       </content>
    </entry>
    <entry>
        <title>FireMonkey + MacOSXで TWebBrowser</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=8" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=8</id>
        <published>2013-12-22T00:00:00+09:00</published>
        <updated>2013-12-23T09:12:40+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">
以前 Delphi ML に FireMonkey + MacOSX で TWebBrowser を使いたいという投稿が流れていました。
stackoverflow にあるコードで WebView を使ってみたが、画面に表示されなかったということでした。
そ...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div><p>
以前 Delphi ML に FireMonkey + MacOSX で TWebBrowser を使いたいという投稿が流れていました。<br />
stackoverflow にあるコードで WebView を使ってみたが、画面に表示されなかったということでした。<br />
そのときに提示されたURLが↓<br />
<a href="http://stackoverflow.com/questions/9731817/webview-not-displaying-in-macos-using-delphi-xe2" target="_blank">webview-not-displaying-in-macos-using-delphi-xe2</a>(stackoverflow)<br />
</p>
<p>
ようやく少し余裕ができたので、自分でも試してみることにしました。
</p>
<p>
確かにコードの通りやってもうまく行きません。<br />
そもそも view が表示されているように見えないのです。<br />
これについては addSubview が必要なのでは？と見当をつけてみました。<br />
さらに念のために setHostWindow もしてみます。<br />
ここまでは、stackoverflow のコメントにあったのと同じですね。<br />
NSView などを取得するのが XE5 では XE2 より簡単にできるようになっています。
</p>
<pre class="blogCode"><code>
   var
       view: NSView;
   begin
    ...
   view := WindowsHandleToPlatform(Self.Handle).View;
   view.addSubview(WebView);
   WebView.setHostWindow(view.window);
</code></pre>

<p>
これでとりあえず window は表示されるようになりました。<br />
問題は WebView.mainFram.loadRequest をしても、何も表示されないことです。<br />
どうもおかしいですね。loadHTMLString でもだめでした。<br />
代わりに setMainFrameURL を使ってみると、おぉ！！！うまく表示されましたよ！！！
</p>
<p>
ということは NSURLなどの作り方が問題なのでしょう。
</p>

<pre class="blogCode"><code>
  urlStr := TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSSTR(AUrl)));
  urlReq := TNSURLRequest.Wrap(TNSURLRequest.OCClass.requestWithURL(urlStr));
  view.mainFrame.loadRequest(urlReq);
</code></pre>
<p>
という具合に修正したら、うまく動くようになりました。
</p></div>]]>
       </content>
    </entry>
    <entry>
        <title>FireMonkey - OS X で URLをデフォルトブラウザで開く</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=21" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=21</id>
        <published>2013-12-15T10:40:00+09:00</published>
        <updated>2018-02-28T17:46:30+09:00</updated>
        <category term="FireMonkey" label="FireMonkey" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">OS X で URLをデフォルトブラウザで開く

アプリケーションを作るときに必ず作る About ダイアログ
About ダイアログに、ホームページのURL を記載することも多いですよね。
そして URL をク...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div><h2>OS X で URLをデフォルトブラウザで開く</h2>
<p>
アプリケーションを作るときに必ず作る About ダイアログ<br />
About ダイアログに、ホームページのURL を記載することも多いですよね。<br />
そして URL をクリックしたらホームページを開きたいものです。<br />
</p>
<img src="http://softlab.masa-lab.net/uploads/img51e79d4d9712729164d44.png" /><br />
<p>
Windows の場合は、URL を開くのに Shell API を使います。
</p>

<pre class="blogCode"><code>
uses
  Winapi.Windows, Winapi.ShellApi;

procedure ShowURL(const URL: String);
begin
  ShellExecute(0, &#039;open&#039;, PChar(URL), nil, nil, SW_SHOW);
end;
</code></pre>

<p>
では OS X ではどのようにするのでしょうか？
</p>
<h3>Objective-C でデフォルトブラウザを開く</h3>
<p>
Objective-C でデフォルトブラウザで URL を開くには以下のようにします。
</p>
<pre class="blogCode"><code>
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@&quot;http://example.com/&quot;]];
</code></pre>
<p>
from <a href="http://qa.atmarkit.co.jp/q/62" target="_blank">Mac OS XアプリからデフォルトのブラウザでURLを開きたい</a>
</p>
<h3>Delphi で書いてみよう</h3>
<p>
これを Delphi で書き直すと
</p>

<pre class="blogCode"><code>
uses
  Macapi.Foundation, Macapi.AppKit;

procedure ShowURL(const URL: String);
var
  workspace: NSWorkspace;
  AUrl: NSURL;
begin
  workspace := TNSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace);
  AUrl := TNSURL.Wrap(TNSURL.OCClass.URLWithString(NSSTR(URL)));
  workspace.openURL(AUrl);
end;
</code></pre>
<br />
<p>
ちなみに、OS X では POSIX の _system関数を使って開く方法もあるそうです。<br />
from <a href="http://d.hatena.ne.jp/nullpobug/20121020/1350676167" target="_blank">指定したURLをデフォルトのウェブブラウザで開く - 偏った言語信者の垂れ流し</a><br />
</p>
<pre class="blogCode"><code>
   _system(PAnsiChar(&#039;open http://example.org/&#039;));
</code></pre>
<p>
コードとしてはこちらの方が短くて簡単ですね。 orz...<br />
</p>

<br />
<br />
<h4>[参考サイト]</h4>
<p>
<a href="http://qa.atmarkit.co.jp/q/62" target="_blank">Mac OS XアプリからデフォルトのブラウザでURLを開きたい</a><br />
</p>
<br />
<br />
<h4>[関連記事]</h4>
<p>
<a href="http://softlab.masa-lab.net/modules/d3blog/submit.php?bid=27" target="_blank">FireMonkey - OS X でバージョン情報を取得する</a><br />
</p></div>]]>
       </content>
    </entry>
</feed>