ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2017年11月23日(木) 10:36

All times are UTC+09:00




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2016年11月26日(土) 20:13 
オフライン

登録日時: 2016年9月24日(土) 15:35
記事: 62
複数のファイルとフォルダーがドラッグアンドドロップされた場合、一つずつ表示するにはどうすればいいでしょう?
コード:
Dim Onthefile
Function DropEditProc(hWnd As HWND, message As DWORD, wParam As DWORD, lParam As DWORD) As DWORD
   Select Case message
      Case WM_DROPFILES
         Dim hDrop As HDROP
         Dim FileName[MAX_PATH] As Byte
         Dim FileName2 As string

         hDrop=wParam As HDROP
  
         'ドロップされたファイル名を取得
         DragQueryFile(hDrop, 0, FileName, MAX_PATH)
Onthefile = FileName

		SetWindowText(hMainWnd, "Fast-Deleter" )
	

  SetWindowText(GetDlgItem(hMainWnd,CommandButton1),"[ " & Onthefile & " ]: 削除しますか。" )
KillTimer(hMainWnd,0)

         DragFinish(hDrop)
         DropEditProc=0
         Exit Function
   End Select
   DropEditProc=CallWindowProc(DefEditProc As VoidPtr, hWnd, message, wParam, lParam)
End Function
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
   DefEditProc=SetWindowLong(GetDlgItem(hMainWnd, CommandButton1), GWL_WNDPROC, AddressOf(DropEditProc) As Long)
End Sub


通報する
ページトップ
投稿記事Posted: 2016年11月27日(日) 20:49 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 189
住所: 東京都
WIN API32のDragQueryFileの第2パラメータに-1を指定するとドロップされたファイルの数が返却値に設定されます。
そしてドロップされたファイルの数分表示します。
下記にコーディング例を記載しますのでご確認下さい。
ただし私の場合はドラッグアンドドロップイベントをRADで自動生成していますのでTISAprojectさんのコーディング形式とまったく異なりますのでご了承願います。
詳細はABのヘルプに記載されています。

SUB MainWnd_DropFiles(HDROP AS HANDLE)
DIM SUU AS Long
DIM IDX AS Long
SUU = DragQueryFile(HDROP,-1,NULL,0)
FOR IDX = 0 TO SUU - 1
DragQueryFile(HDROP,IDX,FILENAME,255)
MessageBox(hMainWnd,FILENAME,PGMID,MB_OK)
NEXT
DragFinish(HDROP)
END SUB


通報する
ページトップ
投稿記事Posted: 2016年11月28日(月) 21:29 
オフライン

登録日時: 2016年9月24日(土) 15:35
記事: 62
現在、ドラッグアンドドロップされたファイルをツリービューに表示するprojectを練っているのですが、なかなか上手く行きません。
コード:
'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。


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

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()
	FastDeleterplus_DestroyObjects()
	PostQuitMessage(0)
	DragFinish(HDROP)
End Sub

SUB MainWnd_DropFiles(HDROP AS HANDLE)
DIM SUU AS Long
DIM IDX AS Long
DIM FILENAME AS string
DIM PGMID As *Byte
SUU = DragQueryFile(HDROP,-1,NULL,0)
FOR IDX = 0 TO SUU - 1
DragQueryFile(HDROP,IDX,FILENAME,255)

  Dim hAny As Long
   Dim tvi As TVINSERTSTRUCT
   Dim hTreeItem As Long

   'ツリービューのハンドルを得る
   hAny = GetDlgItem( hMainWnd, TreeView1 )

   'ルートの項目(アイテム)を追加する。
   tvi.hParent = TVI_ROOT
   tvi.hInsertAfter = TVI_SORT
   tvi.item.mask = TVIF_TEXT
   tvi.item.pszText = FILENAME
   hTreeItem = TreeView_InsertItem( hAny , tvi )

NEXT
DragFinish(HDROP)
END SUB


'TreeViewで使用する追加定義。
Function TreeView_InsertItem( hWnd As Long, ByRef lpis As TVINSERTSTRUCT ) As Long
   TreeView_InsertItem = SendMessage( hWnd, TVM_INSERTITEM, 0, VarPtr(lpis) )
EndFunction
結果
(50) "tvi.item.pszText" 型が違います


通報する
ページトップ
投稿記事Posted: 2016年11月28日(月) 22:38 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 189
住所: 東京都
私はツリービューについてまったくわかりませんが、

tvi.item.pszTextはポインタ型なので変数の型が違うとエラーが出ます。
なのでFILENAMEをString型からByte/Char型の配列で定義すればよいと思います。

例 DIM FILENAME[255] AS Byte

11月29日追加
またはFILENAMEをString型のままにして以下の様にすることもできます。
tvi.item.pszText=StrPtr(FILENAME)


通報する
ページトップ
投稿記事Posted: 2016年11月30日(水) 21:01 
オフライン

登録日時: 2016年9月24日(土) 15:35
記事: 62
コード:
'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim DefEditProc As Long
Dim Onthefile As string
Dim Onput As string
Dim strURL As string
Dim Option1 As long
Dim cloud1 As Long
Dim fos As SHFILEOPSTRUCT
Dim deletePath As String
Dim A1 As String
Dim Button As Long
Dim Button2 As Long
Dim lpMsgBuf As BytePtr
Dim Classter As long
Dim present As string
Dim ID As Integer
#include<api_mmsys.sbp>'PlaySound関数を使うとき必要!
open "./Plus_Actions/Operation.CPUCOMP" For Input As #1

