|
|
2014/9/7(Sun) 20:17:50|NO.64743
こんばんは。
いまHSPスクリプトエディタのカーソル(キャレット)位置のキーワードを取得したいと思っているのですが、
全く方法がわかりません。F1キーヘルプのようにしたいです。よろしくお願いします。
|
|
2014/9/7(Sun) 22:43:50|NO.64745
「hsp カーソル位置」と検索すれば何番目かに参考になるページがありましたよ。
検索しても分からなかったのならば、どこが分からなかったのかを教えてください。
|
|
2014/9/8(Mon) 21:11:36|NO.64774
修正版を載せます。確認して見て下さい。
;***** カーソル位置のトークンを取得 (strmod04.hsp) *****
#module
#deffunc gettoken var prm1,str prm2,int prm3
strText = prm2 : ls=strlen(strText) : if ls==0 : return -1
nIndex = prm3 : if nIndex<0 : nIndex=0
sdim strCharSet,256
strCharSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#"
nStart = nIndex
repeat
if nStart<=0 : nStart=0: break
strChar=strmid(strText,nStart,1)
nFoundIndex=instr(strCharSet,0,strChar)
if nFoundIndex<0 : nStart++ : break
nStart--
loop
nLength=strlen(strText)
nEnd = nIndex
repeat
if nEnd>=nLength : nEnd=nLength : break
strChar=strmid(strText,nEnd,1)
nFoundIndex=instr(strCharSet,0,strChar)
if nFoundIndex<0 : break
nEnd++
loop
if nStart>=nEnd : prm1 = "" : return 0
prm1=strmid(strText,nStart,nEnd-nStart)
return 0
#global
;***** Sample *****
;▼必要となるAPIや定数の定義
#uselib "user32.dll"
#cfunc PostMessage "PostMessageW" int,int,int,int
#cfunc SendMessage "SendMessageW" int,int,int,int
#define EM_LINEFROMCHAR $000000C9
#define EM_GETSEL $000000B0
#define EM_LINEINDEX $000000BB
;▼HSP Script Sourceを選択
dialog "hsp",16 : if stat=0 : stop
buf=""
notesel buf : noteload refstr
;▼mesboxを作成
font "MS ゴシック",14 : objmode 2
mesbox buf,ginfo(10)-4,ginfo(11)-24,5 : objectID=0
objsel objectID : hCld=objinfo(0,2)
ret=PostMessage(hCld,EM_SETMARGINS,3,6)
objprm objectID,buf
;▼キー割り込み
onkey *k_event
stop
;▼F1キー取得
*k_event
;割り込み判定
if wparam=112 : goto *tokunget ;F1
stop
;▼トークン(キーワード)を取得
*tokunget
;▼行番号を取得
lno=SendMessage(hCld,EM_LINEFROMCHAR,-1,0)
;▼行位置を取得
ret=SendMessage(hCld,EM_GETSEL,varptr(i),0)
ret=SendMessage(hCld,EM_LINEINDEX,lno,0) : linepos=i-ret
sdim st,1024 : sdim outtoken,MAX_PATH
;▼現在カーソル位置の行の文字列を読みこむ
noteget st,lno : len=strlen(st)
;▼先頭のタブを除去
t=peek(st,0)
if t==$09 : st=strmid(st,1,len-1) : linepos-=1
;▼トークンを取得
gettoken outtoken,st,linepos
;▼取得したキーワードを表示
dialog " 取得されたキーワード : "+outtoken,0
stop
| |
|
2014/9/8(Mon) 21:19:59|NO.64775
あっ!少し回答を外したかも(^^;
>いまHSPスクリプトエディタのカーソル(キャレット)位置のキーワードを取得
hsedsdkでハンドルを取得して、上記のスクリプトのhCldに渡しても、うまくいかないと
思います。もう少し具体的にどんなものを作成しょうとしているのかを書いたら、誰かが
答えてくれるかも・・・(もうずいぶんHSPをやっていないので他力本願)
|
|
2014/9/8(Mon) 21:37:10|NO.64776
スクリプトエディタから選択されている位置の取得だけでも
専用の関数等はなく、荒業を使うしかなさそうです。
キーワード取得もモジュール化もコメントもないスクリプトですが
このようになりました。
#include "hsedsdk.as"
hsed_exist
if stat == 0:end
hsed_getacttabid nTabID
hsed_getfootyid nFootyID,nTabID
hsedtextlen = 0
hsed_gettextlength hsedtextlen,nFootyID
sdim buf
if stat == 0:hsed_gettext buf,nFootyID
sIns = "スクリプトエディタに送る文字列"
hsed_sendstr sIns
sdim buf2
if stat == 0:hsed_gettext buf2,nFootyID
hsed_undo nFootyID
repeat strlen(buf) + 1
if peek(buf,cnt) != peek(buf2,cnt):footyselstart = cnt:break
loop
mes "選択開始位置:" + footyselstart
sellen = -( - strlen(sIns) - strlen(buf) + strlen(buf2))
mes "選択バイト数:" + sellen
自由に使ってよいことを明示しておきます。
|
|
2014/9/13(Sat) 17:56:08|NO.64889
返信遅くなってすみません。
>>さくらさん
>>tds12さん
ありがとうございます。コード確認しました。
コード補完ソフトを作りたいと思っています。
tds12さんのコードでキャレット位置を取得->hsedsdkで全体の文字列取得->さくらさんのコードでトークン取得
でできないか試しています…
|
|
2014/9/13(Sat) 21:07:10|NO.64895
;***** カーソル位置のトークンを取得 *****
#module
#deffunc gettoken var prm1,str prm2,int prm3
;p1=トークンが代入される変数
;p2=取得する文字列
;p3=取得する行数?
strText = prm2 : ls=strlen(strText) : if ls==0 : return -1
nIndex = prm3 : if nIndex<0 : nIndex=0
sdim strCharSet,256
strCharSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_#"
nStart = nIndex
repeat
if nStart<=0 : nStart=0: break
strChar=strmid(strText,nStart,1)
nFoundIndex=instr(strCharSet,0,strChar)
if nFoundIndex<0 : nStart++ : break
nStart--
loop
nLength=strlen(strText)
nEnd = nIndex
repeat
if nEnd>=nLength : nEnd=nLength : break
strChar=strmid(strText,nEnd,1)
nFoundIndex=instr(strCharSet,0,strChar)
if nFoundIndex<0 : break
nEnd++
loop
if nStart>=nEnd : prm1 = "" : return 0
prm1=strmid(strText,nStart,nEnd-nStart)
return 0
#global
#include "hsedsdk.as"
footyid=0
hsedtextren=0
hsed_getactfootyid footyid
hsed_gettextlength hsedtextlen,footyid
buf=""
hsed_gettext buf,footyid
sIns = "スクリプトエディタに送る文字列"
hsed_sendstr sIns
sdim buf2
if stat == 0:hsed_gettext buf2,footyid
hsed_undo footyid
repeat strlen(buf) + 1
if peek(buf,cnt) != peek(buf2,cnt):footyselstart = cnt:break
loop
title ""+footyselstart
stop
;▼トークン(キーワード)を取得
*tokunget
;▼行番号を取得
val=strmid(buf,0,footyselstart)
notesel val
footyline=notemax
noteunsel
;▼行位置を取得
;▼現在カーソル位置の行の文字列を読みこむ
;▼先頭のタブを除去
t=peek(footyline,0)
if t==$09 : st=strmid(footyid,1,len-1) : linepos-=1
;▼トークンを取得
gettoken outtoken,footyline,linepos
;▼取得したキーワードを表示
dialog " 取得されたキーワード : "+outtoken,0
stop
トークン取得のところがわかりませんでした…
| |
|
2014/9/15(Mon) 09:02:20|NO.64958
F1キーヘルプのhelpmanはソースが公開されていますので参考にしてはどうですか?
|
|