御指導願えませんか?

返信する


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

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

トピックのレビュー
   

展開ビュー トピックのレビュー: 御指導願えませんか?

by mako » 2006年5月09日(火) 18:49

]7さん、お忙しい中有難う御座いました。

ちょっと私の説明が悪かったせいで真意が上手く伝わらなかったのかな?と思います。しかし、7さんのヒント?!を元に何とか本来思い描いてた物が何とか出来ました。
長い間お付き合い下さり大変感謝致します。

>これはlstrlen()関数というのがあって、すごく簡単です。
lstrlenを最初に使って試してみたのですがfree()を忘れてまして・・・
その為、どうすれば良いのかお手上げ状態になってました。

by mako » 2006年5月09日(火) 18:49

]7さん、お忙しい中有難う御座いました。

ちょっと私の説明が悪かったせいで真意が上手く伝わらなかったのかな?と思います。しかし、7さんのヒント?!を元に何とか本来思い描いてた物が何とか出来ました。
長い間お付き合い下さり大変感謝致します。

>これはlstrlen()関数というのがあって、すごく簡単です。
lstrlenを最初に使って試してみたのですがfree()を忘れてまして・・・
その為、どうすれば良いのかお手上げ状態になってました。

by 7 » 2006年5月08日(月) 19:42

> EditBox1にURLを入力後ボタン1でEditBox1の内容を取得し
> EditBox2へ入力されたURLをそのまま出力しようと思ってるのですが、全て1行目のURLとなってしまいます。
> 1行のみの入力の場合は思った通りの動作を行うのですが複数行になると上手く動いてくれません。
単にEditBox1の内容をEditBox2に出力するなら以下のようになります。 > 1.EditBox1に入力された文字がURL以外の場合のエラー処理のやり方
>  (EditBox2にURLではありません と出力したい)
文字列が "http://" で始まるかどうかでURLかそうじゃないかを判断してしまいます。 > 2.EditBox_GetLineで取得したaddressのバイト数の取得方法
>  (今は適当な数値を入力してます)
これはlstrlen()関数というのがあって、すごく簡単です。 > 3.希望する動作を行うにはどう修正したら良いのでしょうか?
>  2.が原因とも思えないので・・・
希望する動作の全体像がよく分からないのと、面倒くさくて...以上を参考に自分の力でできませんか?
自作関数を使ってるのでメンテナンスとか色々問題あると思いますけど...。

追記。
コードを載せる場合、BBCodeの code を hide で挟むといいですよ。

by mako » 2006年5月08日(月) 15:19

EditBox1にURLを入力後ボタン1でEditBox1の内容を取得し
EditBox2へ入力されたURLをそのまま出力しようと思ってるのですが、全て1行目のURLとなってしまいます。
1行のみの入力の場合は思った通りの動作を行うのですが複数行になると上手く動いてくれません。

※本来はそれぞれのURLへアクセス後、ソースから必要な個所だけ抜き出したいのですが簡略化しURLの表示としてあります。

①EditBox1に入力された文字がURL以外の場合のエラー処理のやり方
 (EditBox2にURLではありません と出力したい)
②EditBox_GetLineで取得したaddressのバイト数の取得方法
 (今は適当な数値を入力してます)
③希望する動作を行うにはどう修正したら良いのでしょうか?
 ②が原因とも思えないので・・・
 
度々お手数をお掛けしますが宜しくお願いします。

コード: 全て選択


'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

'ネット関係
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As BytePtr,_
	ByVal lAccessType As Long, ByVal sProxyName As BytePtr,ByVal sProxyBypass As BytePtr,_
	ByVal lFlags As Long) As Long
Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long,_
	ByVal sUrl As BytePtr,ByVal sHeaders As BytePtr, ByVal lHeadersLength As Long, _
	ByVal lFlags As Long, ByVal lContext As Long) As Long
Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As BytePtr,_
	ByVal lNumBytesToRead As Long,lNumberOfBytesRead As Long) As Integer
Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

