Thread Rating:
  • 672 Vote(s) - 2.76 Average
  • 1
  • 2
  • 3
  • 4
  • 5
afterマクロの使用方法について
08-10-2011, 09:06 PM,
#8
RE: afterマクロの使用方法について
(08-10-2011, 10:38 AM)復活の帝王 Wrote: この手の「イベントを操作する」という概念は"はまった"経験しかなく、可読性が落ちる原因と自分は思っています。
私個人は他言語で通常のローカルアプリ(EXE、DLL)を作成してきて、{after 0s do}の様な概念は使用せず構築してきたので
逆に「こういうときは結果的に使わざるを得ない」という例があればうれしいのですが・・・。

確かにむやみな使用は避けるべきと思います。

妥当な例はすぐにたくさん思いつきませんが、例えばグラフィカルオブジェクトの大きさを表示時に取得したい場合など。
表示上のサイズはオブジェクトがグラフィカル階層にアタッチされた後、レイアウトネゴシエーションが完了するまで確定しないので、サイズの取得はそれを待ってから行う必要があります。

Code:
{on AttachEvent at g:Graphic do
    {after 0s do
        {do-something {g.layout.get-bounds}}
    }
}


もうひとつの例は、例えば
「DateField の入力値を Delete キーで削除できるようにしたい」(※)
といった要望があった場合に、after を使って以下のように実現することがあります。
※CurlのDateFieldはフォーカスアウト時に未入力だと値を元に戻してくれるのでDeleteで削除できない。。

Code:
{define-class public MyDateField {inherits DateField}  
  {constructor public {default ...}
    {construct-super {splice ...}}
  }
  
  {method public {get-parsed-value
                     val:String,
                     require-four-digit-year?:bool = false
                 }:(date:DateTime,
                    day-start-pos:int, day-end-pos:int,
                    month-start-pos:int, month-end-pos:int,
                    year-start-pos:int, year-end-pos:int)
    {if {val.trim-clone}.empty? then
        {after 0s do
            {self.unset-value}
        }
    }
    {return
        {super.get-parsed-value
            val,
            require-four-digit-year? = require-four-digit-year?
        }
    }
  }
}

これは、DateField の入力欄の「生の」値を見るために get-parsed-value というメソッドをオーバーライドして文字列が削除されたかどうか判断している例ですが、
このメソッド内で unset-value しても後続の処理で値が復活してしまいます。そのためここで after を用いて一連の処理が終わった後に unset-value が実行されるようにしています。

このように、組み込みAPIの動作など手を出せない部分に依存したり、それらの結果を覆したいような場合に after が使える場合があります。
基本的にはほとんどハック的な目的で使うものだと思います。


Messages In This Thread
RE: afterマクロの使用方法について - by fukuta - 08-10-2011, 09:06 PM
Forum Jump:


Users browsing this thread:
3 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('166')