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

解決


maco  2005-10-01 01:15:26  No: 17797

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

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

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

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

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

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


えーと  2005-10-01 01:20:50  No: 17798

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

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

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


maco  2005-10-01 01:33:38  No: 17799

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

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

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


うんばば  2005-10-01 01:35:30  No: 17800

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

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

みたいな感じで。


maco  2005-10-01 01:58:47  No: 17801

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

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

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

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

と捉えてよいですか?


うんばば  2005-10-01 02:01:23  No: 17802

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

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


maco  2005-10-01 02:05:00  No: 17803

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

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


Mr.XRAY  URL  2005-10-01 08:57:59  No: 17804

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

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

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

property InplaceEditor: TInplaceEdit read FInplaceEdit;

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

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

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


maco  2005-10-01 10:36:24  No: 17805

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

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

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


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

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






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