'行のカウント
Function EditBox_GetLineCount(ByVal hWnd As HWND)
    EditBox_GetLineCount=SendMessage(hWnd,EM_GETLINECOUNT,NULL,NULL)
End Function

'1行の取得
Function EditBox_GetLine(ByVal hWnd As HWND,ByVal nIndex As Long) As BytePtr
Dim length[2] As Long
    'nIndex が全体の何バイト目なのかを格納。
    length[0]=SendMessage(hWnd,EM_LINEINDEX,nIndex,NULL)

    If length[0]<>-1 Then
        'nIndex の次の行が全体の何バイト目なのかを格納。
        length[1]=SendMessage(hWnd,EM_LINEINDEX,nIndex+1,NULL)
        If length[1]<>-1 Then
            'nIndex のバイト数を格納。
            length[2]=length[1]-length[0]
        Else
            'nIndex のバイト数を格納。
            length[2]=GetWindowTextLength(hWnd)-length[0]
        End If
    End If

    EditBox_GetLine=calloc(length[2]+1)
    If length[2] Then
        SetWord(EditBox_GetLine,length[2]+1)
        EditBox_GetLine[SendMessage(hWnd,EM_GETLINE,nIndex,EditBox_GetLine)]=0
    End If
End Function


'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	net_DestroyObjects()
	PostQuitMessage(0)
End Sub

'netの処理
Sub MainWnd_CommandButton1_Click()

	Dim hEdit As HWND
	Dim cnt As Long
	Dim address As BytePtr
	Dim buf As String
	Dim html As String
	Dim length As Long, open As Long, bufSize As Long, url As Long
	Dim strBuf As String
		
		 hEdit=GetDlgItem(hMainWnd,EditBox1)
		 For cnt=1 To EditBox_GetLineCount(hEdit)
	     address=EditBox_GetLine(hEdit,cnt)
		 length=48'Len(MakeStr(address))+1
	   	address=calloc(length+2)'+2はダブルコーテーションの為
    	GetWindowText(hEdit,address,length)

	buf=ZeroString(1001)
	open=InternetOpen(0,0,0,0,0)
	If open=NULL Then 
	Exit Function
	End If
	
	url=InternetOpenUrl(open,address,0,0,0,0)
	If url=NULL Then
		InternetCloseHandle(open)
		Exit Function
	End If
	bufSize=Len(buf)
'	free(address)

Do
	InternetReadFile(url,buf,1000,VarPtr(bufSize))
	html=html+Left$(buf,InStr(1,buf,Chr$(0))-1)
Loop While bufSize<>0
InternetCloseHandle(open)

	strBuf=strBuf+MakeStr(address)+Ex"\r\n"
	free(address)
	Next

SetWindowText(GetDlgItem(hMainWnd,EditBox2),strBuf)

End Sub

by mako » 2006年5月01日(月) 19:48

> 最近寝るのが随分と遅くなってしまいまして...。
何だか申し訳無いです。。。

> ActiveBasicのRADツールはウィンドウを作るだけ、っていう感じなのでそういう処理はユーザーが書きます。
どうやらちょっと私はRADツールに対して過度な期待と勘違いをしてたみたいですね・・・。

> 「表示」「プロジェクトオプション」「Win32API」「コモンコントロールを使用する」にチェックを入れて、プログレスバーを配置したら、色んなイベント時にプログレスバーに対し、PBM_***をSendMessage()関数で送信します。
> 例えばプログレスバーの範囲を設定する場合は、PBM_SETRANGEを送信します。
例えで書いたつもりだったのですが、自作関数まで・・・
折角書いて頂いたのですが使用方法がよく理解出来ません。。。
先で理解出来る様になった時に参考にさせて頂きます。

