しらたまのコミッタ日記

2007-04-14

[][]GUI部品の見直し 21:54

GUI部品をウィンドウ部品とグラフィック部品に分けました。

これで注目したらエラーが出たとかいうのが無くなると思います。

それから、無効なイベントをいくつか削除しました。

具体的にはバーのマウスイベントと、プログレスバーのキーイベントですが。

まだまだ無効なイベントがありそうです。

怪しいのは、ドロップイベントマウスホイールイベント。かなり、大がかりな修正が必要な気がします。

あとは画像合成がgifイメージを使った時に動かなかった問題を修正しました。

 

それにしても、3~4時間やっててこのくらいしか処理できないとは。

VCLってややこしいですよね……

MaryamMaryam2012/06/27 19:58It's good to get a fresh way of lokonig at it.

lzzbsolzzbso2012/06/28 13:12pkceWr <a href="http://ecwuxkhlncyz.com/">ecwuxkhlncyz</a>

uznpppmuznpppm2012/06/28 18:26Flfy44 , [url=http://lxdljqjlzmuw.com/]lxdljqjlzmuw[/url], [link=http://btaseaugulpv.com/]btaseaugulpv[/link], http://thukhbgtimex.com/

bjjiwftxtnrbjjiwftxtnr2012/06/29 07:518XFVlw <a href="http://clvnbvbgjdfx.com/">clvnbvbgjdfx</a>

aghmgnlaghmgnl2012/07/01 05:01F2Ctqw , [url=http://vpueduatndcz.com/]vpueduatndcz[/url], [link=http://hjcnzovfenws.com/]hjcnzovfenws[/link], http://geahflsyshyk.com/

2007-04-12

[]「変数エイリアス作成」で不正なポインタ処理 21:37

Ver.1.4015aの頃から発生していたバグの模様。

その頃のソースの差分とかを見てもよくわからなかったので、デバッガでちまちま追いかけてみました。

すると、どうもスタックに積んだ参照渡しした引数を消すときに、消しすぎている気配が濃厚です。

例えば以下のコード

Aとは整数

Bとは整数

AをBに変数エイリアス作成

スタックに積まれた状態だと、Stack[0]->AとStack[1]->B*1となるのですが、命令実行後、つまりスタックを消す直前にはB->Aとなっているので、Stack[0]->AとStack[1]->B->Aとなるわけです。

そして解放処理、hi_var_free関数変数解放するのですが、この中でリンク型はhi_getLink関数でもって参照先を確認し、参照カウントを減らします。ここで参照カウンタが負数になれば参照先を解放します。

で、hi_getLink関数なんですが、この関数リンク型が指す変数リンクだった場合は、そのリンクに対してhi_getLink関数を実行します。

つまりhi_getLink関数再帰的に呼び出されます。

これにより、hi_getLink関数一回の呼び出しで確実に値を取得できるのですが、単純にひとつ先だけ取得したいだけの時は困ります。

今回のケースが困るときです。

Stack[1]->B->Aにおいて、Stack[1]を解放しようとすると、hi_getLink関数に従ってAが取得され、参照カウンタが減らされます。

この結果、B->Aと参照があるにもかかわらず、Aは参照カウンタが実際の参照の数を下回ってしまいます。

このため、終了時に変数解放するとき、Aを解放しようとすると、本来は参照カウンタが1以上で、参照カウンタが減らされるだけのはずなのに、Aが解放されてしまうため、Bを解放しようとするときに、その(すでに解放されている)参照先も解放しようとしてエラーが出ます。

たまにエラーが出ないときがあるのは、解放された領域が不定なためです。

 

で、解決案なのですが、これがいい方法を思いつけません。

スタック変数を消すときだけ、hi_getLink関数を使わないようにすればいいのでしょうが、スタックは汎用のTHiArrayクラスで処理しているので、解放処理をいじるとこれを使っている処理全部に影響が出てしまいます。

プロパティにforStackとか増やせばいいのかもしれませんが、なんか不格好なような気も……

まあ他に方法が思いつかなければ、これで行かなければしょうがないんですが。

*1:->はリンク(エイリアス)を表します

FrankieFrankie2012/06/28 02:00More posts of this quaitly. Not the usual c***, please

rtpessgetrtpessget2012/06/28 13:40WZNNO9 <a href="http://tqbiobbimnpy.com/">tqbiobbimnpy</a>

larxcdqjpaelarxcdqjpae2012/06/29 14:53d72C9p , [url=http://ymcluirlkumx.com/]ymcluirlkumx[/url], [link=http://xniccmqghycj.com/]xniccmqghycj[/link], http://dmitljqlhnvi.com/

xwdriczkxwdriczk2012/07/01 00:33rrXxdX <a href="http://rlhstuzhogsx.com/">rlhstuzhogsx</a>

awezgwawezgw2012/07/01 05:29CtrnXh , [url=http://hapgyydkbbgv.com/]hapgyydkbbgv[/url], [link=http://oqgssvftuusp.com/]oqgssvftuusp[/link], http://owpqqjissnxd.com/

2007-04-06

[]イベント処理で楽をする 21:31

似たような処理のイベントがたくさんあるときは、関数化してしまうと少し楽です。

部品1とはエディタ

そのキー押した時は~

 自身から部品2にエディタ切り替え

部品2とはエディタ

そのキー押した時は~

 自身から部品3にエディタ切り替え

部品3とはエディタ

そのキー押した時は~

 自身から部品1にエディタ切り替え

部品1に注目。

エディタ切り替え({エディタ}元を{=13}キーで{エディタ}先に|元から先へ)

 もし元→押された仮想キー=キーならば

  元→押された仮想キー=0

  先→注目

これでもまだ面倒と言うときは、新しくGUI部品を作っちゃいましょう。

切り替えエディタリストとは配列

切り替えエディタリストは空

■切り替えエディタエディタ

 ・{非公開}リスト番号

 ・キー押した時~

  もし自身→押された仮想キー=13ならば

   自身→押された仮想キー=0

   もし(リスト番号+1)>=(切り替えエディタリスト配列素数)ならば

    切り替えエディタリスト[0]→注目

   違えば

    切り替えエディタリスト[リスト番号+1]→注目

 ・作る~

  オブジェクトは、VCL_CREATE(自身, 名前, VCL_GUI_EDIT)

  リスト番号は切り替えエディタリスト配列素数

  切り替えエディタリスト[リスト番号]に自身をグループ参照コピー

部品1とは切り替えエディタ

部品2とは切り替えエディタ

部品3とは切り替えエディタ

部品1に注目。

本当は、初心者掲示板レスしてきた方がいいんですが、初心者の方にわかるように、かみ砕いてかつ詳しく説明するのは難しいですからねぇ。

動作の仕組みがわからないまま使ってもらっても困りますし。

2007-04-05

[]1.5003 22:35

なでしこ更新されました。

私のコミット内容も、当然いろいろ確認はしていますが、十分量のテストができないまま、リリースされちゃいました。

……うーん、妙な不具合が出ないことを祈ります。

それにしても、いろいろコミットした割には履歴に書いてあることが少ないですね。

……ちょっと書き足しておきましょう。

200612
200701020304050708101112
20080103040506070912
200904
20100204
201104