ツリー一括表示

Nomal グループにイメージ /悩み者 (13/06/13(Thu) 15:51) [#6292]
Nomal Re[1]: グループにイメージ /うぇいく (13/06/13(Thu) 16:26) [#6293]
  └Nomal Re[2]: グループにイメージ /悩み者 (13/06/13(Thu) 18:13) [#6294]
    └Nomal Re[3]: グループにイメージ /うぇいく (13/06/13(Thu) 21:38) [#6295]
      └Nomal Re[4]: グループにイメージ /悩み者 (13/06/13(Thu) 23:01) [#6296] 解決済み!


親記事 / ▼[ 6293 ]
/ 親階層)  グループにイメージ
□投稿者/ 悩み者 【115.65.140.6】(2013/06/13(Thu) 15:51:17)

    最近なでしこを使い始めた者です。
    グループというものが使えるということで
    参考になりそうなものを漁りながら以下のようなプログラムを書いてみました
    画像をマウスでドラッグして移動できるようにした(つもりの)ものです。
    マニュアルではグループの中にグループを入れられるとありましたので、
    メンバに「イメージ」を入れてみたのですが、うまく動きません。
    グループの中にイメージを入れるいい方法があるのでしょうか。
    皆様のお知恵を拝借したく書き込んだ次第です。
    アドバイスお願いします。

    #ここから
    ■フォーム枠とは +フォーム
      ・{非公開}PosX
      ・{非公開}PosY
      ・{非公開}OldX
      ・{非公開}OldY
      ・Push{=0}
      ・NewX{=0}
      ・NewY{=0}
      ・{イメージ}OBJ
      ・副画像作成({文字列=?}V)〜
        OBJ→可視=0
        OBJを画面クリア
        OBJ→画像=V
        主反映処理
      ・主反映処理〜
        自身を画面クリア
        OBJのNewX,NewY,自身→幅,自身→高さを自身の0,0へ画像部分コピー
      ・位置取得〜
        Push=1
        PosX=マウスX
        PosY=マウスY
        OldX=NewX
        OldY=NewY
      ・位置移動〜
        もし(Push=0)ならば、戻る
        もし(自身→幅<OBJ→幅)ならば、
          NewX=OldX+(PosX-マウスX)
          もし(NewX<0)ならば、NewX=0
          もし(NewX>OBJ→幅-自身→幅)ならば、NewX=OBJ→幅-自身→幅
        もし(自身→高さ<OBJ→高さ)ならば、
          NewY=OldY+(PosY-マウスY)
          もし(NewY<0)ならば、NewY=0
          もし(NewY>OBJ→高さ-自身→高さ)ならば、NewY=OBJ→高さ-自身→高さ
        Push=2
        主反映処理
      ・位置開放〜
        Push=0
      ・位置初期化〜
        NewX=0
        NewY=0
      ・ホイール移動〜
        もし(自身→高さ<OBJ→高さ)ならば、
          ホイール幅とは整数=((OBJ→高さ-自身→高さ)/10)の整数部分
          NewY=NewY+
            ((ホイール値<0)-(ホイール値>0))*ホイール幅
          もし(NewY<0)ならば、NewY=0
          もし(NewY>OBJ→高さ-自身→高さ)ならば、NewY=OBJ→高さ-自身→高さ
        主反映処理
      ・マウス押した時は〜
        位置取得
      ・マウス移動した時は〜
        位置移動
      ・マウス離した時は〜
        位置開放
      ・マウスホイール回した時は〜
        ホイール移動

    イメージ枠とはフォーム枠
    これについて
      親部品=母艦
      スタイル=「枠なし」
      レイアウト=「全体」
      副画像作成(「{ランタイムパス}lib\kujira.png」)
      注目
      表示
    #ここまで

[ □ Tree ] 返信 削除キー/
[ □ Tree ] 返信

▲[ 6292 ] / ▼[ 6294 ]
/ 1階層)  Re[1]: グループにイメージ
□投稿者/ うぇいく 【210.160.252.168】(2013/06/13(Thu) 16:26:40)

    こんにちは。
    宣言部分の
      ・{イメージ}OBJ
    を、
      ・{イメージ=0}OBJ
    に変更(OBJの内容を後で生成するようにする)し、作成部部の、
    ----
      ・副画像作成({文字列=?}V)〜
        OBJ→可視=0
    ----
    を、
    ----
      ・副画像作成({文字列=?}V)〜
        OBJをイメージとして作成
        OBJ→可視=0
    ----
    とすると、エラーは出なくなりますね。
    グループのメンバーとしてグループを使う場合で、そのグループがGUI部品の場合は、作成時に初期化などがあるため動的に生成する必要があるのだと思います。そのため、まず、「・{イメージ=0}」のような形で中身を持たないようにしておいて、後から、「イメージとして生成」するとうまくゆくのではないかと推測します。

     最後に、「として作成」を使って動的に生成するようにしたため、、どこかで破棄する(壊す)必要がありますので、不要になったタイミングでOBJを壊してください。
[ 親 6292 / □ Tree ] 返信 削除キー/
[ 親 6292 / □ Tree ] 返信

▲[ 6293 ] / ▼[ 6295 ]
/ 2階層)  Re[2]: グループにイメージ
□投稿者/ 悩み者 【115.65.140.6】(2013/06/13(Thu) 18:13:45)

    こんなに早く返事が来るとは思わず驚きました。
    仰るとおりにしたところ、うまく動きました。ありがとうございます。
    ところで画像のところは、今はサンプルですが、いろいろ入れ替えたいと思っています
    そうすると、副画像作成()は何度も呼び出されることになります。
    動的作成部分が何度も呼ばれることになり、
    問題はないと思いますが、少し生理的に嫌ですので、作る〜に入れたいと思いました
    これなら、生成されたときに一度だけ作られることになると思ったからです。
    で以下のように少し書き換えたのですが、やはりエラーが出てしまいます。
    作る〜の中で動的に作成するのは間違いなのでしょうか。
    よきアドバイスをお願いします。


    #ここから
    ■フォーム枠とは +フォーム
      ・{非公開}PosX
      ・{非公開}PosY
      ・{非公開}OldX
      ・{非公開}OldY
      ・Push{=0}
      ・NewX{=0}
      ・NewY{=0}
      ・{イメージ=0}OBJ
      ・副画像作成({文字列=?}V)〜
        OBJ→画像=V
        位置初期化#入れ忘れてました
        主反映処理
      ・主反映処理〜
        自身を画面クリア
        OBJのNewX,NewY,自身→幅,自身→高さを自身の0,0へ画像部分コピー
      ・位置取得〜
        Push=1
        PosX=マウスX
        PosY=マウスY
        OldX=NewX
        OldY=NewY
      ・位置移動〜
        もし(Push=0)ならば、戻る
        もし(自身→幅<OBJ→幅)ならば、
          NewX=OldX+(PosX-マウスX)
          もし(NewX<0)ならば、NewX=0
          もし(NewX>OBJ→幅-自身→幅)ならば、NewX=OBJ→幅-自身→幅
        もし(自身→高さ<OBJ→高さ)ならば、
          NewY=OldY+(PosY-マウスY)
          もし(NewY<0)ならば、NewY=0
          もし(NewY>OBJ→高さ-自身→高さ)ならば、NewY=OBJ→高さ-自身→高さ
        Push=2
        主反映処理
      ・位置開放〜
        Push=0
      ・位置初期化〜
        NewX=0
        NewY=0
      ・ホイール移動〜
        もし(自身→高さ<OBJ→高さ)ならば、
          ホイール幅とは整数=((OBJ→高さ-自身→高さ)/10)の整数部分
          NewY=NewY+
            ((ホイール値<0)-(ホイール値>0))*ホイール幅
          もし(NewY<0)ならば、NewY=0
          もし(NewY>OBJ→高さ-自身→高さ)ならば、NewY=OBJ→高さ-自身→高さ
        主反映処理
      ・マウス押した時は〜
        位置取得
      ・マウス移動した時は〜
        位置移動
      ・マウス離した時は〜
        位置開放
      ・マウスホイール回した時は〜
        ホイール移動
      ・作る〜
        OBJをイメージとして作成
        OBJ→可視=0
        OBJを画面クリア

    イメージ枠とはフォーム枠
    これについて
      親部品=母艦
      スタイル=「枠なし」
      レイアウト=「全体」
      副画像作成(「{ランタイムパス}lib\kujira.png」)
      注目
      表示

[ 親 6292 / □ Tree ] 返信 削除キー/
[ 親 6292 / □ Tree ] 返信

▲[ 6294 ] / ▼[ 6296 ]
/ 3階層)  Re[3]: グループにイメージ
□投稿者/ うぇいく 【220.147.194.203】(2013/06/13(Thu) 21:38:58)

http://weyk.la.coocan.jp/weyk/nadesiko/
    こんばんは。
     考え方は間違えていないと思います。生成と破棄を繰り返すのはたいていの場合、無駄ですし、途中で入れ替えたりする必要が無いものであれば、コンストラクタ(作る)で作成して、デストラクタもどき(壊す)で解放するというのが標準的な方法だと思います。

    もともと、「フォーム枠」グループは、フォーム部品を引きついで作成しています。そのため、フォームとしての初期化の処理として「作る」が存在(引き継がれて)します。
    フォーム枠グループとして「作る」を再度定義してしまったために、フォームとしての初期化が行われなくなってしまったのが原因だと思われます。

    肝心な解決方法なのですが・・・どうも、良い方法はなさそうです。フォームの時にあった作るを呼び出せればよいのですが、ざっと探したところでは方法がわかりませんでした。
    vnako.nakoのファイルから、フォーム部品の内容を参照してコピー&ペーストで持ってくれば動くのですが、グループの継承もどきの仕組みに反しているような気がします(内容をしらなくてよいはずのフォーム部品の実装の変更に追従して修正する必要が出てきてしまう)。
    ------
      ・作る〜
        オブジェクトは、VCL_CREATE(自身, 名前, VCL_GUI_FORM)
        OBJをイメージとして作成
        OBJ→可視=0
        OBJを画面クリア
    -----
    とすると動くのですが、オブジェクトは・・の行は、もし、vnako.nakoで変更があったら、追従しないとまずいことになってしまいます。
    あとは、動作する際に起動されるイベントを利用して遅延して作成するかなのですが、2度呼ばれても困りますし、参照される前に呼び出してもらえなくても困るため、やはり、「作る」に記載するのがよさそうです。
[ 親 6292 / □ Tree ] 返信 削除キー/
[ 親 6292 / □ Tree ] 返信

▲[ 6295 ] / 返信無し
/ 4階層)  Re[4]: グループにイメージ
□投稿者/ 悩み者 【115.65.140.6】(2013/06/13(Thu) 23:01:21)

    早速の回答ありがとうございました。
    ちゃんと動くことを確認しました。
    最近のもやもやが晴れてすっきりしました。

    これにて解決とさせていただきます。本当にありがとうございました。
解決済み!
[ 親 6292 / □ Tree ] 返信 削除キー/
[ 親 6292 / □ Tree ] 返信


Pass/

BBS CGI RSS CGI
Child Tree RSS/SPAM対応版