フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: TWebBrowser でのダブルクリックの検出
Mr.XRAY
メンバー
投稿数: 192
TWebBrowser でのダブルクリックの検出
on: 2013/05/25 09:13 Sat

TWebBowser にはダブルクリックのイベントはありません.
また,Webページを表示していて,ダブルクリックという操作はほとんどありません.

TWebBrowser では,URL にローカルディクスのディレクトリを指定すると,そのディレクトリ内の
ファイルのリストを表示します.エクスプローラのように.
すると,ダブルクリックで,そのファイルに対して,操作を行うということが考えられます.

  • 新規プロジェクトを作成
  • TWebBrowser を 2 つ配置.OnCreateイベントを作成
  • TApplicationEvents(Additionalタブ) コンポを配置し,OnMessage イベントを作成
  • uses に CommCtrl, HTTPApp を追加
  • コードを以下のようにする

TWebBrowser でファイルのリストを表示している時,表示を行っているのは,
エクスプローラと同じ SysListView32 というクラス名のコントロールです.
検出したハンドルが,このクラス名だった場合に処理します.
動作確認は,Windows 7 U64(SP1) + Delphi XE Pro です.

//=============================================================================
// フォーム作成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
var
AURL : String;
begin
AURL := 'D:\デジカメ画像\20071100';
WebBrowser1.Navigate(AURL);

AURL := 'D:\デジカメ画像\20130406';
WebBrowser2.Navigate(AURL);
end;

//-----------------------------------------------------------------------------
// ウィンドウのクラス名を取得する関数
//-----------------------------------------------------------------------------
function GetWindowClassNameStr(hWindow: HWND): String;
var
Buffer : array[0..MAX_PATH-1] of Char;
Len : Integer;
begin
FillChar(Buffer, SizeOf(Buffer), #0);
Len := GetClassName(hWindow, Buffer, Length(Buffer));
if Len > 0 then Result := Buffer else Result := '';
end;

//=============================================================================
// TApplicationEventコンポのOnMessageイベント処理
// EmbeddedWBコンポでローカルのファイルを表示していると仮定して,
// ダブルクリックしたファイルのフルパスを取得
//
// ListView_XXXXの使用にはusesにCommCtrlが必要
// UnixPathToDosPathの使用にはusesにHTTPAppが必要
//
// 動作確認は Windows 7 U64(SP1) + Delphi XE Pro
//=============================================================================
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
hListView32 : HWND;
SelectCount : Cardinal;
SelectNo : Integer;
pszText : array[0..MAX_PATH-1] of Char;
Dir : String;
FilePath : String;
begin
if Msg.message = WM_LBUTTONDBLCLK then begin

//Msg.hwndのクラス名がSysListView32だったら処理
if GetWindowClassNameStr(Msg.hwnd) = 'SysListView32' then begin
hListView32 := Msg.hwnd;

//ブラウザに応じてディレクトリ名を取得しておく
if IsChild(WebBrowser1.Handle, Msg.Hwnd) then begin
Dir := IncludeTrailingPathDelimiter(WebBrowser1.LocationURL);
end else
if IsChild(WebBrowser2.Handle, Msg.Hwnd) then begin
Dir := IncludeTrailingPathDelimiter(WebBrowser2.LocationURL);
end;

//選択中のItemの数を取得
//複数選択しても,ダブルクリックの時は1つだけとなる
//ファイル名以外の場所だと0となる
SelectCount := ListView_GetSelectedCount(hListView32);
if SelectCount = 1 then begin
//最初のItemは-1となってしまう(原因は不明)ので修正
SelectNo := ListView_GetNextItem(hListView32, LVNI_ALL, LVNI_SELECTED);
if SelectNo < 0 then SelectNo := 0;

//ItemがSelectNoのテキスト,つまりファイル名を取得
ListView_GetItemText(hListView32, SelectNo, 0, pszText, SizeOf(pszText));
FilePath := pszText;
ShowMessage(UnixPathToDosPath(Dir + FilePath));

//デフォルトではWindows フォトビューアが起動するので,起動しないようにする
//テストなので
//代わりに他のアプリで表示する,あるいは処理するコードを書いてもいいかも...
Handled := True;
end;
end;
end;
end;

   
実行結果はこんな感じになります.
先頭に file:\\\ というのが付いています.これを削除しないと実際のフルパスにはなりません.

参考リンク
[946_TWebBrowser でファイルリスト]
http://mrxray.on.coocan.jp/Delphi/plSamples/946_FileList_WebBrowser.htm

Mr.XRAY
メンバー
投稿数: 192
Re: TWebBrowser でのダブルクリックの検出
on: 2013/05/25 09:55 Sat

この記事は,
[Webbrowser1と2のダブルクリックされた方の判別]
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201305/13050018.txt

のレス用として書きました.
質問された方は,Delphi 6 Personal 版です.このコードが Delphi 6 Personal版で
そのまま動作するかは分かりません.
以前は,私のサイトの記事に,Personal 版では,という内容も書いていたのですが,
Delphi 2007 での Vista 対応,Delphi 2009 では Unicode 化,Delphi XE2 では 64 ビット化.FireMonkey.
さすがに個人で検証するには限界があります.

Personal 版を利用している方からのフォローを期待するしかありません.

Mr.XRAY
メンバー
投稿数: 192
Re: TWebBrowser でのダブルクリックの検出
on: 2013/05/25 10:27 Sat

Delphi Personal 版ということではないのですが,気が付いたことを少し追記します.

pszText     : array[0..255] of AnsiChar;

   
元の質問のコードでは,上のように定義していますが,
[0..255] は [0..MAX_PATH-1] としておくと,Windows のバージョンに依存しません.
また,Ansi ではなく,Char とか String 型にしておくと,Delphi のバージョンによる依存もなくなります.
Delphi 2007 までは,String 型は,AnsiString 型として,Char 型は AnsiChar として扱われます.

ただし,Windows API (Win32 API) の関数によっては,Ansi 型でないとか,WideString でないと正常に
動作しないこともあります.これは,MSDN の記事で確認するしかありません.
これらのことは,非 Unicode版のコードを Unicode 版に移植する際の手間をかなり軽減してくれます.
このような定義は Unicode 版,つまり Delphi 2009 以降へ移植する際に苦労するところです.

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.029 sec.