前回の【無駄話】昔の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】の後にこれをネタにします。
