StringGridのセルを編集する際に、
右クリックメニューでマウス選択位置に文字の挿入を考えています。
この際の右クリックメニューはPopupMenuで独自のメニューです。
(例)
あいう|えお (「|」はマウスカーソル)
│
│右クリックメニューで挿入を選択
↓
あいう「挿入文字列」えお
このような処理を実現する場合、何か良い方法はありませんか?
MemoであればSelTextで出来そうな感じですが、
StringGrid.Cells[x,y]や、Edit.Textに対して文字の挿入を行なう場合、
カーソル位置はどのようにして取得すればよいでしょうか?
どなたかお知恵をお貸しください。
まず、どこまでできていますか?
(例)
あいう|えお (「|」はマウスカーソル) ---------1
│
│右クリックメニューで挿入を選択 ----------2
↓
あいう「挿入文字列」えお ----------3
2 まではできているんでしょうか?
> どこまでできていますか?
どうやって挿入を実現しようかと悩んでいたところなので、
まだ全く出来ていません。
StringGrid.Cells[x,y] := StringGrid.Cells[x,y] + 「挿入文字列」
行末への追加は簡単に出来ますが、
マウスで選択された位置となると…??
どうやってマウスで選択された位置を取得すればよいでしょうか?
SelTextはOKなのですね。それじゃあ、
type宣言のすぐ下に
TMyGrid = class(TCustomGrid);
と書いて、
ポップアップのクリックイベントで、
if TMyGrid(StringGrid1).InplaceEditor <> nil then
TMyGrid(StringGrid1).InplaceEditor.SelText := '挿入文字列';
みたいな感じで。
「うんばば」さん ありがとうございます。
上記の方法で、マウスで選択した位置に文字列を挿入することが出来ました。
しかしなぜTMyGridでキャスト?すると
InplaceEditorが使えるようになるのでしょうか?
TCustomGrid(StringGrid1).InplaceEditor … では、
[未定義の識別子 : 'InplaceEditor'」とエラーが出るし…。
TCustomGridが抽象クラスだからですか?
この方法は、
TCustomGrid(抽象クラス)で定義されているInplaceEditorを
StringGridは隠蔽してしまっている
↓
TMyGrid = Class(TCustomGrid) というクラスを定義
TMyGrid(StringGrid)とすることで、隠蔽されたInplaceEditorを引っ張りだす。
と捉えてよいですか?
>この方法は、
>TCustomGrid(抽象クラス)で定義されているInplaceEditorを
>StringGridは隠蔽してしまっている
↓
>TMyGrid = Class(TCustomGrid) というクラスを定義
>TMyGrid(StringGrid)とすることで、隠蔽されたInplaceEditorを引っ張りだ>す。
はい。そうです。その通りです。かなりその通りです。。
こんな方法があったとは…、勉強になりました。
他のクラスでも応用できそうですね。
うんばばさん、貴重なアドバイスありがとうございました。
>TMyGrid = Class(TCustomGrid) というクラスを定義
これは、今操作対象としているユニットにTCustomGridと同じクラスを
そのまま継承したクラス定義したことになります。そこで、同じユニット
内のprotected部にアクセス可能という原理が作用します。
InplaceEditorはTCustomGridのprotected部で以下の様に定義されています。
property InplaceEditor: TInplaceEdit read FInplaceEdit;
つまり、FInplaceEditの値をInplaceEditを通して利用可能ということにな
ります。そこで
>他のクラスでも応用できそうですね。
あるクラスでない機能は、その継承元のクラスをVCLのソースを探検して
みて、使えそうなものがないか調べることができるわけです。
「継承」というDelphiの素晴らしい機能の一つですね。
Mr.XRAYさんありがとうございます。
今回の方法は、本当に「目からうろこ」です。
色々なVCLでこの方法を試してみたいと思います。
Delphiてホント面白いですねぇ。
ツイート | ![]() |