> ActiveBasicの変数の型の書き方が以前と異なったから、引数の設定も異なるんじゃないでしょうか。
> あと同じ関数名で引数の数や型が違う場合も引数の設定は異なります。
ABのバージョンが変わると引数の設定まで変わるんですね!
勉強になりました。

by 7 » 2006年5月01日(月) 13:06

> 7さん、深夜遅くにレス頂いてたのですね
最近寝るのが随分と遅くなってしまいまして...。

> 例えばプログレスバーを追加したいと思った場合等
> 処理が完了するまでの表示方法をどうすれば動作するのか検討もつきません。
ActiveBasicのRADツールはウィンドウを作るだけ、っていう感じなのでそういう処理はユーザーが書きます。
「表示」「プロジェクトオプション」「Win32API」「コモンコントロールを使用する」にチェックを入れて、プログレスバーを配置したら、色んなイベント時にプログレスバーに対し、PBM_***をSendMessage()関数で送信します。
例えばプログレスバーの範囲を設定する場合は、PBM_SETRANGEを送信します。 処理を始める前にプログレスバーの位置と範囲と進行幅を設定し、処理が一つ終わる度に進行幅を増加させるといった感じです。
幅を 0,10、位置を 0、進行幅を 1、とした場合、ProgressBar_StepIt()関数を10回繰り返すとプログレスバーが満タンになります。
分かり辛い説明かもしれません...。

> 引数の設定が同じAPIでも異なるのは何故なのでしょう?
ActiveBasicの変数の型の書き方が以前と異なったから、引数の設定も異なるんじゃないでしょうか。
あと同じ関数名で引数の数や型が違う場合も引数の設定は異なります。

by mako » 2006年5月01日(月) 11:42

7さん、深夜遅くにレス頂いてたのですね
有難う御座います。

> > RADツール関連の事はどうやって調べたら良いのでしょうか?
> > ヘルプセンター内のRADツールのみでは全然わからないので・・・
> RADツールでこれがしたいんだけど、って問題を提示して貰わないと使って覚える、としか言いようが無いですね...。
ちょっと言葉が思いつかないのですが、
例えばプログレスバーを追加したいと思った場合等
処理が完了するまでの表示方法をどうすれば動作するのか検討もつきません。

こちらに書き込みをさせて頂いて答えて頂く事で時間も掛らないし、何も苦労はないのですが、それだと進歩が無いと言うか・・・・
その都度皆さんの手を煩わしてしまうので。
(実際にお聞きしてるのに偉そうな事を書いてすいません)
それでRADツールについて説明してるHP等があればと思ってお尋ねしてみた次第です。

紹介して頂いたHPもちょっと簡単に書きすぎてて、私が希望する内容とは少し違っていました。

後から後から質問して申し訳無いのですが
引数の設定が同じAPIでも異なるのは何故なのでしょう?

コード: 全て選択


Declare Function InternetReadFile Lib "wininet" (
    ByVal hFile As HINTERNET,
    ByVal sBuffer As BytePtr,
    ByVal lNumBytesToRead As DWord,
    ByVal lNumberOfBytesRead As DWORD_PTR) As BOOL

		↑
		↓

Declare Function InternetReadFile Lib "wininet.dll" (
    ByVal hFile As Long,
    ByVal sBuffer As BytePtr,
    ByVal lNumBytesToRead As Long,
    lNumberOfBytesRead As Long) As Integer

by 7 » 2006年4月30日(日) 01:52

> すみません、何処にMainWnd_Createプロシージャがあるのでしょうか?
> 追加するのでしょうか?
RADツールでメインウィンドウを右クリックするとポップアップメニューが表示されるので「イベントコード」を選択して次に「ウィンドウ作成時」を選択するとMainWnd_Createプロシージャを生成してくれます。

> MainWnd_Createプロシージャが無かったのでMainWnd_Destroyプロシージャの方だけ取り合えず追記したのですが、これで良いのでしょうか?
それで構いません。

