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

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: txtの文字をクリップボードに

by tak » 2007年4月09日(月) 16:15

イグトランス さんが書きました: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() しているサンプルもあればしていないサンプルもあったり・・・。
結局どちらが正しいのか判断できませんでした。すみません。

コードモジュール

by Tomorrow » 2007年4月08日(日) 14:47

実践コードモジュールにクリップボード操作用のクラスがあったはずなので、それを使えば簡単だと思うのですが。。。

by イグトランス » 2007年4月08日(日) 09:51

SetClipborardDataしたものはGlobalFreeをする必要がない,というよりしてはなりません。

by カムさん » 2007年4月08日(日) 08:18

失礼します。

クリップボードに取り付けする作業を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回目がうまく取り付けできません。
どこがいけないのですか。

by old » 2007年4月07日(土) 14:59

うまくできました。ありがとうございます。

by konisi » 2007年4月07日(土) 13:32

適当にググったら(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

by Str$(old) » 2007年4月07日(土) 13:13

StrPtr関数をうまく使えました、ありがとうございます。
しかし、txtから読み込めてもクリップボードにセットできません。

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

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

by konisi » 2007年4月07日(土) 12:45

ファイル系Input文を使う時は、String型にしないといけなかった気がします。
String型→BytePtr型の変換にはStrPtr関数が使えます。

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

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

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

by Str$(old) » 2007年4月06日(金) 21:49

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はどのような変数定義にすればいいのですか。

ページトップ