喫茶XRAYトップページ

[▲前のスレッド]

[8369] 814_コンテキストメニュー コンポーネント返信 削除
2015/1/6 (火) 17:03:14 sato
今年もよろしくお願いします。
お屠蘇気分の抜けないうちから申し訳ありません。
814_コンテキストメニュー コンポーネントの
plContextMenu.pas を登録しようとすると、14行目の
nIDNewItem  : UINT_PTR;
のところで、未定義の識別子、「UINT_PTR」となるのですが、
ヒントだけでもいただけないでしょうか。
Delphi7、Windows7 です。



[8370] Re:814_コンテキストメニュー コンポーネント返信 削除
2015/1/6 (火) 17:51:07 Mr.XRAY
▼ satoさん

> nIDNewItem  : UINT_PTR;

なるほど,これですね.えっとですね.
MSDN の記述をそのまま使用していますね.
あまりよくないですね.
誰が書いたコードなんでしょう? (って,しらぱくれる)

Delphi 7 であれば 32 ビットであることは確実なので,
符号なしの 32 ビット値が格納できれば問題ないと思います.
以下のいずれかに変更してください.

Pointer
Cardinal

あるいは以下のように定義してしまうとかですね.
  type
    UINT_PTR = Cardinal;  //Delphi XE ではこちらになっています

  type
    UINT_PTR = UINT;  //あるいはLongWordととか...

えっ?  何か文句あります?
いい加減だって.そう,いい加減なんですよ.

[Windows Data Types]
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx#UINT_PTR


[8371] Re2:814_コンテキストメニュー コンポーネント返信 削除
2015/1/7 (水) 22:56:09 sato
▼ Mr.XRAYさん
ありがとうございました。
うまく登録でき、plContextMenuも使えるようになりました。
ついでで申し訳なく、plContextMenuとも無関係なのですが、
ShellListViewに表示されたファイル名をダブルクリックした時、
関連付けられたアプリケーションで開くものだと思ったのですが、
Word、Excel、pdfのファイルは開くのですが、テキストやファイルメーカー
のファイルは開かないのです、ただnotepad.exeやFilemaker.exeの
プロセスは起動しています。
また、plContextMenuの右クリックの「開く」からだといずれも開けます。
何か、ヒントをいただけるとありがたいのですが。
よろしくお願いします。
Delphi7,Windows7です。

正月に天気がよかったので近所の公園に散歩に行きました。
なんと、桜の花が満開でした。(大阪)
ヒマラヤザクラは1、2月に咲くのだそうです。
また、さくらの起源はヒマラヤだそうです。知らなかったです。




[8372] Re3:814_コンテキストメニュー コンポーネント返信 削除
2015/1/7 (水) 23:26:53 Mr.XRAY
▼ satoさん

> ShellListViewに表示されたファイル名をダブルクリックした時、

この ShellListView って,
http://mrxray.on.coocan.jp/Delphi/Others/ShellCtrlComponent.htm
のやつですか ?
としても,確認してみないと分かりませんが...

> ヒマラヤザクラは1、2月に咲くのだそうです。
> また、さくらの起源はヒマラヤだそうです。知らなかったです。


えっ,知りませんでした.思わず検索してしまいました (^^
なるほど.サクラが何か身近に,と言っても身近ですが,感じました.


[8373] Re4:814_コンテキストメニュー コンポーネント返信 削除
2015/1/8 (木) 00:34:39 sato
▼ Mr.XRAYさん

>http://mrxray.on.coocan.jp/Delphi/Others/ShellCtrlComponent.htm
>のやつですか ?

そうです。Delphi7のDemoにある「ShellCtrls.pas」の
ShellListView ( TShellListView ) です。

このShellListViewを使うと、ファイルをコピーしようとして、
右クリックした時に、Exploreと同じポップアップメニュー
(シェルポップアップ?というのですか)が出るのですが、コピーを
選んで、別のフォルダーの空いた場所(何と言うのでしょうか
ShellListViewのアイテムの無い場所)に貼り付けようとして、
右クリックするとポップアップメニューが出ないので、
plContextMenuを使用させていただこうと思った次第です。
おんぶにだっこで申し訳ありません。

[8374] Re5:814_コンテキストメニュー コンポーネント返信 削除
2015/1/8 (木) 11:17:15 Mr.XRAY
▼ satoさん

>ShellListViewのアイテムの無い場所)に貼り付けようとして、
>右クリックするとポップアップメニューが出ないので、


例えば,次のようにすることで可能ではないかと.