> RADツール関連の事はどうやって調べたら良いのでしょうか?
> ヘルプセンター内のRADツールのみでは全然わからないので・・・
RADツールでこれがしたいんだけど、って問題を提示して貰わないと使って覚える、としか言いようが無いですね...。

> お勧めのHP等があれば紹介して頂けると助かります。
古い記事ですがhttp://www.activebasic.com/article/rad.htmというのがあります。
ユーザーさんのサイトへのリンクが以前はトップページで紹介されていたんですが今は無いですね。

by mako » 2006年4月30日(日) 01:03

> String型変数strBufをグローバル変数にしてしまえば楽かな、なんて思ってしまうんですけど、どれだけの関数がどういう風にグローバル変数を処理しているのか把握するのが面倒なので、再度EditBox2の内容を取り込んで、と言った作業の方が楽だと思います。
仰ってる内容が???ですが、再度取り込んだ方が良いみたいなのでそうします。
素人考えで普通に使えるのではないかと思ってしまったもので。

> 「ウィンドウが作られた時」と書かれたコードはMainWnd_Createプロシージャ内に書いて下さい。
すみません、何処にMainWnd_Createプロシージャがあるのでしょうか?
追加するのでしょうか?

> 同様に「ウィンドウが破棄される時」と書かれたコードはMainWnd_Destroyプロシージャ内に書いて下さい。

コード: 全て選択


Sub MainWnd_Destroy()
	test_DestroyObjects()
	'ウィンドウが破棄される時
	DeleteObject(hBitmap)
	PostQuitMessage(0)
End Sub
MainWnd_Createプロシージャが無かったのでMainWnd_Destroyプロシージャの方だけ取り合えず追記したのですが、これで良いのでしょうか?

追伸
RADツール関連の事はどうやって調べたら良いのでしょうか?
ヘルプセンター内のRADツールのみでは全然わからないので・・・
お勧めのHP等があれば紹介して頂けると助かります。

by 7 » 2006年4月30日(日) 00:14

> ボタン1クリックの際にEditBox2へ表示した内容(strBuf)をそのままボタン2クリック時に使う事は出来ないのでしょうか?
String型変数strBufをグローバル変数にしてしまえば楽かな、なんて思ってしまうんですけど、どれだけの関数がどういう風にグローバル変数を処理しているのか把握するのが面倒なので、再度EditBox2の内容を取り込んで、と言った作業の方が楽だと思います。

> IDB_BITMAP1を既に追加してるのにボタン1には変化が何もありません。
> コードを書く場所を色々と変えてみましたが何も変わらずの状態です。
「ウィンドウが作られた時」と書かれたコードはMainWnd_Createプロシージャ内に書いて下さい。
同様に「ウィンドウが破棄される時」と書かれたコードはMainWnd_Destroyプロシージャ内に書いて下さい。

by mako » 2006年4月29日(土) 23:55

イグトランスさん、7さん有難うございます。

7さん・・・す、すいません。
クリップボード関数のエラーは
Sub MainWnd_CommandButton2_Click()の下にそのまま関数を書いてました。
エラーが出るのも当然ですよね。。。

SetClipboardText関数の使用方法なのですが
ボタン1クリックの際にEditBox2へ表示した内容(strBuf)をそのままボタン2クリック時に使う事は出来ないのでしょうか?
(再度EditBox2の内容を取り込んで・・・と言った作業が必要になるのですか?)

コード: 全て選択


Sub MainWnd_CommandButton1_Click()
'途中省略
    :
'EditBox2へ出力
    SetWindowText(GetDlgItem(hMainWnd,EditBox2),strBuf)
End Sub

Sub MainWnd_CommandButton2_Click()

SetClipboardText(hMainWnd,strBuf)

End Sub

> 単にBM_SETIMAGEを送信して出来ました。
> コマンドボタンの「ビットマップ」にチェックを入れて下さい。

コード: 全て選択


