- ベストアンサー
StringGridで選択した箇所の文字色を変更するには
C++Builderにてプログラミングをしてるのですが、わからないことがあり質問させていただきました。 内容は、以下の通りです。 StringGridに文字を入力したあと、入力した文字をマウスにて範囲指定し ボタンを押下する事で選択した範囲の文字色を変更したいのですがどうしたらいいのでしょうか? したい事は、エクセルやワードで選択範囲の文字色を変えて表示している機能を作成したいとがんがえております。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>入れるタイミンクはどこに入れたらいいのでしょうか? それはお好きなように。 質問の趣旨から行くとボタンのクリックイベントじゃないのかと思いますが。 >移動している間イベントってどうやったらとれるのでしょうか? Windowsのメッセージを拾う必要があります。 BCB6以降ならTApplicationEventsを使えるから楽なんですが、BCB5はTApplication::OnMessageに割り当てたら良かったかな? //以下のイベントハンドラを作成 //BCB6以降ならオブジェクトインスペクタでApplicationEvents1の //OnMessageイベントに割り当てるだけでOK void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled) { if ( !Grid->ComponentCount ) return; if ( TInplaceEdit* editor = dynamic_cast<TInplaceEdit*>(Grid->Components[0]) ) { if ( Msg.hwnd == editor->Handle && ( Msg.message == WM_MOUSEMOVE || Msg.message == WM_KEYUP ) ) { Caption = editor->SelText; } } } //BCB5ならFormのコンストラクタに次の1行を追加 Application->OnMessage = ApplicationEvents1Message; 多分これでいけるかと。
その他の回答 (2)
- KoHal
- ベストアンサー率60% (110/181)
TStringGridは実のところ文字列を表示するだけのコンポーネントです。 文字列の編集はTStringGridがTInplaceEditを呼び出して実現しています。 大雑把に言うと、セルがクリックされたときに、そのセルの上にエディットボックスを表示してエンドユーザに文字列を入力させているわけです。 なので選択文字列を取得するにはTStringGridが持っているTInplaceEditのインスタンスであるTStringGrid::InplaceEditorに触る必要があります。 ところがこのInplaceEditorがprotectedなので本来は派生クラスを作るのが筋なのですが、ちょっとトリッキーな手をつかうとわざわざ派生させなくてもいけます。 //InplaceEditを操作するサンプル //選択された文字列をFormのCaptionに表示 if ( TInplaceEdit* editor = dynamic_cast<TInplaceEdit*>(StringGrid1->Components[0]) ) { Caption = editor->SelText; } あとはこの文字列を何らかの方法で記録して(文字列にタグを埋め込むなり、文字列とは別に記録するなりお好きなように)、それをTStringGrid::OnDrawCellイベントで処理すればよいです。 ただ、どのような方法で記録するにせよ、文字列が再編集された場合に対応する必要があるので忘れずに。
お礼
ご回答ありがとうございます。 一点確認したいことがあるのですが、 教えて頂いたInplaceEditを操作するサンプル なのですが、入れるタイミンクはどこに入れたらいいのでしょうか? StringGridでの指定行で範囲指定している時にサンプルを入れたいと考えているのですが、移動している間イベントってどうやったらとれるのでしょうか? 現状Timerを使用して周期的にサンプルをコールするようにしたのですが、 たまにエラーになって落ちてしまいます。
- KoHal
- ベストアンサー率60% (110/181)
セル内の文字列の一部の文字色を変更するという意味ですか? それともセル単位で文字色を変更するという意味ですか? 後者ならフリーのコンポーネントがあります。 参考URLのTStrColGrid。 前者なら自前でコーディングする必要があります。ちょっと手間です。 1.選択範囲を記録する。記録する方法は色々。 2.TStringGrid::OnDrawCellイベント内で1.で記録された文字は文字色を変更したうえ自前で描画(DrawText使用)。文字色はTStringGrid::Canvas::Font::Color すこし古いですが、それなりに参考になります。http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-048.html
補足
ご回答ありがとうございます。 質問の内容としては、『セル内の文字列の一部の文字色を変更するという意味です』 この場合、選択範囲を記録する方法はどうしたらいいのでしょうか? どのイベントを使用したらいいのかも理解していないのでよかったらご教示いただけると大変助かります。よろしくお願い致します。
お礼
ご回答ありがとうございます。 確かに入れるタイミンクに関してはボタン押下時のイベントで取ればいいですよね。 ご指導ありがとうございます。 これで何とかしたい事が出来そうです。 本当にありがとうございました。