ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年9月21日(木) 06:43

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2007年9月30日(日) 21:24 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
お世話になっております。
ABにて作成したタブ型テキストエディタに、プラグイン機能を追加しました。

テキストエディタ本体はこちらになります。

というわけで、このテキストエディタにて動作する、テキスト処理プラグインを募集いたします。( ^_^)
サンプルDLL、開発支援テンプレート等はこちらです。
プラグインの仕様は、こちらです。
[hide=仕様書を開く]
コード:
■プラグインとして認識されるファイル名
システムモジュール(TabTextList.exe)のあるフォルダ直下の
"Plugins"フォルダに置かれた拡張子[.tpi]のDLLを、プラグインとして認識します。

"Plugins\*.tpi"



■プラグインが呼び出されるタイミング
「手近なテキストメニュー」が選択されたとき。



■プラグインの実装
プラグインDLLは以下の4つの関数をエキスポートする必要があります。
※以下において、「テキスト処理」とは「手近なテキストメニュー」
 によって選択されたプラグインのテキスト処理の実行を意味します。
------------------------------------------------
【関数名】			【機能】
TtlPlgIn_GetTMenuTitle		システムモジュールが、プラグインで実装されたメニュー名を取得するために利用します。

TtlPlgIn_HandleOpen		テキスト処理の開始時に呼び出されます。

TtlPlgIn_Work			テキスト処理を実行するために呼び出されます。

TtlPlgIn_HandleClose		テキスト処理の終了時に呼び出されます。


以上の4つの関数は以下の流れで呼び出されます。
	TtlPlgIn_GetTMenuTitle
		↓
	TtlPlgIn_HandleOpen
		↓
	TtlPlgIn_Work
		↓
	TtlPlgIn_HandleClose



■エキスポート関数の仕様
呼び出し規約は "__stdcall" 出なければなりません。

以下では「Long型(long型)=符号付き32ビット整数型」として扱います。

○Function Export TtlPlgIn_GetTMenuTitle( nIndex As Long, pszMenu As BytePtr ) As Long
	【引数】
	nIndex As Long
	プラグインが持つ、テキスト処理メニューの項目番号(0,1,2,,,)がLong型で指定されます。
	もしくは、テキスト処理メニューの個数取得のフラグとして[-1]が指定されます。
	
	pszMenu As BytePtr
	指定されたテキスト処理メニューのタイトルを格納すべきバッファのポインタが
	BytePtr(*char)型で指定されます。
	
	【返り値】
	Long型を返します。
	nIndex=-1 のときは、プラグインが保有するテキスト処理メニューの個数を返します。
	nIndex=0,1,2,,, のときは、pszMenu に格納したタイトルの長さを返します。


○Function Export TtlPlgIn_HandleOpen( nIndex As Long ) As DWord
	【引数】
	nIndex As Long
	システムモジュールによって選択された(「手近なテキストメニュー」で選択された)、
	テキスト処理メニューの項目番号がLong型で格納されます。
	
	【返り値】
	DWord(unsigned long)型です。
	テキスト処理メニューを識別するハンドルを返します。
	ここで返したハンドルが TtlPlgIn_Work() と TtlPlgIn_HandleClose() に与えれます。


○Function Export TtlPlgIn_Work( dwHandle As DWord, hWnd As HWND , pszFile As BytePtr, pszText As BytePtr, pszSel As BytePtr, ByRef pzNText As BytePtr, ByRef pzNSel As BytePtr, dwReserved As DWord ) As DWord
	【引数】
	dwHandle As DWord
	テキスト処理メニューを識別するハンドルがDWord(unsigned long)型で指定されます。
	
	hWnd As HWND
	システムモジュールの窓ハンドルが指定されます。
	
	pszFile As BytePtr
	編集中のテキストが保存されているファイルパスが格納されたバッファのポインタがBytePtr(*char)型で指定されます。
	格納内容を編集は禁止です(コピーのみ可)。
	
	pszText As BytePtr
	編集中のテキスト全体が格納されたバッファのポインタがBytePtr(*char)型で指定されます。
	格納内容を編集は禁止です(コピーのみ可)。
	
	pszSel As BytePtr
	被選択テキスト(反転部)が格納されたバッファのポインタがBytePtr(*char)型で指定されます。
	格納内容を編集は禁止です(コピーのみ可)。
	
	ByRef pzNText As BytePtr
	テキスト処理を実行後の、テキスト全体を格納したバッファへのポインタをBytePtr(*char)型で指定します。
	このパラメータに指定したバッファは、TtlPlgIn_HandleClose() が呼ばれるまで有効でなければいけません。
	不要であればNULLを指定できますが、その際は dwReserved に TTL_PLUGIN_ALLTEXT 以外を指定しなければなりません。
	
	ByRef pzNSel As BytePtr
	テキスト処理を実行後の、被選択テキストを格納したバッファへのポインタをBytePtr(*char)型で指定します。
	このパラメータに指定したバッファは、TtlPlgIn_HandleClose() が呼ばれるまで有効でなければいけません。
	不要であればNULLを指定できますが、その際は dwReserved に TTL_PLUGIN_SELECTED 以外を指定しなければなりません。
	
	dwReserved As DWord
	将来のために予約されています。
	現在は、NULLが指定されます。
	
	【返り値】
	テキスト処理の種類を指定します。
		テキスト全体を処理した場合は、TTL_PLUGIN_ALLTEXT(=1)
			※テキスト全体が、pzNText に指定された内容で置き換えられます。
	
		被選択テキストのみが処理された場合は、TTL_PLUGIN_SELECTED(=2)
			※被選択テキストのみが、pzNSel に指定された内容で置き換えられます。
	
		テキスト処理を伴わない、もしくは処理に失敗した場合は、TTL_PLUGIN_FALSE(=0)
			※テキストの置き換えは行いません。