'HBITMAP型グローバル変数 hBitmap の宣言
Dim hBitmap As HBITMAP

'ウィンドウが作られた時
hBitmap=LoadImage(GetModuleHandle(0),IDB_BITMAP1,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE)
SendDlgItemMessage(hMainWnd,CommandButton1,BM_SETIMAGE,IMAGE_BITMAP,hBitmap)

'ウィンドウが破棄される時
DeleteObject(hBitmap)
↑のコードなのですが、そのままでは使えないのでしょうか?!
IDB_BITMAP1を既に追加してるのにボタン1には変化が何もありません。
コードを書く場所を色々と変えてみましたが何も変わらずの状態です。

by 7 » 2006年4月29日(土) 19:48

> ボタンにビットマップを表示させるには、単にボタンへBM_SETIMAGEを送る方法はどうでしょう。
単にBM_SETIMAGEを送信して出来ました。
コマンドボタンの「ビットマップ」にチェックを入れて下さい。 分かってみればすっごい簡単ですね。
サブクラスで随分と悩んでたのが馬鹿みたいです。(サブクラスの勉強にはなりましたけど)

by イグトランス » 2006年4月29日(土) 18:46

ボタンにビットマップを表示させるには、単にボタンへBM_SETIMAGEを送る方法はどうでしょう。
#私は使ったことありませんが。

Re: 御指導願えませんか?

by 7 » 2006年4月29日(土) 16:00

> 7さんにお尋ねしたいのですが、クリップボードの関数で
> ボタン2を追加してクリップボード関数を入れるとコンパイル時に1行目で "Function" の使い方が不正ですとエラーになってしまいます。
> (2回エラーが表示されます)
ぅ~ん...。ソースを見たら原因が分かるかもしれません。 > 又、ボタンにビットマップの画像を使うにはどの様にしたら良いのでしょうか?
WM_PAINTを受信した時に描けばいいのかと思ったらダメで、サブクラス化して色々試したんですけど、面倒です。
動的サブクラス化、というのを参考にしようとしたんですけどよく分からず、ボタンが押され時、フォーカスを持った時などの描写も自分でしなければいけません...。

> (ビットマップをクリックした時にxxxの動作でも良いのですが)
ビットマップボタンじゃなくても良いなら簡単ですね。
ボタンを「オーナー描写」にしてビットマップを描写するか、イメージボックスを「通知」にして「タイプ」を「ビットマップ」、読み込みは「リソース」にすればオーケーです。
イメージボックスが一番簡単じゃないでしょうか。

Re: 御指導願えませんか?

by mako » 2006年4月29日(土) 10:29

7さんにお尋ねしたいのですが、クリップボードの関数で
ボタン2を追加してクリップボード関数を入れるとコンパイル時に1行目で "Function" の使い方が不正ですとエラーになってしまいます。
(2回エラーが表示されます)

コード: 全て選択


 Function SetClipboardText(ByVal hWnd As HWND,ByVal lpString As BytePtr) As BOOL
Dim hMem As HGLOBAL
Dim lpStr As BytePtr
    SetClipboardText=FALSE
    hMem=GlobalAlloc(GMEM_DDESHARE or GHND,lstrlen(lpString)+1)
    If hMem Then
        lpStr=GlobalLock(hMem)
        If lpStr Then
            lstrcpy(lpStr,lpString)
            GlobalUnlock(hMem)
            If OpenClipboard(hWnd) Then
                EmptyClipboard()
                SetClipboardData(CF_TEXT,hMem)
                CloseClipboard()
                SetClipboardText=TRUE
            End If
        End If
        GlobalFree(hMem)
    End If
End Function

'使い方
SetClipboardText(hMainWnd,"SetClipboardText()関数")
ABのバージョンは4.24です。

又、ボタンにビットマップの画像を使うにはどの様にしたら良いのでしょうか?
(ビットマップをクリックした時にxxxの動作でも良いのですが)

ページトップ