Windows Phoneアプリケーション開発入門

第3回 Windows phoneでテキストエディタを作ろう!(1)

この記事を読むのに必要な時間:およそ 3 分

機能を実装してみよう!

前置きが長くなってしまいましたが,早速機能を実装していきましょう。

「やり直す」の実装

TextBoxのUndoメソッドでひとつ前の状態に戻すことができます。CanUndoプロパティでアンドゥ(元に戻す)が可能かどうかを判定し,元に戻せるのであればアンドゥを実行します。

    private void menuUndo_Click(object sender, EventArgs e)
    {
        // アンドゥ(元に戻す)が可能か
        if (textEdit.CanUndo)
        {
            // 元に戻せるのであれば戻す
            textEdit.Undo();
        }
    }

「コピー」の実装

デスクトップ版.NET Frameworkに実装されているTextBoxコントロールは,Cut/Copy/Paste メソッドがUndoメソッドと同様に用意されており,文字列を選択した状態でCopyメソッドを使えば,文章がクリップボードに保持されます。しかし,.NET Compact Frameworkでは,TextBoxコントロールにCut/Copy/Pasteメソッド等が実装されていません。そのためそれぞれを独自に実装する必要があります。

独自に実装といってもそんなに難しいことはありません。Windows Mobile OSは,クリップボードという共有メモリ領域を持っています。名前の通りデータをコピーしたり貼り付けたりできます。

クリップボードにコピーした(保持した)データは共有メモリ上に格納されますので,このテキストエディタで書いた内容をほかのアプリに貼り付けて使うことも可能です。アプリケーション間でのデータの受け渡しによく使われる方法です。

コピーの実装には,このClipboardクラスを使用します。Clipboardクラスはクリップボードのコピーしたり貼り付けたりをクラス化したものです。以下のコードは,文章を1文字でも選択していればクリップボードに設定しています。

private void menuCopy_Click(object sender, EventArgs e)
 {
   if (textEdit.SelectedText != "")
   {
     // 選択している文字列をクリップボードに格納
     Clipboard.SetDataObject((object)textEdit.SelectedText);
   }
 }

このテキストエディタでは使用しませんが,もしクリップボードに貼り付けたデータをClipboardクラスを使って利用する場合は,以下のように書くことができます。

// クリップボードが保持しているデータ形式が
// テキスト型以外であれば、以降の処理を行わない
IDataObject iData = Clipboard.GetDataObject();
if (!iData.GetDataPresent(DataFormats.Text))
{
  return;
}

// クリップボードからデータを取得する
string textData = (string)iData.GetData(DataFormats.Text);

まとめ

今回はウィザードを使って簡易テキストエディタの作成を行いました。⁠コピー」機能では,.NET Compact FrameworkのClipboardクラスを利用して実装を行いました。

デスクトップ版の.NET Frameworkでは元々実装されているメソッドやプロパティが無いので,別の手段で補いながらアプリケーション開発を進めていくのが,.NET Compact Frameworkの醍醐味です。

次回も引き続きテキストエディタの実装を進めていきましょう。

以上で今回は終わりです。ありがとうございました。

著者プロフィール

和田健司(わだけんじ)

1982年10月12日生まれ。大阪で働くプログラマ。Microsoft MVP for Device Application Development(Jul 2010 - Jun 2011)。Windows Mobileに傾倒し今に至る。Windows Mobile向けのTipsを書いています。iPhoneアプリ開発を始めました。嫌いな食べ物はカレー。

URL: http://ch3cooh.jp/
Blog: http://d.hatena.ne.jp/ch3cooh393/