○Function Export TtlPlgIn_HandleClose( dwHandle As DWord ) As Char
	【引数】
	dwHandle As DWord
	テキスト処理メニューを識別するハンドルがDWord(unsigned long)型で指定されます。
	
	【返り値】
	処理の結果をTRUE(=1) or FALSE(=0) で返します。





■備考
プラグインDLL内部にて、動的メモリ(ヒープ領域)確保が必要な場合には、
 TtlPlgIn_HandleOpen() もしくは、TtlPlgIn_Work() にて確保を行い、
 TtlPlgIn_HandleClose() にて開放することを推奨します。
[/hide]


例えば、
 ・テキストスピーチ
 ・特定の情報を抽出してテキストを整形
 ・選択されたテキストをグーグル検索
 ・自分がよく使う構文の自動挿入
 ・顔文字リスト挿入
 etc
というように、汎用性のあるものから、自分専用なニッチなものまで、なんでもありです。
自分専用のつもりであっても、誰かに需要があるかもしれません。
興味ありましたら是非、作成してみませんか?


作成したプラグインのアップロード先に困った際は、こちらの「プラグイン置き場」をご利用ください。
# 2008.12.10 URLを修正しました。スパム対策のため。


作成されたプラグインの公開をお待ちしております。


最後に編集したユーザー 淡幻星 on 2008年12月10日(水) 23:23 [ 編集 1 回目 ]

通報する
ページトップ
 記事の件名:
投稿記事Posted: 2007年10月01日(月) 01:39 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
渡されるpszTextの値が少しおかしいようです。確認してください。
文字列のサイズが1バイト足りてません。

それと、文字列を挿入する位置を決定したりしたいのでカーソルのある位置をパラメータに追加して欲しかったりします。

とりあえず[hide=こんなの]
コード:
Function Menu1_Title(ByRef fEnable As Char)As String
	fEnable=TRUE
	Menu1_Title="GetNowTime"
End Function
Function Menu1_Work(hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef dwAction As DWord)As String
	Menu1_Work=pszText+Date$()+" "+Time$()
	dwAction=TTL_PLUGIN_ALLTEXT
End Function

Function Menu2_Title(ByRef fEnable As Char)As String
	fEnable=TRUE
	Menu2_Title="選択範囲が「竹薮焼けた」"
End Function
Function Menu2_Work(hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef dwAction As DWord)As String
	Dim pszs As*Byte,length As Long
	length=lstrlen(pszSel)-1
	pszs=calloc(length+2)
	Dim i=0 As Long,j As Long
	'SJIS文字として編集
	Do
		If pszSel[i]>=&H80 then
			For j=i+1 To 2 Step -1'memmove無いかなぁ・・・。
				pszs[j]=pszs[j-2]
			Next
			pszs[1]=pszSel[i+1]
			pszs[0]=pszSel[i]
			i+=2
		Else
			For j=i To 1 Step -1
				pszs[j]=pszs[j-1]
			Next
			pszs[0]=pszSel[i]
			i++
		End If
		If i>length then Exit Do
	Loop
	Menu2_Work=pszs
	free(pszs)
	dwAction=TTL_PLUGIN_SELECTED
