StringGridで選択位置に文字を挿入するには?

解決


maco  2005-09-30 16:15:26  No: 17797  IP: 192.*.*.*

StringGridのセルを編集する際に、
右クリックメニューでマウス選択位置に文字の挿入を考えています。

この際の右クリックメニューはPopupMenuで独自のメニューです。

(例)
 あいう|えお (「|」はマウスカーソル)
  │
  │右クリックメニューで挿入を選択
  ↓
 あいう「挿入文字列」えお

このような処理を実現する場合、何か良い方法はありませんか?

MemoであればSelTextで出来そうな感じですが、
StringGrid.Cells[x,y]や、Edit.Textに対して文字の挿入を行なう場合、
カーソル位置はどのようにして取得すればよいでしょうか?

どなたかお知恵をお貸しください。

編集 削除
えーと  2005-09-30 16:20:50  No: 17798  IP: 192.*.*.*

まず、どこまでできていますか?

(例)
 あいう|えお (「|」はマウスカーソル)  ---------1
  │
  │右クリックメニューで挿入を選択    ----------2
  ↓
 あいう「挿入文字列」えお            ----------3

2 まではできているんでしょうか?

編集 削除
maco  2005-09-30 16:33:38  No: 17799  IP: 192.*.*.*

> どこまでできていますか?

どうやって挿入を実現しようかと悩んでいたところなので、
まだ全く出来ていません。

StringGrid.Cells[x,y] := StringGrid.Cells[x,y] + 「挿入文字列」
行末への追加は簡単に出来ますが、
マウスで選択された位置となると…??
どうやってマウスで選択された位置を取得すればよいでしょうか?

編集 削除
うんばば  2005-09-30 16:35:30  No: 17800  IP: 192.*.*.*

SelTextはOKなのですね。それじゃあ、
type宣言のすぐ下に
  TMyGrid = class(TCustomGrid);
と書いて、

ポップアップのクリックイベントで、
  if TMyGrid(StringGrid1).InplaceEditor <> nil then
    TMyGrid(StringGrid1).InplaceEditor.SelText := '挿入文字列';

みたいな感じで。

編集 削除
maco  2005-09-30 16:58:47  No: 17801  IP: 192.*.*.*

「うんばば」さん ありがとうございます。
上記の方法で、マウスで選択した位置に文字列を挿入することが出来ました。

しかしなぜTMyGridでキャスト?すると
InplaceEditorが使えるようになるのでしょうか?

TCustomGrid(StringGrid1).InplaceEditor … では、
[未定義の識別子 : 'InplaceEditor'」とエラーが出るし…。
TCustomGridが抽象クラスだからですか?

この方法は、
TCustomGrid(抽象クラス)で定義されているInplaceEditorを
StringGridは隠蔽してしまっている
  ↓
TMyGrid = Class(TCustomGrid) というクラスを定義
TMyGrid(StringGrid)とすることで、隠蔽されたInplaceEditorを引っ張りだす。

と捉えてよいですか?

編集 削除
うんばば  2005-09-30 17:01:23  No: 17802  IP: 192.*.*.*

>この方法は、
>TCustomGrid(抽象クラス)で定義されているInplaceEditorを
>StringGridは隠蔽してしまっている
  ↓
>TMyGrid = Class(TCustomGrid) というクラスを定義
>TMyGrid(StringGrid)とすることで、隠蔽されたInplaceEditorを引っ張りだ>す。

はい。そうです。その通りです。かなりその通りです。。

編集 削除
maco  2005-09-30 17:05:00  No: 17803  IP: 192.*.*.*

こんな方法があったとは…、勉強になりました。
他のクラスでも応用できそうですね。

うんばばさん、貴重なアドバイスありがとうございました。

編集 削除
Mr.XRAY  URL  2005-09-30 23:57:59  No: 17804  IP: 192.*.*.*

>TMyGrid = Class(TCustomGrid) というクラスを定義

これは、今操作対象としているユニットにTCustomGridと同じクラスを
そのまま継承したクラス定義したことになります。そこで、同じユニット
内のprotected部にアクセス可能という原理が作用します。

InplaceEditorはTCustomGridのprotected部で以下の様に定義されています。

property InplaceEditor: TInplaceEdit read FInplaceEdit;

つまり、FInplaceEditの値をInplaceEditを通して利用可能ということにな
ります。そこで

>他のクラスでも応用できそうですね。

あるクラスでない機能は、その継承元のクラスをVCLのソースを探検して
みて、使えそうなものがないか調べることができるわけです。
「継承」というDelphiの素晴らしい機能の一つですね。

編集 削除
maco  2005-10-01 01:36:24  No: 17805  IP: 192.*.*.*

Mr.XRAYさんありがとうございます。

今回の方法は、本当に「目からうろこ」です。
色々なVCLでこの方法を試してみたいと思います。

Delphiてホント面白いですねぇ。

編集 削除