とっておきの手土産を教えて

C++Builderにてプログラミングをしてるのですが、わからないことがあり質問させていただきました。
内容は、以下の通りです。

StringGridに文字を入力したあと、入力した文字をマウスにて範囲指定し
ボタンを押下する事で選択した範囲の文字色を変更したいのですがどうしたらいいのでしょうか?
したい事は、エクセルやワードで選択範囲の文字色を変えて表示している機能を作成したいとがんがえております。

よろしくお願い致します。

A 回答 (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;

多分これでいけるかと。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
確かに入れるタイミンクに関してはボタン押下時のイベントで取ればいいですよね。
ご指導ありがとうございます。
これで何とかしたい事が出来そうです。
本当にありがとうございました。

お礼日時:2006/08/07 08:22

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イベントで処理すればよいです。

ただ、どのような方法で記録するにせよ、文字列が再編集された場合に対応する必要があるので忘れずに。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

一点確認したいことがあるのですが、
教えて頂いたInplaceEditを操作するサンプル
なのですが、入れるタイミンクはどこに入れたらいいのでしょうか?
StringGridでの指定行で範囲指定している時にサンプルを入れたいと考えているのですが、移動している間イベントってどうやったらとれるのでしょうか?

現状Timerを使用して周期的にサンプルをコールするようにしたのですが、
たまにエラーになって落ちてしまいます。

お礼日時:2006/08/05 19:33

セル内の文字列の一部の文字色を変更するという意味ですか?


それともセル単位で文字色を変更するという意味ですか?

後者ならフリーのコンポーネントがあります。
参考URLのTStrColGrid。

前者なら自前でコーディングする必要があります。ちょっと手間です。

1.選択範囲を記録する。記録する方法は色々。
2.TStringGrid::OnDrawCellイベント内で1.で記録された文字は文字色を変更したうえ自前で描画(DrawText使用)。文字色はTStringGrid::Canvas::Font::Color

すこし古いですが、それなりに参考になります。http://www.ne.jp/asahi/nagoya/ahomaro/builder/cp …

参考URL:http://www2c.airnet.ne.jp/sone/

この回答への補足

ご回答ありがとうございます。
質問の内容としては、『セル内の文字列の一部の文字色を変更するという意味です』
この場合、選択範囲を記録する方法はどうしたらいいのでしょうか?
どのイベントを使用したらいいのかも理解していないのでよかったらご教示いただけると大変助かります。よろしくお願い致します。

補足日時:2006/08/04 08:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報