End Function
[/hide]作ってみました。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
投稿記事Posted: 2007年10月01日(月) 21:12 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
≫konisiさん
早速の作成をありがとうございます。
# こんなに早くレスポンスがあるとは思っていませんでした(喜)。

バグ報告をありがとうございます。
終端の1バイトが欠けていました。修正したβ版をアップしましたのでご確認ください。

なお、上記β版ではカーソル位置をパラメータに追加してあります。
まだ暫定ですが、仕様は以下です。
[hide=拡張パラメータ仕様]
コード:
dwReserved As DWord パラメータに、
以下で定義されるTtlExpand構造体のポインタが格納されます。

Type TtlExpand
	wVersion As Word
	dwSelIin As DWord
	dwSelFin As DWord
End Type

wVersion ・・・バージョン番号が格納されます。(Ver.160=160, Ver.161=161,,,)
dwSelIni ・・・カーソルの開始位置が格納されます。
dwSelFin ・・・カーソルの終了位置が格納されます。
[/hide]
この部分に関しては、これで決定のつもりですが気が変わって正式アップまでに変更になったらすみません。


この拡張仕様に関するテンプレート変更は、正式アップまで勘弁ください。
# しばらくまとまった時間が取れないので。。。
# コーディングから察するに、konisiさんなら必要なさそうですね(^^)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2007年10月02日(火) 23:03 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
住所: 埼玉県東松山市
どうもありがとうございます。

とりあえずこんなコードを打ってみました。
[hide]
コード:
Type TtlExpand
    wVersion As Word
    dwSelIin As DWord
    dwSelFin As DWord
End Type

Dim ptrDataEx As*TtlExpand

Function Export TtlPlgIn_Work(dwHandle As DWord,hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef pzNText As*Byte,ByRef pzNSel As*Byte,dwReserved As DWord)As DWord
	Dim pst As*DllItemDist
	Dim nRet As DWord
	Dim strBuf As String
	Dim dwReserved_TtlExpand As TtlExpand
	pst=dwHandle As*DllItemDist

	If dwReserved Then'0でなければ
		ptrDataEx=dwReserved As VoidPtr
	End If

	'テキスト処理の実行
	Select Case pst->nIndex
		Case 0
			strBuf=Menu1_Work(hWnd,pszFile,pszText,pszSel,nRet)
		Case 1
			strBuf=Menu2_Work(hWnd,pszFile,pszText,pszSel,nRet)
		Case 2
			strBuf=Menu3_Work(hWnd,pszFile,pszText,pszSel,nRet)
	End Select


	'返却テキストの設定
	Select Case nRet
		Case TTL_PLUGIN_ALLTEXT
			pzNText=HeapAlloc(pst->hHeap,HEAP_ZERO_MEMORY,Len(strBuf)+1)
			lstrcpy(pzNText,StrPtr(strBuf))
		Case TTL_PLUGIN_SELECTED
			pzNSel = HeapAlloc(pst->hHeap,HEAP_ZERO_MEMORY,Len(strBuf)+1)
			lstrcpy(pzNSel,StrPtr(strBuf))
		Case TTL_PLUGIN_FALSE
			'返却文字列は準備しない。
	End Select
	
	'返り値の設定
	TtlPlgIn_Work=nRet
End Function
コード:
'プラグインメニューの3つ目
Function Menu3_Title(ByRef fEnable As Char)As String
	fEnable=TRUE
	Menu3_Title="削除のテスト。"
End Function
Function Menu3_Work(hWnd As HWND,pszFile As*Byte,pszText As*Byte,pszSel As*Byte,ByRef dwAction As DWord)As String
	Dim buffer[80] As Byte
	If ptrDataEx then'バージョン照合は可能か
		If ptrDataEx->wVersion<160 then'バージョンが1.60より下なら
			MessageBox(hWnd,"このエディタのバージョンでは動作できません。Ver1.61(V161)以上で使用してください。","Warning",MB_OK)
			wsprintf(buffer,"今のバージョン識別番号:V%d",ptrDataEx->wVersion)
			MessageBox(hWnd,buffer,"Warning",MB_OK)
			Menu3_Work=""
			dwAction=TTL_PLUGIN_FALSE
			Exit Function
		End If
	Else'バージョン照合不可能なら(Ver 1.60)
		MessageBox(hWnd,"このエディタのバージョンでは動作できません。Ver1.61(V161)以上で使用してください。","Warning",MB_OK)
		MessageBox(hWnd,"今のバージョン識別番号:多分V160","Warning",MB_OK)
		Menu3_Work=""
		dwAction=TTL_PLUGIN_FALSE
		Exit Function
	End If
	'以下本処理
	Dim buf As*Byte
	Dim si As Long,sf As Long
	si=ptrDataEx->dwSelIin
	sf=ptrDataEx->dwSelFin
	If si<>sf then
		buf=calloc(lstrlen(pszText)+1)
		If si then
			memcpy(buf,pszText,si)
			memcpy(buf+si,pszText+sf,lstrlen(pszText)-sf+si)
		Else
			memcpy(buf,pszText+sf,lstrlen(pszText)-sf)
		End If
		Menu3_Work=buf
		free(buf)
		dwAction=TTL_PLUGIN_ALLTEXT
	Else
		Menu3_Work=""
		dwAction=TTL_PLUGIN_FALSE
	End If
