StringGridのDrawCellで文字列の出力位置を調整するには


hami  2005-12-06 17:46:20  No: 19071  IP: 192.*.*.*

現在、StringGridのDrawCellイベントで
左寄せ、センタリングなどのオプションを設定の上、DrawTextExで文字列を出力しています。

DrawTextEx(Self.Canvas.Handle, PChar(S), Length(S), ARect, Options, nil);

この表示文字列をGoogleの検索結果のハイライトのように色分けをしたいと思い
まずは単純に指定の文字列があったらその部分を赤くし、それ以外は黒くしようと
下記のような場合分けを行いました。(指定文字列の検索処理は省略します)


if  指定文字列があった  then begin
  Font色を変更
  DrawTextEx(Self.Canvas.Handle, PChar(S), Length(S), ARect, Options, nil);
end
else
  DrawTextEx(Self.Canvas.Handle, PChar(S), Length(S), ARect, Options, nil);
end;

文字列の部分を出力する場合にTextWidthとTextHeightを使用して出力した文字列の部分のサイズを取得し
ARectのTop,Leftプロパティに加算して次の文字列の出力位置を調整してみたのですが
こうすると、ARectで示される文字列の整形領域が出力のたびに変わってしまうのでうまく編集されない状態です。
編集オプションの適用範囲(ARectのサイズ)はそのままに、文字列の出力開始位置を指定できないものでしょうか。

どなたか回答もしくは参考となる情報ありましたら、ご指摘をお願いします。

編集 削除
りおりお  2005-12-07 10:12:44  No: 19072  IP: 192.*.*.*

ご質問の意味がよくわからないのですが、DrawTextEx() を使うってことは
ARect 部分をいじるのではなく、Options 部分で左寄せ、中央寄せ、右寄せを
設定するのではないでしょうか。なぜ ARect を操作してるのですか?

編集 削除
りおりお  2005-12-07 14:37:17  No: 19073  IP: 192.*.*.*

> Self.Canvas.Handle

この Self って、StringGrid ではなく Form1 のほうになってませんか?

StringGrid1.Canvas.Handle

にしてみてください

編集 削除
hami  2005-12-07 17:20:36  No: 19074  IP: 192.*.*.*

返信ありがとうございます

まず、上記のDrawTextExはStringGridから継承したコンポーネントのDrawCellで実行しています。そのためSelfとしています。

またOptionsについては
セルの編集スタイルとして左寄せをOptionに設定しています。
この時、左寄せが有効となる領域がARectで示される領域ですよね?
となると、ARectサイズは変更せずに文字列の出力位置を
変更したいのですが、今の状態だと前に出力した位置に上書きしてしまう
ので自前で位置を設定したいと思い、このような質問しました。
これで意味通りますでしょうか?

編集 削除
りおりお  2005-12-07 17:31:37  No: 19075  IP: 192.*.*.*

意味がわかりません。上書きされるのが正常なのでは?

まず、コンポーネントを作る前に、標準の TStringGrid の OnDrawCell イベント
でコードを書いてみたらどうでしょうか。

編集 削除
HOta  2005-12-08 08:01:45  No: 19076  IP: 192.*.*.*

普通は、ARectを塗りつぶしてからDrawTextします。

編集 削除