« 2011年8月 | トップページ | 2011年10月 »

2011年9月

2011年9月28日 (水)

アルタムエンゼル再挑戦

去年の5月に2008年から育てていたアルタムを死なせてしまいましたが、今年再挑戦しています。
今回は成功するまで記事にしないでおこうと思っていましたが、どうやら大丈夫そうなので、撮りためていた写真を上げます。(このままうまくいけば前回と同じ8匹になりそう)

20110928_altum1
右上の個体はトリートメント水槽から本水槽に移動させるので現在水合わせ中。


まず、7月の初便を予約して導入したんですが、12時間以上かけて水合わせをしたにもかかわらず、到着直後から餌食いがよくなくて2週間もちこたえさすことができませんでした。アルタムは初便がいいとよく聞きますが、個人的には初便で成功したことがありません。日本到着直後2,3日で大阪まで輸送されるというのはやはり過酷なようです。

ただ、やはりあきらめきれず同じショップで再度10匹購入し、8/6に到着しました。

20110928_altum_0806_1

続きを読む "アルタムエンゼル再挑戦"

| | コメント (4) | トラックバック (0)

2011年9月20日 (火)

FireMonkey/OSX フォームのTCanvasへの直接描画(修正)

20110922 追記:案の定間違えていました。ソースコード修正しています

以前の記事でOSXとWindowsXP(もしくはDirect2Dが使えない環境)ではフォームのCanvasへの直接描画がOnPaint()以外ではできないと書きましたが、OSXについては無理やり描画することができました。
(FireMonkey HDアプリ。FireMonkey 3Dアプリでは試してませんが、コードを見る限り3Dアプリでは小細工なしに描画できそう)

ただ、副作用なども含めあまり自身が無いので詳しい方の意見が聞きたいのでソースを下記に書きます。

{$ifdef MACOS}
var
  win : NSWindow;
  view : NSView;
{$endif}
begin
{$ifdef MACOS}
 win := TNSWindow.Wrap((FmxHandleToObjC(Handle) as ILocalObject).GetObjectID);
 view := TNSView.Wrap(win.contentView);
 ContextHandle := THandle(win.graphicsContext.graphicsPort);
{$endif}
  with Canvas do
  begin
    BeginScene;
   // painting  //
    EndScene;
  end;
 {$ifdef MACOS}
  view.displayIfNeeded;
{$endif}
end;

やってるのは、Canvasへの描画の前に、フォームのContextHandleに無理やりCGContextRef を割り当て、
描画が終わったらviewに対して displayIfNeededを送っているだけです。
特にContextHandleに無理やり代入しているあたりが自信無し。

20110922 追記:元のソースではNSGraphicsContextのcurrentContextでGCを得ていましたが、懸念通り複数のフォームがある場合に正しく動作しませんでした。もっと単純にNSWindowのGCを得る方法に修正しています

| | コメント (0) | トラックバック (0)

2011年9月19日 (月)

FireMonkey/OSXでメニューの文字列を動的変更

FireMonkey/OSXのTMainMenuについて。

OSX上でTMainMenuを操作する場合、VCLでやってきたように、動的に文字列を書いたり動的にメニューを追加したりすることができません。
(動的にメニュー追加は一応可能ですが、MainMenuに追加する前にすべてのサブメニューを構築しておく必要があるようです)

今まで作ってきたアプリでは、起動後にメニュー文字列を書き換えて日本語モードにしたり英語モードにしたりしてきていたので、FireMonkeyアプリでも同じようにメニュー操作したいと思い調べてみました。

下記がメニューのテキストを変更(TMenuItem.Textの内容を反映する)するサンプルコード。
ひょっとしたらLionでは動かないかもしれません。snowleopardで動作確認しました。

{$ifdef MACOS}
type
  TDummyOCLocal = class(TOCLocal)
    property Super;
  end;
procedure UpdateMenuText(menuitem : TMenuItem);
var
  nsmnuitem: NSMenuItem;
  nsobj : TDummyOCLocal;
begin
  if menuitem.Handle <> 0 then
  begin
    if not (menuitem.Parent is TMainMenu) then
    begin
      nsobj := TDummyOCLocal(TOCLocal(FmxHandleToObjC(menuitem.Handle)));
      nsmnuitem := NSMenuItem(nsobj.Super);
      nsmnuitem.setTitle(NSSTR(menuitem.Text));
    end else begin
      nsmnuitem := NSMenuItem(FmxHandleToObjC(menuitem.Handle));
      nsmnuitem.setTitle(NSSTR(menuitem.Text));
    end;
  end;
end;
{$endif}

| | コメント (0) | トラックバック (0)

2011年9月12日 (月)

Delphi XE2のTCanvas

XE2関連でもう一つ投稿。
FireMonkeyがらみで遊んでいて、最初に躓いたのがTCanvasの扱いです。
とにかく、従来の使い方とは全く違う動きをするので、最初は誰しも戸惑うのでは?

続きを読む "Delphi XE2のTCanvas"

| | コメント (0) | トラックバック (0)

Delphi XE2でOpenGL

9/1にRAD Studio XE2が届いて遊んでいます。元々は64bit化が気になってたんですが、FireMonkeyというクロスプラットフォーム向けのライブラリが面白くて、まず最初はこっちから手を付けています。

FireMonekyはまだバグがあり、いきなり実用アプリを作るのはおすすめしませんが、今から遊んでいればそのうちWindowsとMacOSX向けに簡単にアプリケーションが作れるようになるのではと期待してます。(iOS向けも作れますが、UIの違いが大きいのでどこまで実用的になるかは未知数)

FireMonkeyはもともとDelphi向けのDirectX用のシーングラフライブラリが元になっているらしくて3D機能が豊富です。しかし、個人的にはお仕着せのシーングラフライブラリを使うよりもDirectXなりOpenGLを生の状態で使いたいので、ちょっとサンプルを作ってみました。

続きでグダグダ説明を書きますが、サンプルソースを書いたので基本的にはこれを読んでもらえればOKです。
Download:SimpleSampleOpenGL_FMX.pas

<実行イメージ>
20110912_simplesampleopengl

続きを読む "Delphi XE2でOpenGL"

| | コメント (1) | トラックバック (0)

« 2011年8月 | トップページ | 2011年10月 »