End Function
[/hide]それと今気が付いたのですが、エディタのフォント名とかフォントサイズとか使用中の文字コードとかが分かると、それはそれで使い道がありそうです。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2007年10月03日(水) 23:48 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
またの早速の作成と、提案をありがとうございます。

>それと今気が付いたのですが、エディタのフォント名とかフォントサイズとか使用中の文字コードとかが分かると、それはそれで使い道がありそうです。
そうですね。
次回のバージョンアップ(Ver.161)で検討してみます。
2週間後くらいまでにはアップできるかと、考えています。
[hide=# ちなみに。]# 文字コードは5種類を読み書きできることを謳ってますが、当然ながらEdit窓上ではShift-JISのみで取り扱ってます。
# ロード/セーブ時にコード変換しているだけです。(UTF16への変換がちょっと怪しいとかいう話も。。。汗)
# よって、プラグインDLLに渡される文字列も必ずShift-JISになります。
# 保存時にどの文字コードを用いるか、のユーザ設定は保持しているので、それを渡すことは可能ですが。。。
# そもそもそういう意味で言ってますか?(^^;) んー、仕様をどうしようかな。

# エディタのフォントについては、何も考えてません(爆
# GetStockObject( OEM_FIXED_FONT ) を放り込んでます。
# フォント選択ダイアログは、、、そのうち余力があったら実装しようかなというところ。
# プラグイン側で作成した独自/特殊フォントを取得して設定する、なんて実装の方が楽といえば楽なんですが。。。
# ↑私がフォントについて理解しなくて良い分、という意。
# これも仕様をどうしようかな。
[/hide]

個人的には、カーソル位置にある四則算が出来るプラグインを作りたいところですね。
konisiさんがこちらに投稿されてるコードを追うことから、、、と思っている今日この頃。
次のバージョンアップに間に合うかは、、、時間が取れたらかな。。。
あ、どちら様か、作成されますか?(ワクワク)←マテ。


通報する
ページトップ
 記事の件名: 四則算について
投稿記事Posted: 2007年10月12日(金) 20:45 
こんばんわ。
ABはまだまだ初心者で、皆さんのをパクリながら(笑) たまに
何かに取り組んでるレベルのつっちーです。

久しぶりにここを見ていたら、僕が質問させて頂いた四則計算の話題と
僕の投稿が関わっていたので・・・(笑)、ご参考までに書き込みをさせて頂きます。
四則算についての記事です。
http://www.activebasic.com/forum/viewto ... 7%D7%BB%BB
※質問で使用していたコードは、僕では先に進めなかったので・・・

僕はこの中のyoshiさんのプログラムを使用して、プログラム電卓
(式が液晶に表示される電卓)みたいなのに流用させて頂きました。
(他にも、いろいろと四則計算に絡む回答が沢山あります)

何度がここで質問させて頂いて、いろんな方にお世話になりました。
(まだ現在進行形です・・・) コードを書いたり助言はできませんが、
こう言う事ででも恩返しできれば・・・と思い書き込みさせて頂きました。
淡幻星さんの意図としているものかどうかわかりませんが、
ご覧になってみて下さい。


通報する
ページトップ
   
 記事の件名: Re: 四則算について
投稿記事Posted: 2007年10月14日(日) 02:23 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
住所: 宮城県
≫つっちーさん
コメントをありがとうございます。
ほんと、数式を文字列として認識しての計算を難しいですね。


残念ながら、紹介いただいた記事は知ってました。
# 数学関数式の計算がメインのようでしたので、
# ちょっと目的が違うと思い、スルーしてました(^^;)。


なんとか、逆ポーランド記法を利用した四則算が完成しました。
参考までに、こんな感じになってます。


お互い、ABプログラミングをがんばっていきましょう。
# あ、興味ありましたら是非プラグイン作成にご参加くださいませ(笑)。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke