前回の【無駄話】昔のC++プログラマーが陥りやすい、C#<WinForms>プログラミングの盲点の末尾のpsで、

 

「印刷と『検索、置換()』で躓いています。

:Win32のコモンダイアログである「検索、置換ダイアログ(FindText関数、ReplaceText関数で呼び出す)」であれば、BCCSkeltonのCREDITクラスで簡単に、


bool CMyWnd::OnFind(HWND hWnd) {
    Edit.SetHandle(GetDlgItem(hWnd, IDC_CHILD_CONTROL));
    m_hDlg = Edit.m_hFRDlg = FindText(Edit.SetFRDlg('F'));
    return TRUE;
}

bool CMyWnd::OnReplace(HWND hWnd) {
    Edit.SetHandle(GetDlgItem(hWnd, IDC_CHILD_CONTROL));
    m_hDlg = Edit.m_hFRDlg = ReplaceText(Edit.SetFRDlg('R'));
    return TRUE;
}

行えたのですが、C#では「検索、置換ダイアログ」が無い、ということらしく、一から始めなければなりません。┐(´д`)┌ヤレヤレ」

 

と愚痴りました。その後、やっと見つけたRichTextBoxの印刷機能に関わる記事を読んでコードを書いたのですが、不明のエラーが出るので、またまたChat-GPT様に縋ってしまいました。

 

(私)「C#でRichTexxtBoxを使って印刷を行おうと次のようなコードを組むと、コンパイル時に「error CS1061: 'System.Windows.Forms.RichTextBox' に 'Print' の定義が含まれておらず、型 'System.Windows.Forms.RichTextBox' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」というエラーがでます。C#のVersionの問題でしょうか?

 

//印刷ダイアログを表示する場合

            PrintDialog prtDlg = new PrintDialog();
            prtDlg.Document = new PrintDocument();
            //ダイアログを表示し、ユーザーがプリンターを選択できるようにする
            if(prtDlg.ShowDialog() == DialogResult.OK)
            {
                //ユーザーがOKを押したら印刷を実行
                rtxtBox.Print(printDialog.Document); // PrintDialog.Documentにはユーザーが選択したプリンターの情報が格納されている
            }
            prtDlg.Dispose();

 

(Chat-GPT)「(前略)

  • rtxtBox.Print(...) のような簡単なAPIは 存在しない(WinFormsの制限)。

  • WPF(System.Windows.Controls.RichTextBox)では PrintDialog.PrintDocument() を使う方法もあるが、WinFormsとは別物。

(後略)

 

ということで、本日「C#5のWinFormsには文字列の検索、置換や印刷のメソッドは無い!」という驚くべき事実を知り、またまた落ち込んでいます。しかしこのまま引き下がるようでは「昭和の男」ではありません。

 

そーか、そ-か、わかった、だったら仕様があるまい!無いんだったらつくってやるよ!

 

ということで、【PropertyGrid】の後にこれをネタにします。