Top > OOobbs3 > 66

OOobbs3/66 Edit

  • サマリ: マウスクリックハンドラに関して
  • 環境: Basic
  • 状態: 解決
  • 投稿者: YON?
  • 投稿日: 2011-09-12 (月) 14:58:22

質問 Edit

いつもお世話になっています。

OOobbs3/65と重複しているのですがよろしくお願いします。

現在CALCのシートに複数のプッシュボタンを配置して、マクロの処理を行っているのですが、 マウスを左クリックした際に、プッシュボタンの上であれば、マクロを実行するみたいなことは可能でしょうか?

例えば、マウスクリックハンドラでクリックした座標を取得し、その座標位置がプッシュボタンの配置している座標内であれば、ボタンに該当するマクロを実行…といった感じです。

プッシュボタンにイベントを割り当てれば早いのですが、上記の方法で実現できればと思い質問しました。

わかる方がいらっしゃればお願いします。

回答 Edit

  • ハンドラを register するためにはイベントまたは手動でのマクロの実行が必要です。その機会があるのであればボタンにマクロをコードで割り当てることも出来ます。マクロを割り当てたボタンのあるドキュメントを頻繁に作成する必要があるならテンプレートを利用するべきです。 ハンドラからのコールバックの位置からドキュメント上位置に変換するには、ドキュメントのフレームから ComponentWindow を取得、getWindows メソッドでコンポーネント内に含まれるウィンドウを取得します。そのうちのシートのセルが表示されている部分探し出し、そのウィンドウ内に表示されているセル範囲アドレスと比較することでウィンドウ上の座標とドキュメント内の座標の相関が決まります。
    • はにゃ? 2011-09-12 (月) 20:34:33
  • 回答ありがとうございます。ちょっと難しそうですが試してみます。 -- YON 2011-09-12 (月) 21:10:22
  • ちょっと気が向いたのでマウスのクリックハンドラでクリックされた位置をドキュメントの座標に無理やり変換してみました。pixel 単位で正しく変換できているようです。まぁ、accessibility API でドキュメント部分のウィンドウのサイズを取得していますが・・・。 -- はにゃ? 2011-09-17 (土) 22:04:48
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
# python
    def _find_ac_child(self, ac, role):
        """ find specific accessible child by its role. """
        a = None
        for i in range(ac.getAccessibleChildCount()):
            if ac.getAccessibleChild(i).\
                getAccessibleContext().getAccessibleRole() == role:
                a = ac.getAccessibleChild(i)
                break
        return a
    
    def _get_document_area_size(self, comp_win):
        """ get document area, role 40. """
        wins = comp_win.getWindows()
        for win in wins:
            if win.getAccessibleContext().getAccessibleRole() == 40: # panel
                ac = win.getAccessibleContext()
                ac2 = ac.getAccessibleChild(0).getAccessibleContext()
                doc_ac = self._find_ac_child(ac2, 13) # document
                if doc_ac:
                    return doc_ac.getSize()
                break
    
    def mouseReleased(self, ev):
        try:
            controller = self.doc.getCurrentController()
            comp_win = controller.getFrame().getComponentWindow()
            
            # size of the document area
            doc_size = self._get_document_area_size(comp_win)
            # maybe error
            if doc_size is None:
                return False
            
            comp_width = doc_size.Width
            comp_height = doc_size.Height
            # visible area size in document coordinate
            vis_rect = controller.VisibleArea # shown size of area
            view_width = vis_rect.Width
            view_height = vis_rect.Height
            
            fw = view_width / float(comp_width)
            fh = view_height / float(comp_height)
            
            print(ev.X, 2259, ev.X * fw)
        except Exception as e:
            print(e)
        #if ev.Buttons == MB_LEFT:
        #    threading.Thread(target=self._show_popup).start()
        return False

感想,コメント,メモ Edit



Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes