ページ 11

txtの文字をクリップボードに

Posted: 2007年4月06日(金) 21:49
by Str$(old)
Open "1.txt" For Input As 1
Input #1,date
Close 1

OpenClipboard(0)
Declare Function EmptyClipboard Lib "user32" ( ) As Long
SetClipboardData(CF_DSPTEXT,date)
CloseClipboard()

で、クリップボードにtxtの文字列をコピーしたいのですが、
Dim date As BytePtr としても失敗してしまいます。
dateはどのような変数定義にすればいいのですか。

Posted: 2007年4月07日(土) 12:45
by konisi
ファイル系Input文を使う時は、String型にしないといけなかった気がします。
String型→BytePtr型の変換にはStrPtr関数が使えます。

date:日付
data:データ、資料

ところで、EmptyClipboard関数が、定義されてるだけで使われていないように見えるんですが・・・?

Posted: 2007年4月07日(土) 13:13
by Str$(old)
StrPtr関数をうまく使えました、ありがとうございます。
しかし、txtから読み込めてもクリップボードにセットできません。

Declare Function EmptyClipboard Lib "user32" ( ) As Long
は、
EmptyClipboard() と変更すれば良いのですか?

そうすると空にできますが、セットができません。
どこがいけないのでしょうか、教えてください。

Posted: 2007年4月07日(土) 13:32
by konisi
適当にググったら(Cですが)コードが出てきた。
ABに移植するとこんな感じ

コード: 全て選択

Dim data As String
Dim lpText As BytePtr,hText As HGLOBAL

Open "1.txt" For Input As 1
Input #1,data
Close 1

hText=GlobalAlloc(GMEM_DDESHARE Or GMEM_MOVEABLE,Len(data)+1)
lpText=GlobalLock(hText)
lstrcpy(lpText,StrPtr(data))
GlobalUnlock(hText)

OpenClipboard(0)
EmptyClipboard()
SetClipboardData(CF_TEXT,hText)
CloseClipboard()

GlobalFree(hText)
http://nienie.com/~masapico/api_SetClipboardData.html

Posted: 2007年4月07日(土) 14:59
by old
うまくできました。ありがとうございます。

Posted: 2007年4月08日(日) 08:18
by カムさん
失礼します。

クリップボードに取り付けする作業を2回やりたいのですが、

Open "2.txt" For Input As 1
Input #1,data
Close 1

hText=GlobalAlloc(GMEM_DDESHARE Or GMEM_MOVEABLE,Len(data)+1)
lpText=GlobalLock(hText)
lstrcpy(lpText,StrPtr(data))
GlobalUnlock(hText)

OpenClipboard(0)
EmptyClipboard()
SetClipboardData(CF_TEXT,hText)
CloseClipboard()

GlobalFree(hText)

とkonisiさんのコードに付け加えても、2回目がうまく取り付けできません。
どこがいけないのですか。

Posted: 2007年4月08日(日) 09:51
by イグトランス
SetClipborardDataしたものはGlobalFreeをする必要がない,というよりしてはなりません。

コードモジュール

Posted: 2007年4月08日(日) 14:47
by Tomorrow
実践コードモジュールにクリップボード操作用のクラスがあったはずなので、それを使えば簡単だと思うのですが。。。

Posted: 2007年4月09日(月) 16:15
by tak
イグトランス さんが書きました:SetClipborardDataしたものはGlobalFreeをする必要がない,というよりしてはなりません。
このへんがかなり気になったので調べてみました。

SetClipboardData (日本語)
アプリケーションはデータを読み取れますが、CloseClipboard 関数を呼び出すまでは、そのハンドルを解放することや、ロックし続けることを避けなければなりません。
日本語版では「CloseClipboard() するまではメモリを解放してはいけない」となっていて、見方を変えると「CloseClipboard() したらメモリを解放してもよい(すべき?)」てな感じに受け取れます。

SetClipboardData Function (英語)
The application may not write to or free the data once ownership has been transferred to the system, but it can lock and read from the data until the CloseClipboard function is called.
あれ?なんか言ってること全然違うような・・・

どちらの情報が正しいのかはこれだけでは判断できないのでサンプルプログラムもあさってみたのですが、困ったことに MS 公式の文書でも、事後に GlobalFree() しているサンプルもあればしていないサンプルもあったり・・・。
結局どちらが正しいのか判断できませんでした。すみません。