'TreeViewで使用する追加定義。
Function TreeView_InsertItem( hWnd As Long, ByRef lpis As TVINSERTSTRUCT ) As Long
   TreeView_InsertItem = SendMessage( hWnd, TVM_INSERTITEM, 0, VarPtr(lpis) )
EndFunction


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

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

 Declare Function SetLayeredWindowAttributes Lib "user32" (hwnd As Long,crKey As Long, bAlpha As Byte,_
dwFlags As Long) As Long
Const LWA_ALPHA=&H2
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
   Active120_DestroyObjects()
   PostQuitMessage(0)

END
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	
SetWindowLong(hMainWnd, GWL_EXSTYLE, GetWindowLong(hMainWnd, GWL_EXSTYLE) or &H80000)
SetLayeredWindowAttributes(hMainWnd,0,1000,LWA_ALPHA)'200を変えると、透過度が変わります。
End Sub

SUB MainWnd_DropFiles(HDROP AS HANDLE)
DIM SUU AS Long
DIM IDX AS Long
DIM FILENAME AS string
Dim Clear As string
DIM PGMID As *Byte
SUU = DragQueryFile(HDROP,-1,NULL,0)
FOR IDX = 0 TO SUU - 1
DragQueryFile(HDROP,IDX,FILENAME,255)


Button=GetDlgItem(hMainWnd,TreeView1)
EnableWindow(Button,FALSE)
Button2=GetDlgItem(hMainWnd,TreeView1)
EnableWindow(Button2,FALSE)

SetWindowText(hMainWnd, "Fast-Deleter:削除処理中 (" & Onthefile )



     cloud1 = DeleteFile (FILENAME)
If cloud1 <> 0 Then
SetWindowText(hMainWnd, " 削除完了しました。 FILE" )
EnableWindow(Button,TRUE)
	present = "{ 削除完了しました }"
Onthefile = ""
Classter = 1
MessageBeep (MB_ICONASTERISK/* ここに型を入力*/)

Else


A1 = FILENAME


deletePath = A1 + Chr$(0)


fos.wFunc = FO_DELETE
fos.pFrom = StrPtr(deletePath)
fos.fFlags = FOF_SILENT Or FOF_NOCONFIRMATION Or FOF_NOERRORUI

If SHFileOperation(fos) = 0 And fos.fAnyOperationsAborted = FALSE Then

fos.pFrom = StrPtr(deletePath)
fos.fFlags = FOF_SILENT Or FOF_NOCONFIRMATION Or FOF_NOERRORUI

SetWindowText(hMainWnd, "削除完了しました。FOLDER" )
	present = "{ 削除処理END }"
Onthefile = ""
Classter = 1
MessageBeep (MB_ICONASTERISK/* ここに型を入力*/)
Else
SetWindowText(hMainWnd, "削除処理ERROR <もう一度処理するには再ドラッグアンドドロップ>" )
present = "{ 削除できませんでした。使用されているか、存在しない、またはこのappより上の権限がかかっています }"
MessageBeep (MB_ICONHAND/* ここに型を入力*/)
End If
End If
EnableWindow(Button,TRUE)
EnableWindow(Button2,TRUE)
	FlashWindow(hMainWnd,TRUE)	'TRUEはオン、FALSEはオフ
    Sleep (500)
	FlashWindow(hMainWnd,TRUE)	'TRUEはオン、FALSEはオフ

  Dim hAny As Long
   Dim tvi As TVINSERTSTRUCT
   Dim hTreeItem As Long
   'ツリービューのハンドルを得る
   hAny = GetDlgItem( hMainWnd, TreeView1 )
   'ルートの項目(アイテム)を追加する。
   tvi.hParent = TVI_ROOT
   tvi.hInsertAfter = TVI_SORT
   tvi.item.mask = TVIF_TEXT
   Clear = FILENAME & present
   tvi.item.pszText=StrPtr(FILENAME)
   hTreeItem = TreeView_InsertItem( hAny , tvi )
FILENAME = ""
Sleep (600)
NEXT

DragFinish(HDROP)
END SUB

これで、ファイルかフォルダーをドラッグアンドドロップし、削除させると、何回かでAppが動作を停止してしまうのですが、どうすればいいでしょう?


通報する
ページトップ
投稿記事Posted: 2016年12月10日(土) 21:46 
オフライン

登録日時: 2006年2月05日(日) 17:10
記事: 189
住所: 東京都
>これで、ファイルかフォルダーをドラッグアンドドロップし、削除させると、何回かでAppが動作を停止してしまうのですが、どうすればいいでしょう?
「問題が発生しました・・・・」というポップアップメッセージが表示されて異常終了したのですか?
そのときの例外コードわかりますか?
私の方では動作確認出来ないので何ともいえませんがもしかしたらWin32 APIでString変数を使用しているところで異常終了の可能性があると思います。


通報する
ページトップ
投稿記事Posted: 2016年12月11日(日) 11:28 
オフライン

登録日時: 2016年9月24日(土) 15:35
記事: 62
では、String変数をどうすればいいでしょう?
削除まではうまくいくので、ツリービューに表示するところでエラーが発生していると考えられます。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

All times are UTC+09:00


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[1人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by KONISHI Yohsuke