複数のテキストボックスを同期したい(WPF + Rx編)

2015/07/19追記: もっといい方法をこちらに公開しています。

本日のテーマ

  • 1つのウィンドウの中に複数のテキストボックスが配置されたWPFアプリを考える
  • テキストボックスのどれかを変更すると、他のテキストボックスにもすべて同じ変更が適用されるようにしたい

下図は、本日のサンプル画面です。一番上のテキストボックスを変更すると、下2つのテキストボックスの内容が自動的に変化します(左)。また、2番目のテキストボックスを変更したときは、上下のテキストボックスが変化します(右)。

f:id:tercel_s:20150718220256p:plain:w270 f:id:tercel_s:20150718220304p:plain:w270

なぜこんな要望が出たかは知らない。しかし世の中には知らない方が幸せなこともあるので (゚ε゚)キニシナイ!!

背景

初めに断わっておくと、今回のテーマはどちらかというと画面設計のアンチパターンに近いです。そのため、おそらく使いどころはほぼ無いのではと思っています。

以前、下図のようなタブベースの画面を作らされ っていたことがありました。

f:id:tercel_s:20150718224243p:plain:w270 f:id:tercel_s:20150718224252p:plain:w270

どのタブページの上部にもテキストボックスが配置されており、入力内容に基づいて様々な情報をタブページ内に表示する仕組みでした。

で、どういう話の行きがかりだったか、「各タブページの上部にあるテキストボックスを同期してくれたまえ」と言われてしまいました。

さて、今の僕ならどう実装するだろう。

2015/07/19追記: この記事に記載した方法よりもいい方法をこちらに公開しています。

続きを読む

Windowsコントロールのイベントを一時的に無効化したい (Windowsフォーム編)

本日のテーマ

  • 起動時に、画面の各コントロールに初期値が設定されるアプリについて考える
  • 初期値を設定している間だけ、コントロールのイベントを無効にしたい

要するに、TextChangedを一時的に黙らせたい。

背景

かつて、僕が某システムを開発していたとき、「アプリケーション画面の起動が遅い」という問題に直面したことがありました。

原因の一つは、画面のコントロールに初期値*1を設定する際、不要なイベントが一斉に走るせいでパフォーマンスが悪化していたためでした。

すぐさま、不要なイベントを一時的に無効化する処置がとられました。

さて、イベントの一時無効化は開発現場のあるあるパターンですが、力技の汚い実装でコードをとっ散らかす開発メンバが多いと感じたので、とりあえずここに僕がよく使う方法を書き残しておくことにします。

*1:前画面から引き継いだ情報など。

続きを読む

夢十夜

こんな夢を見た

続きを読む

僕は英語難民だった(←現在完了形・継続用法)

英語と仲直りがしたい

そういう思いに至る出来事がいろいろあったのですが、かいつまんで言うと、

  • @sx_7くんと出かけたとき、彼が外国人相手に流暢な英語を話しているのを聞いたり
  • @pi_cro_sさんと出かけたとき、日常会話くらいなら不自由を感じない程度の語学力があるという話を聞いたり

……した結果、友達だと思っていた2人がなんか急に遠く感じられるようになりました

なにを隠そう、僕は英語難民です

なにこの劣等感。

f:id:tercel_s:20150510014609p:plain:w300
(『だめっこどうぶつ 2―桑田着ぐるみ劇場 (バンブー・コミックス)』p.67)

とりあえず前置きはこのくらいにして本題いきます。

今日やること

  • 英語の5文型を思い出す

5文型というのは、あの S とか V とか O とか C とかが出てくるあれです。

  1. 第一文型 (SV)
  2. 第二文型 (SVC)
  3. 第三文型 (SVO)
  4. 第四文型 (SVOO)
  5. 第五文型 (SVOC)

どんなに複雑な英文でも、だいたいどれかに当てはまりますよ、という「型」みたいなものなので、まずはこれをやってみようと考えたのです。

……しかしその浅はかな行為が、まさかあのような悲劇を招くことになろうとは、まだこのとき思いもしませんでした。

続きを読む

UIAutomationでマウスのドラッグ&ドロップの自動制御を試みるまで

本日のテーマ

昨日の続き。

  • UIテストでマウスのドラッグ&ドロップを自動化したい

方針

結局、最後はWin32APIに頼ることになりそう。

ちなみにこのWin32APIはなかなか癖者で、『ゲームプログラマになる前に覚えておきたい技術』§27.2.2ではこんなふうにdisられています。

(中略)これが絶望的に面倒くさい。win32APIで検索すると入門サイトが山と見つかるが、どこを見てもやる気が失せる。ボタンも何もないウィンドウを一つ出すだけで100行からのプログラムを書かねばならないし、何もかもがクラスでなく関数になっているので、かなり使いにくい。建て増しの歴史がそのまま透けて見えるような仕様の数々が、多少のやる気など粉砕してしまう。

今日やること

  • Windowsに標準でインストールされているペイントを自動起動する
  • ペイントを最大化する(モニタとウィンドウの左上端を合わせるため)
  • 座標(200, 300)から画面中央に向かってマウスを自動でドラッグ&ドロップする

成果物はこんな感じになる予定です。

f:id:tercel_s:20150430115009p:plain

なお、本記事の執筆にあたり使用した環境は、Surface Pro 3 (Windows 8.1 Pro 64ビット版) + Visual Studio Express 2013 for Windows Desktop です。マルチモニタ環境は想定していません。ごめんなさい。

続きを読む

UIAutomationで.Net製デスクトップアプリのGUIコンポーネントの自動制御を試みるまでのハートフルストーリー

今日のテーマ

  • .Netで開発されたデスクトップアプリケーションの結合テストを自動化したい
  • 検証対象はGUIベースのシステムなので、ビュー層(画面)の諸制御は避けて通れない
  • つまりバックエンドのUTほど話は簡単ではない

問題点

問題点はいろいろあるけどとりあえずこれ。

一文目は特にプログラムのテスト全般に対する一般論であることに注意してね。

Webアプリ界隈ではSeleniumという自動化ツールがそこそこ定着していますが、デスクトップアプリだとまだまだGUIの自動テストの決定打がない印象です*1

というわけで、同業者の知恵を借りることにしました。

はぅ君の回答

なるほど AutomationElement ……。

そんなべんりなものがあったとは……。

今日やること

とりあえず以下の検証作業を自動化してみようと思います。ほんと最低限です。

  • Windowsに標準でインストールされている電卓アプリを起動する
  • Cボタンで電卓をクリアする
  • 7ボタンを7回連打する
  • 電卓の表示結果が7777777であることを確認する
  • 電卓を終了する

なお、本記事の執筆にあたり使用した環境は、Surface Pro 3 (Windows 8.1 Pro 64ビット版) + Visual Studio Express 2013 for Windows Desktop です。

*1:ちなみに弊社にも独自開発した「キーワード駆動型GUI自動テストツール」があるのですが、大人の事情により僕は使えないことになっています。

続きを読む

無理なExcel管理が招くプロジェクトの停滞について

はじめに

こんにちはーこんにちはー。

たーせるです。プログラマ3年生です。

今日は、バグ管理にまつわる話を起点にした連ツイを適当にだらだらまとめました。

続きを読む

Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.