ab.com コミュニティ https://www.activebasic.com/forum/ |
|
取得、結合を行う関数 https://www.activebasic.com/forum/viewtopic.php?t=1505 |
ページ 1 / 1 |
作成者: | 雷電 [ 2006年8月31日(木) 19:02 ] |
記事の件名: | 取得、結合を行う関数 |
関数の説明 SelUnite関数: 二つのアイテムの文字列を取得して、結合させる関数。 パラメータを少なくするのにてこずった・・・ パラメータ: nID1・・・結合させる文字列のあるアイテムのハンドル nID2・・・結合する文字列のあるアイテムのハンドル AfterUnion・・・結合後の文字列を格納する文字列変数 定義は こちら [ここをクリックすると内容が表示されます]
パラメータの数は多くなったが、GetDlgItem関数を使わないようにしたバージョンコード: 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を使わないバージョンの定義 [ここをクリックすると内容が表示されます]
コード: 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 使用例 [ここをクリックすると内容が表示されます]
追記:この関数は、ActiveBasic Ver4.24で動作確認しています。
コード: 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 |
作成者: | 7 [ 2006年8月31日(木) 21:32 ] |
記事の件名: | Re: 取得、結合を行う関数 |
> 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 あ。ユーザー登録してますね! |
作成者: | 雷電 [ 2006年8月31日(木) 21:38 ] |
記事の件名: | |
失礼しました 訂正しておきます。 訂正バージョン [ここをクリックすると内容が表示されます]
7さんは配列を使っておられますね。コード: 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 配列を使うとどうしてもメモリ使用率が高くなってしまうので、なるべく避けています。 |
作成者: | Indigo Visualist [ 2006年9月01日(金) 01:51 ] |
記事の件名: | |
ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。 メモリ使用率もそれほど気にする必要はないのではないでしょうか? 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。 |
作成者: | 雷電 [ 2006年9月01日(金) 12:59 ] |
記事の件名: | |
引用: > ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。
> メモリ使用率もそれほど気にする必要はないのではないでしょうか? > 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、 > 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。 コード: If Data="" Then SelUnite=0 Exit Function End Ifこのコードが入っています。失敗すれば、0が返ります。 戻り値はちゃんと設定してあります。 |
作成者: | Mario2 [ 2006年9月01日(金) 13:54 ] |
記事の件名: | |
引用: 引用: > ええと、7さんのようにSelUnite=1なりTRUEなりを返さないと、意味がないと思います。
> メモリ使用率もそれほど気にする必要はないのではないでしょうか? > 配列を使わずに書けるコードなら気にするほどのメモリを使っているとは思えませんし、 > 逆にメモリを大量消費するようなコードは、配列を使わないと流石に管理が大変だと思いますから。 コード: If Data="" Then SelUnite=0 Exit Function End If このコードが入っています。失敗すれば、0が返ります。 戻り値はちゃんと設定してあります。 だから、失敗しても成功しても0を返すような感じがします。 と言う事を、Indigo Visualistさんは言いたかったのだと思いますが・・・・見当違いならすいません。 だから、End Ifの次の行にでも"SelUnite=TRUE"と付け足せば成功なら1、失敗なら0が返ってくるのだと思います。 |
作成者: | 雷電 [ 2006年9月01日(金) 13:59 ] |
記事の件名: | |
それが抜けてました。 失礼しました・・・ 訂正します。 訂正②バージョン [ここをクリックすると内容が表示されます]
コード: 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 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |