あまつぶ

1.31 3:30 【クリップボード】

 DelStyle_FKEYっていうFKEYを作った。テキストをコピーした時にスタイル情報を消してコピーしたテキストの情報だけにしてくれるというもの。うちはPostinoというメーラーを使っているのだけどスタイル付きのテキストをペーストするとメールの文章がスタイル付きになってしまって(実際に送られるメールはプレーンテキストなのだけど)どうにも見づらいのでペーストする前にスタイル情報を破棄してやればいいんじゃないかと考えたのだ。
 で、ほとんど考える間もなく完成して動作確認もしたのだが、わざわざ1つのソフトとしてリリースするほどのものでもないのでソース公開して「必要な人は自分でコンパイルしてください」ということにしてしまおう(笑)。例によってメインとなるルーチンのみ。FKEYだからmainからこの関数を呼んでやるようにするだけだけど。

/* スタイル情報の破棄をする */
void DeleteStyle(void)
{
	long		dataSize,offset,result;
	Handle	dataH;
	
	dataSize=GetScrap(nil,'TEXT',&offset);
	if (dataSize == 0)
		return;
	
	dataH=NewHandle(dataSize);
	if (dataH == nil)
	{
		SysBeep(0);
		return;
	}
	
	dataSize=GetScrap(dataH,'TEXT',&offset);
	
	result=ZeroScrap();
	
	result=PutScrap(dataSize,'TEXT',*dataH);
	
	DisposeHandle(dataH);
}


要はテキスト情報だけを一度メモリに読み込んでクリップボードの中身を消し、読み込んでおいたテキスト情報をクリップボードに書き出すというだけ。読み込むためのメモリが確保できなかった場合にはテンポラリメモリを使用するなどするという改良の余地は残されているがまあこんなもんかな。あるいはメモリに読み込まずにクリップボードの内容を直接編集するという手もあるのかも知れないが方法がわからないのでこんなもので。
 クリップボードになにかを入れる場合に忘れやすいのが「ZeroScrap」。これを呼んでクリップボードの内容を破棄してやらないとその後のPutScrapでうまくデータがコピーできない。同じタイプのものが入っていなければ一応は問題ないが、普通は先に破棄するべきだろう。

 で、今日のToolboxはクリップボード関連で主に使う3つのルーチンを解説。「ZeroScrap、GetScrap、PutScrap」の3つ。

pascal long	ZeroScrap(void);
クリップボードの中身を消す。クリップボードの内容をいじる前に呼び出す。
返り値	エラー値。
pascal long	GetScrap(Handle hDest,ResType theType,long *offset);
クリップボードからデータを取り出す。
返り値	データのサイズ。
hDest	データをおさめるハンドル。nilを指定するとサイズを返すだけ。
theType	取り出すデータのタイプ。('TEXT'とか)
offset	クリップボードのデータ内での位置。
pascal long	PutScrap(long length,ResType theType,Ptr source);
クリップボードにデータをおさめる。
返り値	エラー値。
length	おさめるデータの長さ。
theType	おさめるデータのタイプ。
source	おさめるデータの入ったポインタ。こちらはポインタ。


GetScrapではハンドルを指定、PutScrapではポインタを指定というのも間違いやすいかも知れない。データを取り出す場合には再配置の可能なハンドルに読み込み、書き込む時には扱いが簡単なポインタを使うということだと思う。
 はじめて作ったのであんまり見やすくないかも知れないけど、そのあたりについては今後の課題ということで(笑)。

 Navigation Servicesのことを書こうかと思ったけど長くなったのでこんなもので。次回はおそらく例のパズルの結果発表+解説(?)かな。

to January 30, 1999 ↑ to January index → to February 1, 1999