//=============================================================================
//  ShellListView1のOnMouseUpイベント処理
//  ShellListView1のItemが選択されていない場合にもコンテキストメニューを表示
//
//  ShellListView1のAutoContextMenuをFalseにして,コンテキストメニューの表示を
//  常にコードで行う方法も考えられる
//=============================================================================
procedure TForm1.ShellListView1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then begin
    if ShellListView1.Selected = nil then begin
      InvokeContextMenu(ShellListView1,
                        ShellTreeView1.SelectedFolder,
                        X,
                        Y);
    end;
  end;
end;


サンプル UP してみました.
動作確認は,Windows 7 U64(SP1) + Delphi 7 Pro です.
このサンプルでは,テキストファイルもダブルクリックで開きます.
ファイルメーカーは持っていないので未確認です.
TplContextMenu も配置してテストしましたが,開きます.
管理者権限で実行しても,一般ユーザで EXE を実行しても
開きました.

>ただnotepad.exeやFilemaker.exeのプロセスは起動しています。

これが気になりますね.

http://mrxray.on.coocan.jp/Delphi/zip/ShellComponent_D7.zip


[8375] Re6:814_コンテキストメニュー コンポーネント返信 削除
2015/1/8 (木) 16:10:31 sato
▼ Mr.XRAYさん

いろいろとご足労をおかけしてありがとうございました。
> http://mrxray.on.coocan.jp/Delphi/zip/ShellComponent_D7.zip
でも、私の環境ではTXTファイルが開けなかったので、しかたなく
ShellListViewのAutoNavigateをFalseにして、ダブルクリック時に
ShellExecuteで開くことにしました。
そうすると、またまた問題が。
ダブルクリックの対象がファイルの時はうまく開くのですが、フォルダーだと
うんともすんとも言わないので(当たり前田の...ですが)、しかたなく
ShellListViewのOnChangeでSelectedFolder.IsFolderがTrueなら、あわてて
AutoNavigateをTrueeにし、FalseならAutoNavigateをFalseにすると
見た目は、いけているようです。  こんなんでいいんですかね。
「動けば官軍」と教えられたもので......

つぎは、ColumnClickでのソートです。(これもやっかいそうですが)

>ただnotepad.exeやFilemaker.exeのプロセスは起動しています。
> これが気になりますね.

これは、私の力には負えません。


[8376] Re7:814_コンテキストメニュー コンポーネント返信 削除
2015/1/8 (木) 19:45:41 Mr.XRAY
▼ satoさん

> >ただnotepad.exeやFilemaker.exeのプロセスは起動しています。
> > これが気になりますね.
> これは、私の力には負えません。


う〜む.なんだべ?
最近何か悪いことしていません ?
ほら,職場の忘年会か新年会で,職場の若くて綺麗で可愛い女の子をホテルに
連れ込もうとして,ローヒールのかかとで殴られそうになったとか ?
(ん? それは私か ?)

覚えがない ? そうですか ?
それとも,そんなの関係ない ?


[8378] Delphi 付属のシエルコンポーネント返信 削除
2015/1/8 (木) 21:53:45 Mr.XRAY
▼ satoさん,ゴメンナサイ.
私が間違っていました.

> >ただnotepad.exeやFilemaker.exeのプロセスは起動しています。
> > これが気になりますね.


これですが,私のテストでは,.txt の関連付けしたアプリは,TEAD という
テキストエディタでした.ゴメンなさい.
先ほど メモ帳(Notepad.exe) でやってみたら,satoさんと同じ現象となりました.

これはですね.Vista 以降の現象ですね.多分(自信なし)
他にもあるかも知れません.


[8379] 付属のシエルコンポーネントは修正が必要返信 削除
2015/1/9 (金) 00:06:38 Mr.XRAY
分かりました.

> これはですね.Vista 以降の現象ですね.多分(自信なし)
> 他にもあるかも知れません.


ググってみたら,ありました.
昔からある現象のようです.DblClick 内での ShellExecute 関数の挙動のようです.
[Enter] キーはコンテキストメニューのコマンドを実行しているようです.
そこで,ShellCtrls.pas 内の以下のようにすれば,現在のところ OK のようです.
動作確認環境は前と同じです.

ShellCtrls.pas 等があるフォルダにパスを通さないと有効になりません.
バスを通して,修正したら,プロジェクトを再構築してください.


procedure TCustomShellListView.DblClick;
begin
  if FAutoNavigate and (Selected <> nil) then
    with Folders[Selected.Index] do
      if IsFolder then
        SetPathFromID(AbsoluteID)
      else
        ExecuteDefault;                                      //追加
