ソフトな忘却力(44) Smalltalk、Pharo、インスタンスのdelete

Joseph Halfmoon

前回、起動したLOGameのインスタンスを消去する方法が分からんとお惚け老人は途方にくれました。しかし sumim様からのご返信で消去の方法をお教えいただきました。大変ありがとうございます。消去成功であります。その実験過程で出現した「想定外のもの」も、同じ方法で消去できました。お惚け老人感激であります。

※「 ソフトな忘却力」投稿順 Index はこちら

※今回の動作確認は、Windows11上のWSL2の上のUbuntu24.04LTS上のPharo 10.0.0を使用しています。

全てがオブジェクトな純粋オブジェクト・オリエンテッドにして、かのSmalltalkの法灯を継ぐモダーンな処理系Pharo様に熱狂している年寄です。しかし前回はチュートリアル的文書記載のグラフィックを使ったミニゲーム的なもの、入力して動作OKだったのは良いものの、「ゲームの消し方」が分からんというお粗末。しかし sumim様のお教えにより解決であります。

インスペクタでインスタンスを見つけられればdeleteできた

前回、ゲームのインスタンスを作ったのですが、そのインスタンスを作るときに変数などに格納していなかったので、どこかの虚空に(メモリに)インスタンスは存在するものの、そいつはどこにいるのだろ~と途方にくれたのでした。しかしメニューからはゲームLOGameのインスタンスが5個も画面上にあると報告されており、Pharo様の内部のどこかの台帳にはそいつらが記載されとるようです。さて、お教えいただいた方法のうち、成功した方法は以下の2つです。最初が、

World submorphs inspect

もう一つが

LOGame allInstances inspect

です。どちらもインスペクタのウインドウを開きます。上は画面上のsubbmorphs全てを列挙、下はLOGameクラスのインスタンスを列挙です。

上を実施した画面が以下に。WorldSubmorphsInspect

下を実施した画面が以下に。allInstancesInspect

下の方が「消滅させたい」ものどものみを列挙させとります。

そして delete する段で、Pharo素人老人はまたもや引っかかりました。LOGameのインスタンスらしきものを選択して self deleteと入力したらエラー。そのときのインスペクタの画面は下のようです。InspectFocus

入力可能なペインが左右にあるのをよくかんがえもせず、左ペインで self deleteとしたら以下のようなエラーになりました。LeftPainError

よく見たらなんのことはありません。左ペインは インスペクタが列挙している6個のitemのArrayであり、右ペインこそ「選択した」LOGameなのでした。インスペクタ画面に引いた赤線、よく見とけよ、自分。

選択されたLOGameの右ペインの方で self deleteとしてみたら画面上の盤面のインスタンスが消えました。やったね。全部で5個もあったインスタンスが消えたのによろこんだ一枚が以下に。allGamesDeleted

 

メタ・クリック、2回目うまくいかないのは何故?

実は、sumim様にお教えいただいたインスタンスを「追及」する方法の最初で

メタ・クリックを連打

という方法をお教えいただいておりました。1行も書かずに消せるっとやってみたのですが、LOGameでは上手く行かなかったです。その原因を考えてみました。

まず当方環境(Windows11上のWSL2上のUbuntu24.04LTS上のPharo10)でのメタクリックは、 ALT+SHIFT+左クリックです。前回、LOGameにメタクリックを適用しようとすると、ゲームの盤面に10x10個並んでいるLOCellのインスタンスがまずメタクリックに反応してました。個別にLOCell1個は消滅させられるものの、肝心のLOGameのインスタンスは存在しつづけたのでした。

今回、メタクリックのつもりでクリック連打したのですが、LOCellはメタクリックに反応するのにLOGameは無反応でした。まずはLOCellとLOGameのオーナー関係を調べてみました。owner

上のように100個ならんでいるLOCellのうち1個のownerを調べたら LOGameでした。大家はLOGameっだというのは間違いない。

しかし、ALT+SHIFT+左クリックの反応の様子を見ていると、

    • LOGameの盤面にフォーカスがあたっていないところからメタクリックすると盤面を構成する10x10のLOCellの一つが反応する
    • しかし、2回目以降メタクリックしてもメタクリックにならず、LOGame側がゲームのルール通りに反応して表示が反転する

どうも、1回目のクリックでLOGameにフォーカスが当たった後は、LOGame側でマウスイベントを捕捉して処理するようになっているみたい。メタクリックではなくゲームのオペレーションになってしまっている?トホホ。。。

理由は分かった(ホントか?)気がしたのですが、盤面を激しく高速にクリック連打しつづけたためか、妙なものが現れました。こんな感じ。noXmenu

左クリックで現れるWorldメニューなのですが、メニューを閉じるためのx印がないものです。何をしたのだ自分?

しかし、インスペクタを使ってインスタンスを「滅する」技?はおぼえた老人です。まずは、インスペクタで上のメニューを確認。InspectNoX

どうも2番目の a MenuMorphが「消すべきやつ」みたいだね。まちがえずに右ペインで self deletenoXdelete

問題メニューが消えました。

少しインスペクタに自信をつけてしまった?調子に乗るなよ、自分。

ソフトな忘却力(43) Smalltalk、Pharo、Lights Outゲームが消えん? へ戻る

Pharoといっしょ(1) Morph再び、GUIの呼び出しで戸惑うのよ。へ進む

ソフトな忘却力(45) FreeDOS、その伝統はMS-DOS超え、進化も続くOS へ進む