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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Str$(old)

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

#1 投稿記事 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はどのような変数定義にすればいいのですか。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 by konisi »

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

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

ところで、EmptyClipboard関数が、定義されてるだけで使われていないように見えるんですが・・・?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

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

#3 投稿記事 by Str$(old) »

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

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

そうすると空にできますが、セットができません。
どこがいけないのでしょうか、教えてください。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#4 投稿記事 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
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

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

#5 投稿記事 by old »

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

#6 投稿記事 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回目がうまく取り付けできません。
どこがいけないのですか。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#7 投稿記事 by イグトランス »

SetClipborardDataしたものはGlobalFreeをする必要がない,というよりしてはなりません。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

コードモジュール

#8 投稿記事 by Tomorrow »

実践コードモジュールにクリップボード操作用のクラスがあったはずなので、それを使えば簡単だと思うのですが。。。
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

#9 投稿記事 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() しているサンプルもあればしていないサンプルもあったり・・・。
結局どちらが正しいのか判断できませんでした。すみません。
返信する