« とりあえず完成 | メイン | コマンド表示部を追加 »

2005年01月23日

キリカ・グライト開発日誌:: Frameとのデータの受け渡し

    

パラメータを設定する箇所はFrameを使用しているが、そのFrameとのデータの受け渡しに初めは多重継承によって実現しようと考えていた。
そのFrameを切り替える元となるフォームは、各Frameを保持している。
そして、そのFrameのメソッドを介してデータを渡すようにしようとしていた。
そのため、単純に多重継承したのでは、そのインターフェイスとなるクラスのポインタも保持しなければならなくなる。
それを回避するために、Frame の派生クラスではなく、その親となるクラスで多重継承することにした。
次のような感じ。
class ITagProp
class TPropFrame : public TFrame, public ITagProp
class TUserFrame : TPropFrame
こうすれば、TPropFrame を保持しておくだけで良い。
これでメイクも通りうまくいったかと思ったが、Frameのレイアウトなどを変更しようとしたら問題が発生した。
プロパティが取得できないとかなんとかエラーが出てしまった。
それでも、そのまま無視を選択したらフォームが表示されたのだが、メイクして動かそうとしたらエクセプション。
どうやら、この方法ではダメのようだ。
そこで、Tagプロパティを使って受け渡しをしようと思ったが、FrameにはOnShowなどがないので、Tagプロパティに値を設定しても、それを拾うタイミングがわからない。
良いメソッドがないかヘルプのTFrameを見る。
Dispatch!
そうだ、普通にメッセージでやり取りすればいい。
Frameの切り替えを行う際、Dispatchをコールすることにした。
そして、独自のメッセージを作り、各Frameで受ける。
この方法でうまくいくかどうか実装してみた。
いい感じだ。
初めからこうするべきだったな。
なお、実際のDispatch 部分は、次のようにマクロで定義するようにした。

void __fastcall SetElement( TElementMessage &mes );
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SET_ELEMENT,TElementMessage, SetElement);
END_MESSAGE_MAP(TFrame);



投稿者 Takenori : 2005年01月23日 02:30




comments powered by Disqus
Total : Today : Yesterday : なかのひと