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


hami  2005-12-07 02:46:20  No: 19071

現在、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 19:12:44  No: 19072

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


りおりお  2005-12-07 23:37:17  No: 19073

> Self.Canvas.Handle

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

StringGrid1.Canvas.Handle

にしてみてください


hami  2005-12-08 02:20:36  No: 19074

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

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

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


りおりお  2005-12-08 02:31:37  No: 19075

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

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


HOta  2005-12-08 17:01:45  No: 19076

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加