作成者 |
メッセージ |
|
|
それが抜けてました。
失礼しました・・・
訂正します。
訂正②バージョン [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Function SelUnite(ByVal nID1 As HWND, ByVal nID2 As HWND, ByRef AfterUnion As String) As Long
Dim ByteLen1 As DWord
Dim ByteLen2 As DWord
Dim buffer1 As BytePtr
Dim buffer2 As BytePtr
Dim Data As String
ByteLen1=GetWindowTextLength(nID1)
ByteLen2=GetWindowTextLength(nID2)
buffer1=malloc(ByteLen1+1)
buffer2=malloc(ByteLen2+1)
GetWindowText(nID1,buffer1,ByteLen1+1)
GetWindowText(nID2,buffer2,ByteLen2+1)
Data=lstrcat(buffer1,buffer2)
free(buffer1)
free(buffer2)
If Data="" Then
SelUnite=0
Exit Function
End If
SelUnite=1
AfterUnion=Data
End Function
それが抜けてました。
失礼しました・・・
訂正します。
[hide=訂正②バージョン][code]Function SelUnite(ByVal nID1 As HWND, ByVal nID2 As HWND, ByRef AfterUnion As String) As Long Dim ByteLen1 As DWord Dim ByteLen2 As DWord Dim buffer1 As BytePtr Dim buffer2 As BytePtr Dim Data As String
ByteLen1=GetWindowTextLength(nID1) ByteLen2=GetWindowTextLength(nID2) buffer1=malloc(ByteLen1+1) buffer2=malloc(ByteLen2+1) GetWindowText(nID1,buffer1,ByteLen1+1) GetWindowText(nID2,buffer2,ByteLen2+1)
Data=lstrcat(buffer1,buffer2)
free(buffer1) free(buffer2)
If Data="" Then SelUnite=0 Exit Function End If SelUnite=1
AfterUnion=Data End Function[/code][/hide]
|
|
|
投稿記事 |
Posted: 2006年9月01日(金) 13:59 |
|
|
|
|
|
引用: 引用: > ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。
> メモリ使用率もそれほど気にする必要はないのではないでしょうか?
> 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、
> 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。
コード: If Data="" Then
SelUnite=0
Exit Function
End If
このコードが入っています。失敗すれば、0が返ります。
戻り値はちゃんと設定してあります。
勘違いならすいませんが、関数って、(この場合"SelUnite"は)最初から0(FALSE)だったのでは?
だから、失敗しても成功しても0を返すような感じがします。
と言う事を、Indigo Visualistさんは言いたかったのだと思いますが・・・・見当違いならすいません。
だから、End Ifの次の行にでも"SelUnite=TRUE"と付け足せば成功なら1、失敗なら0が返ってくるのだと思います。
[quote] [quote]> ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。 > メモリ使用率もそれほど気にする必要はないのではないでしょうか? > 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、 > 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。[/quote] [code]If Data="" Then SelUnite=0 Exit Function End If[/code] このコードが入っています。失敗すれば、0が返ります。 戻り値はちゃんと設定してあります。[/quote]
勘違いならすいませんが、関数って、(この場合"SelUnite"は)最初から0(FALSE)だったのでは? だから、失敗しても成功しても0を返すような感じがします。 と言う事を、Indigo Visualistさんは言いたかったのだと思いますが・・・・見当違いならすいません。 だから、End Ifの次の行にでも"SelUnite=TRUE"と付け足せば成功なら1、失敗なら0が返ってくるのだと思います。
|
|
|
投稿記事 |
Posted: 2006年9月01日(金) 13:54 |
|
|
|
|
|
引用: > ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。
> メモリ使用率もそれほど気にする必要はないのではないでしょうか?
> 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、
> 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。
コード: If Data="" Then
SelUnite=0
Exit Function
End If
このコードが入っています。失敗すれば、0が返ります。
戻り値はちゃんと設定してあります。
[quote]> ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。 > メモリ使用率もそれほど気にする必要はないのではないでしょうか? > 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、 > 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。[/quote]
[code]If Data="" Then SelUnite=0 Exit Function End If[/code]
このコードが入っています。失敗すれば、0が返ります。 戻り値はちゃんと設定してあります。
|
|
|
投稿記事 |
Posted: 2006年9月01日(金) 12:59 |
|
|
|
|
|
ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。
メモリ使用率もそれほど気にする必要はないのではないでしょうか?
配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、
逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。
ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。 メモリ使用率もそれほど気にする必要はないのではないでしょうか? 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。
|
|
|
投稿記事 |
Posted: 2006年9月01日(金) 01:51 |
|
|
|
|
|
失礼しました
訂正しておきます。
訂正バージョン [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Function SelUnite(ByVal nID1 As HWND, ByVal nID2 As HWND, ByRef AfterUnion As String) As Long
Dim ByteLen1 As DWord
Dim ByteLen2 As DWord
Dim buffer1 As BytePtr
Dim buffer2 As BytePtr
Dim Data As String
ByteLen1=GetWindowTextLength(nID1)
ByteLen2=GetWindowTextLength(nID2)
buffer1=malloc(ByteLen1+1)
buffer2=malloc(ByteLen2+1)
GetWindowText(nID1,buffer1,ByteLen1+1)
GetWindowText(nID2,buffer2,ByteLen2+1)
Data=lstrcat(buffer1,buffer2)
free(buffer1)
free(buffer2)
If Data="" Then
SelUnite=0
Exit Function
End If
SelUnite=1
AfterUnion=Data
End Function
7さんは配列を使っておられますね。
配列を使うとどうしてもメモリ使用率が高くなってしまうので、なるべく避けています。
失礼しました
訂正しておきます。
[hide=訂正バージョン][code]Function SelUnite(ByVal nID1 As HWND, ByVal nID2 As HWND, ByRef AfterUnion As String) As Long Dim ByteLen1 As DWord Dim ByteLen2 As DWord Dim buffer1 As BytePtr Dim buffer2 As BytePtr Dim Data As String
ByteLen1=GetWindowTextLength(nID1) ByteLen2=GetWindowTextLength(nID2) buffer1=malloc(ByteLen1+1) buffer2=malloc(ByteLen2+1) GetWindowText(nID1,buffer1,ByteLen1+1) GetWindowText(nID2,buffer2,ByteLen2+1)
Data=lstrcat(buffer1,buffer2)
free(buffer1) free(buffer2)
If Data="" Then SelUnite=0 Exit Function End If SelUnite=1
AfterUnion=Data End Function[/code][/hide]
7さんは配列を使っておられますね。 配列を使うとどうしてもメモリ使用率が高くなってしまうので、なるべく避けています。
|
|
|
投稿記事 |
Posted: 2006年8月31日(木) 21:38 |
|
|
|
|
|
> nID1・・・結合させる文字列のあるアイテムのハンドル
> nID2・・・結合する文字列のあるアイテムのハンドル
> buffer1=malloc(nID1+1)
> buffer2=malloc(nID2+1)
nID1がアイテムのハンドルだと分かっているのに、どうしてmalloc関数に指定してしまうんでしょう?
malloc関数に渡すべき値はハンドルではなくて、確保するメモリのサイズです。
ご自分で気付いているか分かりませんが、雷電さんはたまにそういうことをしています。
数値でしか表現されないので分かり辛いかもしれませんが、どういった意味を持つ数値なのかをしっかり把握しましょう...。
自分も作ってみましたが、もっと良い方法があるような気がします [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Function SelUnite(ByVal nDlgItem1 As HWND,ByVal nDlgItem2 As HWND,ByRef AfterUnion As String) As BOOL
Dim lpStr[2] As LPSTR
Dim length[1] As Long
length[0]=GetWindowTextLength(nDlgItem1)
length[1]=GetWindowTextLength(nDlgItem2)
lpStr[0]=calloc(length[0]+1)
lpStr[1]=calloc(length[1]+1)
lpStr[2]=calloc(length[0]+length[1]+1)
GetWindowText(nDlgItem1,lpStr[0],length[0]+1)
GetWindowText(nDlgItem2,lpStr[1],length[1]+1)
memcpy(lpStr[2],lpStr[0],length[0])
memcpy(lpStr[2]+length[0],lpStr[1],length[1])
If lpStr[2][0]=0 Then
SelUnite=FALSE
Else
SelUnite=TRUE
AfterUnion=MakeStr(lpStr[2])
End If
free(lpStr[0])
free(lpStr[1])
free(lpStr[2])
End Function
追記。
あ。ユーザー登録してますね!
> [b]nID1[/b]・・・結合させる文字列のあるアイテムのハンドル > [b]nID2[/b]・・・結合する文字列のあるアイテムのハンドル > buffer1=malloc(nID1+1) > buffer2=malloc(nID2+1) [b]nID1[/b]がアイテムのハンドルだと分かっているのに、どうしてmalloc関数に指定してしまうんでしょう? malloc関数に渡すべき値はハンドルではなくて、確保するメモリのサイズです。
ご自分で気付いているか分かりませんが、雷電さんはたまにそういうことをしています。 数値でしか表現されないので分かり辛いかもしれませんが、どういった意味を持つ数値なのかをしっかり把握しましょう...。
[hide=自分も作ってみましたが、もっと良い方法があるような気がします][code]Function SelUnite(ByVal nDlgItem1 As HWND,ByVal nDlgItem2 As HWND,ByRef AfterUnion As String) As BOOL Dim lpStr[2] As LPSTR Dim length[1] As Long
length[0]=GetWindowTextLength(nDlgItem1) length[1]=GetWindowTextLength(nDlgItem2)
lpStr[0]=calloc(length[0]+1) lpStr[1]=calloc(length[1]+1) lpStr[2]=calloc(length[0]+length[1]+1)
GetWindowText(nDlgItem1,lpStr[0],length[0]+1) GetWindowText(nDlgItem2,lpStr[1],length[1]+1)
memcpy(lpStr[2],lpStr[0],length[0]) memcpy(lpStr[2]+length[0],lpStr[1],length[1])
If lpStr[2][0]=0 Then SelUnite=FALSE Else SelUnite=TRUE AfterUnion=MakeStr(lpStr[2]) End If
free(lpStr[0]) free(lpStr[1]) free(lpStr[2]) End Function[/code][/hide]
追記。 あ。ユーザー登録してますね!
|
|
|
投稿記事 |
Posted: 2006年8月31日(木) 21:32 |
|
|
|
|
|
関数の説明
SelUnite関数:
二つのアイテムの文字列を取得して、結合させる関数。
パラメータを少なくするのにてこずった・・・
パラメータ:
nID1・・・結合させる文字列のあるアイテムのハンドル
nID2・・・結合する文字列のあるアイテムのハンドル
AfterUnion・・・結合後の文字列を格納する文字列変数
定義は
こちら [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Function SelUnite(ByVal nID1 As HWND, ByVal nID2 As HWND, ByRef AfterUnion As String) As Long
Dim ByteLen1 As DWord
Dim ByteLen2 As DWord
Dim buffer1 As BytePtr
Dim buffer2 As BytePtr
Dim Data As String
ByteLen1=GetWindowTextLength(nID1)
ByteLen2=GetWindowTextLength(nID2)
buffer1=malloc(ByteLen1+1)
buffer2=malloc(ByteLen2+1)
GetWindowText(nID1,buffer1,ByteLen1+1)
GetWindowText(nID2,buffer2,ByteLen2+1)
Data=lstrcat(buffer1,buffer2)
free(buffer1)
free(buffer2)
If Data="" Then
SelUnite=0
Exit Function
End If
SelUnite=1
AfterUnion=Data
End Function
パラメータの数は多くなったが、GetDlgItem関数を使わないようにしたバージョン
※これは上記の関数と一緒に定義してください。
使用例 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: Sub MainWnd_CommandButton1_Click()
Dim hEdit1 As HWND
Dim hEdit2 As HWND
Dim StringData As String
hEdit1=GetDlgItem(hMainWnd,EditBox1)
hEdit2=GetDlgItem(hMainWnd,EditBox2)
SelUnite(hEdit1,hEdit2,StringData)
MessageBox(hMainWnd,StringData,"結果",0)
End Sub
追記:この関数は、ActiveBasic Ver4.24で動作確認しています。
関数の説明
SelUnite関数:
二つのアイテムの文字列を取得して、結合させる関数。 パラメータを少なくするのにてこずった・・・
パラメータ:
[b]nID1[/b]・・・結合させる文字列のあるアイテムのハンドル [b]nID2[/b]・・・結合する文字列のあるアイテムのハンドル [b]AfterUnion[/b]・・・結合後の文字列を格納する文字列変数
定義は [hide=こちら][code]Function SelUnite(ByVal nID1 As HWND, ByVal nID2 As HWND, ByRef AfterUnion As String) As Long Dim ByteLen1 As DWord Dim ByteLen2 As DWord Dim buffer1 As BytePtr Dim buffer2 As BytePtr Dim Data As String
ByteLen1=GetWindowTextLength(nID1) ByteLen2=GetWindowTextLength(nID2) buffer1=malloc(ByteLen1+1) buffer2=malloc(ByteLen2+1) GetWindowText(nID1,buffer1,ByteLen1+1) GetWindowText(nID2,buffer2,ByteLen2+1)
Data=lstrcat(buffer1,buffer2)
free(buffer1) free(buffer2)
If Data="" Then SelUnite=0 Exit Function End If SelUnite=1
AfterUnion=Data End Function[/code][/hide]
パラメータの数は多くなったが、GetDlgItem関数を使わないようにしたバージョン [color=red]※これは上記の関数と一緒に定義してください。[/color] [hide=GetDlgItemを使わないバージョンの定義][code]Function StringUnion(ByVal hDlg1 As DWord, ByVal nID1 As Long, ByVal hDlg2 As DWord, ByVal nID2 As Long, ByRef Union As String) As Long StringUnion=SelUnite(GetDlgItem(hDlg1,nID1),GetDlgItem(hDlg2,nID2),Union) As Long End Function[/code][/hide]
[hide=使用例][code]Sub MainWnd_CommandButton1_Click() Dim hEdit1 As HWND Dim hEdit2 As HWND Dim StringData As String
hEdit1=GetDlgItem(hMainWnd,EditBox1) hEdit2=GetDlgItem(hMainWnd,EditBox2) SelUnite(hEdit1,hEdit2,StringData)
MessageBox(hMainWnd,StringData,"結果",0) End Sub[/code][/hide]
追記:この関数は、ActiveBasic Ver4.24で動作確認しています。
|
|
|
投稿記事 |
Posted: 2006年8月31日(木) 19:02 |
|
|
|
|