//        ShellExecute(Handle, nil, PChar(PathName), nil,    //削除
//          PChar(ExtractFilePath(PathName)), 0);            //削除
  inherited DblClick;
end;


以下をヒントに修正コードを作成しました.

http://www.delphipages.com/forum/showthread.php?t=122681


[備考]
私自身は,Delphi 付属のシェルコンポーネントを使用していませんので,
気づきませんでした.
昔は,サードパーティ製を,今は自作のシェルコンポーネントを使用しています.
特定の Delphi のバージョン用ですので,公開の予定はありません.
サンプルプログラム集の [819] [820] が元となっているコンポーネントです.


前に UP したファイルですが,EXE を作成し直して再 UP しておきます.
http://mrxray.on.coocan.jp/Delphi/zip/ShellComponent_D7.zip


[8381] Re:付属のシエルコンポーネントは修正が必要返信 削除
2015/1/9 (金) 09:39:08 sato
▼ Mr.XRAYさん

ありがとうございました。
結局、
ShellListView1DblClickに書いた
ShellExecute(0,'open',PChar(PathName),nil,nil,SW_NORMAL);
では、notepadで開けて
ShellCtrls.pas 内の
 ShellExecute(Handle, nil, PChar(PathName), nil,PChar(ExtractFilePath(PathName)), 0);            //削除
では開けないということですね。(もう深く追求しないことにします)

教えていただいたように修正してバッチリ確認できました。
本当に助かりました。
以前は、伊藤隆志さんという方のシェルコンポーネントを使用していましたが、
Windows7でShellListViewにアイコンが表示されなくなり、フォルダとファイルの
区別がつかないということから始まった事件でした。
3日間も喫茶室を貸し切りにしていただき感謝の言葉もありません。
ありがとうございました、ヒゲの似合うマスター(?)へ。

[8383] Re2:付属のシエルコンポーネントは修正が必要返信 削除
2015/1/9 (金) 13:12:57 Mr.XRAY
▼ satoさん

> ShellCtrls.pas 内の
>  ShellExecute(Handle, nil, PChar(PathName), nil,PChar(ExtractFilePath(PathName)), 0);            //削除
> では開けないということですね。(もう深く追求しないことにします)


ですね.私もなぜなのかは追及しませんでした.
ShellExecute を単独で実行する分には成功するんですけどね.
[Enter] キーで Notepad.exe 等でテキストファイルを表示するので,
そのコマンドを実行するようにしてみたのです.

やってみてから,ネットを検索したら,そのようなことがあったんです.

> 3日間も喫茶室を貸し切りにしていただき感謝の言葉もありません。

こういうのは,皆さんの参考になると思います.
ここのお客様は,私と同じでおとなしい方々なのでチャチは入れませんが.

> ありがとうございました、ヒゲの似合うマスター(?)へ。

えっ!? スケベなじゃなくて .... ?
あっ,そうだ.今はヒゲないんです.ハハハッ.


[8380] Re:Delphi 付属のシエルコンポーネント返信 削除
2015/1/9 (金) 09:09:53 Mr.XRAY
> 他にもあるかも知れません.

ありましたね.
[TShellListView で複数ファイルのプロパティ参照や「送る」]
http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+201006/10060017.txt

↑のスレッドにも DblClick の修正コードがありました.


[8382] お詫び UINT_PTR型返信 削除
2015/1/9 (金) 10:25:31 Mr.XRAY
[814_コンテキストメニュー コンポーネント]
http://mrxray.on.coocan.jp/Delphi/plSamples/814_ContextMenu_DropSource.htm

なんですが,動作確認環境に Delphi 6, 7 と書いてあります.
いつの時点でか,UINT_PTR という型を使用するコードにしてしまいました.
sato さんからの質問があるまで気づきませんでした.

この型は,Delphi 6, 7 にはありません.
現在,どのように修正するか考えています.


[8384] Re:お詫び UINT_PTR型 更新しました返信 削除
2015/1/10 (土) 18:21:43 Mr.XRAY
> [814_コンテキストメニュー コンポーネント]
> http://mrxray.on.coocan.jp/Delphi/plSamples/814_ContextMenu_DropSource.htm
>
> なんですが,動作確認環境に Delphi 6, 7 と書いてあります.
> いつの時点でか,UINT_PTR という型を使用するコードにしてしまいました.
> sato さんからの質問があるまで気づきませんでした.


更新しました.
今回問題となった関係記事も更新しておきました.

[シェルコンポーネントの場所]
http://mrxray.on.coocan.jp/Delphi/Others/ShellCtrlComponent.htm#top


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82