喫茶XRAYトップページ

[スレッド全体
]

[3889] Delphi6による動作検証返信 削除
2010/11/2 (火) 22:46:12 たてぐや
▼ Mr.XRAYさん

 いまさら6? と言われそうですが、バージョンアップする予定はないので
動作検証してみました。こういうの、前から欲しかったのです。以下、DPRファ
イルから起動しての結果です。

01_Explorer_test
フォーム作成時に「Splitter.ExplieHightのプロパティが存在しない」と言わ
れてフォームが表示できませんでした。

02_plContextMenu_01_Test01
正常にコンパイルでき、動作しました。

03plContextMenu_01_test01
kコンパイルできて表示されましたが、右ペインのファイル名を右クリックす
ると「外部例外」が発生します。

04_OpenDlg_Application
実行しようとするとCPUウィンドルが出てしまい、継続できませんでした。

 以上、参考までに。
 さっさと新しいDelphi買え!と言われそうですが…

[3890] Re:Delphi6による動作検証返信 削除
2010/11/3 (水) 08:54:37 Mr.XRAY
>  以上、参考までに。
>  さっさと新しいDelphi買え!と言われそうですが…


御意!! ウソ,ウソです.

> 動作検証してみました。

たてぐさーん.こういうの嬉しいです.
得意になって答えちゃいます.

> 01_Explorer_test
> フォーム作成時に「Splitter.ExplieHightのプロパティが存在しない」と言わ
> れてフォームが表示できませんでした。


スミマセンね.これ,Delphi 2010のプロジェクトなんです.
いくつか方法が考えられるのですが,一つは添付の図のように,[全て無視]で
やる方法です,

これで多分,他のサンプルも動作すると思います.
もう1つの方法は,以下の説明の方法です.

http://mrxray.on.coocan.jp/Delphi/Info/OtherInfo_General.htm#02


[3891] Re2:Delphi6による動作検証返信 削除
2010/11/3 (水) 09:03:31 Mr.XRAY
後,このコンポは,いわゆるシェルコンポーネントではないので,
特殊フォルダがフルパスの名前部分になったり,うまく表示できない
ことがあります.

例: マイドキュメント ---> MyDocument

Delphi 6Pro以上でしたら.Demoフォルダにシェルコンポーネントが
あります.これを使うのも手だと思います.
わざわざ,サンプル[812]のコンポを作成したのは,業務では,特殊
フォルダを使わないこと(ほとんど共有フォルダ)と,Delphi添付の
シェルコンポの使い勝手がいまいちだったからです.
ん? コンパイルじゃなくてインストールだったかな?


[3892] Re3:Delphi6による動作検証返信 削除
2010/11/4 (木) 22:38:48 たてぐや
▼ Mr.XRAYさん

 多々解説ありがとうございます。シェルコンポーネントはすでにインストー
ルしてありまます。あまりいじったことはないのですが、試しにサンプルと
同じようなものを作ってみました。右ペインでファイル名を右クリックして
コンテキストメニューを表示するところで、フォルダなら表示されますが、
単体ファイルだとやはり外部例外が発生してしまいました。オープンダイア
ログでの表示でファイルを右クリックしても発生しますから、これはこうい
うものなのかもしれません。

[3894] Re4:Delphi6による動作検証返信 削除
2010/11/5 (金) 17:40:45 Mr.XRAY
> 単体ファイルだとやはり外部例外が発生してしまいました。オープンダイア
> ログでの表示でファイルを右クリックしても発生しますから、これはこうい
> うものなのかもしれません。


う〜む.何なんでしょう.気になります(笑)
少し気持ちを落ち着かせてから調査してみます.


[3896] Re5:Delphi6による動作検証返信 削除
2010/11/5 (金) 19:50:06 宮 〔HomePage
▼ Mr.XRAYさん
> 少し気持ちを落ち着かせてから調査してみます.
ご無沙汰してます。

なが〜いイントロ。(グチ)
Windows7では、特殊フォルダの間では従来の上の階層という概念が無くなった?。
クスプローラーにそのボタンがない。
デスクトップでさえ、他のドライブへ移動できる。
ドキュメントも当然移動できる。
この上で、ライブラリの下のドキュメントは仮想のフォルダである。
(実態がない)
そのくせ、その下のフォルダやファイルは実体のあるファイルなので
仮想のつもりで削除したら偉い事になった。
まえは、実体上と違うがデスクトップが一番上だった。
ドキュメントから上の階層へいくとデスクトップになった。
しかし、7のエクスプローラーは上の階層へいく事はできない。
前に戻る事になる。
だから、がんばっても最初開いフォルダ以上の階層へは行けない。
まえは、ちょっと目に触れないようにフォルダに隠していた写真を、
7に移行したら、根こそぎ、ピクチャーへ引きずり出されて、泡を食った。
今までもネットワークはわかりにくかったけど、
ワークグループの他にホームグループってできてますます解らなくなった。
イージー設定で設定自体は簡単にできるかもしれないけど
何がどうなっちゃっているのと考え出したら神経衰弱になりそう。
だって、ライブラリに引きずり出された上に、
ライブラリごとデフォルトで共有モードになっているなんて知ったときは、
腰を抜かした。
何考えてるのかねえ〜msは。7のエクスプローラーのツリービューは
もう、めちゃくちゃになった。

そういうわけで、従来のエクスプローラのような自作ソフトの
フォルダツリーでは7に対応できなくなったので、
何とかしなければと考えているとき、
タイムリーにマスターがエクスプローラー関係を更新したというので
期待して取り組んだのですが・・・・・

マスターもおっしゃられているように、
これは、職場で他の変なフォルダに書き込んだり
読み込んだりしないようにルートフォルダを決めておく前提ですね。
これはこれでいいのですが、

私は希望を言えば、てっぺんからの
(7は何がてっぺんか解らなくなりましたけど。)
全ドライブ、から欲しいです。
それと、マスターのは右画面のファイルの表示がとても早くて魅力でしたので
作り込んでいったら、複数のファイルを選択できないのに気づきました。
ListView1.MultiSelect:=false;でないと動かないのですね。
これも何とかならないんでしょうね。

ツリーフォルダをしこしこ作ったのですが
私の力では、ネットワークができませんでした。
いやそれしかできなかったです。

それにしても、DemoにあるShellTreeviewは7でも使えるのだから
やはりプロが作ったのはたいしたもんですね。
これってソースもあるから改造できないのですか?
もっとも見てみたけどさっぱり解らなかったです。(^_^;)
やはり、ShellTreeviewこれでいくしかないかなあ〜。
ルートも変えられるし。
私がここ一週間没頭して挫折したエクスプローラまがいのベース部分の
試作途中です。
http://www016.upp.so-net.ne.jp/miyaindex/CustomMaidType.zip
マスターのサンプルをベースにぐちゃぐちゃにいじり回しました。
数々の失礼をお許し下さい。ご免下さい。m(_ _)m

あと、アイコンをダブルクリックするのもマスターに教えてもらったものです。
ただ、ファイル名を変更できないままです。


[3897] Re6:Delphi6による動作検証返信 削除
2010/11/5 (金) 21:30:04 Mr.XRAY
▼ 宮さん

宮さんの書いていることは,おそらく多くの人が思っていることだと思い
ますね.マイクロソフトしては,どうしも,マイピクチャーや,マイミュ
ージックというフォルダを使わせたいんだと思います.

私の周囲の人に,もちろん,この方が多いのですが,ドライブという概念,
知識がある人は少ないです,
多くの人は,マイ何とかです.当然普通にダウンロードしたり,ワードの
文書を作成した時もデフォルトでそうなっていますから.

> ListView1.MultiSelect:=false;でないと動かないのですね。
> これも何とかならないんでしょうね。


これぐらいだったら...

> http://www016.upp.so-net.ne.jp/miyaindex/CustomMaidType.zip
> マスターのサンプルをベースにぐちゃぐちゃにいじり回しました。


なるほど,動かしてみました.TWebBrowserでファイルリストですね.

ところで,
特殊フォルダを扱ったするには,ウィンドウズのシェルの名前空間という
機能を使います.項目識別子,PItemIDListというやつで管理します.
汎用的にフォルダツリーやファイルリストを作成するにはこれを使います.
Delphi付属のシェルコンポーネントもそうです.

> これは、職場で他の変なフォルダに書き込んだり
> 読み込んだりしないようにルートフォルダを決めておく前提ですね。


ということなんです.これで今のところ十分機能していますので.
詳細表示以外は無用ですし.

詳細表示は,OSが違っても間違いなく同様なコードで処理できます.
他の表示は,宮さんもご存知の通り違いがあり,OSの違いを考慮するのは
結構ややこしそうです.
エクスプローラと同じ機能を望むなら,エクスプローラそのものを使うのが
一番でしょう(笑)

宮さんのような多機能のブラウザに実装するなら,詳細表示だけにして,
画像などの表示は,それ専用のコントロールを作成して表示する,という
考え方もあるのではないかと,思うこともあります.

> やはり、ShellTreeviewこれでいくしかないかなあ〜。
> ルートも変えられるし。


でしょうね.


[3898] Re7:Delphi6による動作検証返信 削除
2010/11/6 (土) 12:26:42 宮 〔HomePage
▼ Mr.XRAYさん
>
読んで下さってありがとうございました。
実は先生に添削してもらいたかったもので。
手に負えないので、試作途中で投げましたけど。
なにかヒントがもらえるのではないかという下心もあり。(^_^;)

やはり、エクスプローラーとインターネットエクスプローラーは
msの旗艦ソフトですね。無料だから気づかないけど。

(#だって、Linuxにエクスプローラーほどの使い勝手をさせるソフトが
未だにでないのだから。
デスクトップに熱心なUbuntuさんでもまだ
sudo /etc/init.d/networking restart
などとやっているのだから100年たってもWindowsには対抗できない。)

でも、msも7でエクスプローラーにBrowserをはっきり使ってきたのですから
今後、この関連のサンプルコードもお願いします。

参考やヒントは得られました。
ありがとうございました。



[3904] Re8:Delphi6による動作検証返信 削除
2010/11/9 (火) 17:42:40 Mr.XRAY
▼ 宮さん

> 実は先生に添削してもらいたかったもので。

とんでもはっぷん,あるいてじゅっぷんです.
アドバイスさえ,ままなりません,

宮さんの場合,多機能のブラウザということで,アプリの画面でファイル
の管理もできる機能をということで,エクスプローラのような操作を実現
させるわけですよね.

TEmbeddedWBコンポーネント上に表示させると,ファイル名の変更等も
自分でコーディングしないといけないので決行大変ですね.
また,左側にフォルダツリーを表示しても,右ペインの左側にも,
Windows XP以降ではフォルダ関係のペインが表示されてしまいます.

IShellBrowserインターフェイスかなんかで表示すれば,もしかしたら
という思いはあるのですが,試したことはないし,できたとしても,
TEmbeddedWBコンポ上でうまく表示可能かも分かりません.
今,TEmbeddedWBのサイトを検索したら,IShellBrowserの単語が書いて
あるページがありました.
何か関係があるかどうかは,全くわかりません.


[3925] Re9:Delphi6による動作検証返信 削除
2010/11/12 (金) 14:57:57 宮 〔HomePage
▼ Mr.XRAYさん
> また,左側にフォルダツリーを表示しても,右ペインの左側にも,
> Windows XP以降ではフォルダ関係のペインが表示されてしまいます.


私の、Windows7はXPのエクスプローラーのような左ペインが表示されません。
購入当初どこかカスタマイズしたのかな?

IShellView/IShellBrowserを読んでいます。今のところさっぱり解りません。
ぼちぼち勉強します。
ありがとうございました。

[3926] Re10:Delphi6による動作検証返信 削除
2010/11/12 (金) 16:07:04 Mr.XRAY
▼ 宮さん

> 私の、Windows7はXPのエクスプローラーのような左ペインが表示されません。
> 購入当初どこかカスタマイズしたのかな?


いえ,Windows Vista以降,IEとエクスプローラのインターフェイスが変更
になったためです.
Windows XPではIShellBrowserはフォルダビュー(フォルダ内のビューの意味
でファイルのリストのことです)は,確かにフォルダビューだったのですが,
左の何とかというペインも表示されるようになっていました.
これを制御する方法はないようです.

Windows Vista以降では,このペインの部分とフォルダビューが独立した
機能(インターフェイス)となったようです.

インターフェイス(Interface)関係の実装は難しいですよ.
TInterfacedObjectを継承して,
IDispatchやら,IServiceProviderとかIUnknownやら


[3927] インターフェイスの実装返信 削除
2010/11/12 (金) 16:25:01 Mr.XRAY
> インターフェイス(Interface)関係の実装は難しいですよ.

何かの参考に,ならないかな?

例えば,TInterfacedObjectを継承した,ICommDlgBrowserの機能を利用する
インターフェイスオブジェクトを実装するには,
ShlObj.pasのICommDlgBrowserに3つの関数があります.これをコピーしてコード
に貼り付けて,実現部を作成し,それぞれの関数の役割をネット(MSDNも含む)で
調べて書いていくことになります.
まず,目的の動作のために,どんなインターフェイスが必要なのかも調べなければ
なりません.
ハッキリ言って,気が遠くなります.

ShlObj.pas内のICommDlgBrowse部分

type
  ICommDlgBrowser = interface(IUnknown)
    [SID_ICommDlgBrowser]
    function OnDefaultCommand(const ppshv: IShellView): HResult; stdcall;
    function OnStateChange(const ppshv: IShellView; Change: ULONG): HResult; stdcall;
    function IncludeObject(const ppshv: IShellView; pidl: PItemIDList): HResult; stdcall;
  end;

コピーして貼り付け


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShlObj;

type
  TplMyInterface = class(TInterfacedObject, ICommDlgBrowser)
  private
  public
    function OnDefaultCommand(const ppshv: IShellView): HResult; stdcall;
    function OnStateChange(const ppshv: IShellView; Change: ULONG): HResult; stdcall;
    function IncludeObject(const ppshv: IShellView; pidl: PItemIDList): HResult; stdcall;
  end;


  TForm1 = class(TForm)
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TplMyInterface }

function TplMyInterface.IncludeObject(const ppshv: IShellView;
  pidl: PItemIDList): HResult;
begin
  //ここに必要な処理を書く
  //Result := E_NOTIMPL;
end;

function TplMyInterface.OnDefaultCommand(const ppshv: IShellView): HResult;
begin
  //ここに必要な処理を書く
  //Result := S_FALSE;
end;

function TplMyInterface.OnStateChange(const ppshv: IShellView;
  Change: ULONG): HResult;
begin
  //ここに必要な処理を書く
  //Result := S_OK;
end;

end.


[3928] Re11:Delphi6による動作検証返信 削除
2010/11/12 (金) 16:49:03 Mr.XRAY
> Windows XPではIShellBrowserはフォルダビュー(フォルダ内のビューの意味
> でファイルのリストのことです)は,確かにフォルダビューだったのですが,
> 左の何とかというペインも表示されるようになっていました.
> これを制御する方法はないようです.


こんな感じです.下がWindows 7の図です


[3899] コンテキストメニューコンポ.重大バグ返信 削除
2010/11/6 (土) 12:42:53 Mr.XRAY
▼ たてぐやさん

> ログでの表示でファイルを右クリックしても発生しますから、これはこうい
> うものなのかもしれません。


スミマセン,申し訳ありません.ゴメンなさい,
昨日確認しました.単純なミスでした.バグです.
ということはドロップソースコンポも同じかも.

http://mrxray.on.coocan.jp/Delphi/plSamples/812_ExplorerTest.htm#01
で最初からテストしていれば見つかるバグです.
つまり,テストをさぼりました.
直します.
でも,参考にしたURLのコードも,該当部分は同じなんです.
たてぐやさんがここにカキコしなかったら,永久に見つからなかったかも.


[3900] 修正UPしました返信 削除
2010/11/7 (日) 10:12:36 Mr.XRAY
ドライブ直下のフォルダやファイルを操作対象にすると発生していた
ようです.
ドライブの判定方法に間違いがありました.
修正しました.


[3901] Re:修正UPしました返信 削除
2010/11/7 (日) 22:04:19 たてぐや
▼ Mr.XRAYさん

> ドライブの判定方法に間違いがありました.
> 修正しました.


 さっそくにありがとうございました。
 今日は午前中にテレビ購入の下見に行き、ごごから東京国立博物館の
「東大寺大仏―天平の至宝―」を見に行き、帰って来てからギターの弦
の張り替えをやっていたりして試す時間がありま線でした。明日は午後
から有休をとっているのでやってみようと思っています。

[3902] Re2:修正UPしました返信 削除
2010/11/7 (日) 23:28:09 Mr.XRAY
▼ たてぐやさん

>  ごごから東京国立博物館の「東大寺大仏―天平の至宝―」を見に行き、

あっ,行かれたんですか.
今年は平安遷都1300年ということで,奈良の博物館でも何かやって
いるらしいですね.


[3918] Re3:修正UPしました返信 削除
2010/11/10 (水) 21:06:41 たてぐや
▼ Mr.XRAYさん

 修正版の動作確認を行いました。やはりDelphi10のプロジェクトをそのまま
Delphi6で触ったのではうまくないです。(あたりまえ)COUウインドゥがしつ
こく出ますが、前に書いた外部例外はなくなりました。

> あっ,行かれたんですか.
> 今年は平安遷都1300年ということで,奈良の博物館でも何かやって
> いるらしいですね.


 「平城」です。奈良では正倉院展をやってますね。東大寺大仏展に、正倉院
宝物が特別展示されていましたが、それはそれは素晴らしいものでした。あん
なものがざくざくある正倉院って、なんてすごいんでしょう、と感動しました。

[3919] Re4:修正UPしました返信 削除
2010/11/10 (水) 22:04:12 Mr.XRAY
▼ たてぐやさん

> Delphi6で触ったのではうまくないです。(あたりまえ)COUウインドゥがしつ

あれっ?
う〜む.Delphi 6でテストしたつもりなんですが...
またちょっとみてみます.

>  「平城」です。奈良では正倉院展をやってますね。

失礼!!

[3922] Re5:修正UPしました返信 削除
2010/11/11 (木) 22:30:52 たてぐや
▼ Mr.XRAYさん

> う〜む.Delphi 6でテストしたつもりなんですが...

 乗りかかった船なのでレポートを…

01_ContextMenu_Test
  Application.MainFormOnTaskbar := True;
[エラー] Project1.dpr(11): 未定義の識別子 : 'MainFormOnTaskbar'

01_ExplorerTest
Solitter1.ExplicitHeightの読み込みエラーです。プロパティが存在し
ません。
「すべて無視」で読み込んで実行するとCPUウィンドゥが出ます。繰り
返すと実行は正常にできます。

02_ContextMenu_Command
  Application.MainFormOnTaskbar := True;
[エラー] Project1.dpr(11): 未定義の識別子 : 'MainFormOnTaskbar'

02_plContextMenu_Test01
問題なくコンパイル・ランできます。

03_DropSourceTest
  Application.MainFormOnTaskbar := True;
[エラー] Project1.dpr(11): 未定義の識別子 : 'MainFormOnTaskbar'

03_plContextMenu_Test02
CPUウィンドルが出ます。しつこくランしても実行に至りません。

04_OpenDlg_Application
CPUウィンドゥが出ますが、3回ほどで正常に実行できます。が、ボタン
クリックでまたCPUウィンドゥが」出ます。


[3923] Re6:修正UPしました返信 削除
2010/11/11 (木) 23:09:30 Mr.XRAY
▼ たてぐやさん,

詳細なテスト結果ありがとうございます.
実はまだ手をつけていません.
大いに参考にさせていただきます.

それにしても他の方はどしているんでしょうね?
環境による違いはなんともはや.
先ほどOleVariantについて調べていたのですが,

http://programamemo2.blogspot.com/2010/03/delphi-varutilsvariantinittvardata.html
ここに,

>    vEmpty: OleVariant;
>    略
>    VariantInit(vEmpty);


>かなーって感じでしたが、これだとコンパイル時にエラーがでます。

という記事があるんですが,私の環境だと(もちろんDelphi 2010)
コンパイルエラーは発生しないんですよね.


[3929] コンテキストメニューコンポのテスト返信 削除
2010/11/12 (金) 21:32:28 Mr.XRAY
うーむ.どうしてもエラーが発生する状況を作れません.
しばらく頭を休めます.
一応テスト環境は,Windows XP(SP3) + Delphi 6 Proです

http://mrxray.on.coocan.jp/Delphi/plSamples/812_ExplorerTest.htm#01
のリスト1のテストプログラムにコンテキストメニューコンポを追加
してテストしました.

PopupMenuにplContextMenuコンポを設定し,
plContextMenuコンポのOnPopupイベントに以下のコードを追加しました

procedure TForm1.plContextMenu1Popup(Sender: TObject);
var
  i : Integer;
begin
  plContextMenu1.Files.Clear;
  plContextMenu1.Directory := plFileList1.ExpandFolder;
  for i := 0 to plFileList1.CopyFilesList.Count - 1 do begin
    plContextMenu1.Files.Add(ExtractFileName(plFileList1.CopyFilesList[i]));
  end;
end;

もうひとつは,マウスのボタンダウンの以下のコードです.

procedure TForm1.plFileList1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  APos : TPoint;
  i    : Integer;
begin
  if Button=mbRight then begin
    plFileList1Click(nil);

    GetCursorPos(APos);
    plContextMenu1.Files.Clear;
    plContextMenu1.Directory := plFileList1.ExpandFolder;
    for i := 0 to plFileList1.CopyFilesList.Count - 1 do begin
      plContextMenu1.Files.Add(ExtractFileName(plFileList1.CopyFilesList[i]));
    end;
    plContextMenu1.Popup(APos.X, APos.Y);


//    //マウスの座標値をplFileList1の座標値に変換
//    APos   := plFileList1.ClientToScreen(Point(X, Y));
//    if plFileList1.Selected = nil then begin
//      PopupMenu2.Popup(APos.X, APos.Y);
//    end else
//    if plFileList1.SelCount = 1 then begin
//      PopupMenu1.Popup(APos.X, APos.Y);
//    end;
  end;
end;


[3930] Re:コンテキストメニューコンポのテスト返信 削除
2010/11/12 (金) 22:37:17 たてぐや
▼ Mr.XRAYさん
> うーむ.どうしてもエラーが発生する状況を作れません.
> しばらく頭を休めます.


 何度も済みません。ゆっくり頭を休めてください。私も2日ほどお休みします。

[3963] Re2:コンテキストメニューコンポのテスト返信 削除
2010/11/28 (日) 22:10:03 Mr.XRAY
▼ たてぐやさん,遅くなっています.

>  何度も済みません。ゆっくり頭を休めてください。私も2日ほどお休みします。

頭を休めたかどうかはわかりませんが.
まったく別のプログラムなんですが,
項目識別子のコードをいじっていたら,CPUウィンドウがよく出てきています.
多分,そうじゃないかという部分を見つけました.

近いうちに修正するつもりです.


[3964] Re3:コンテキストメニューコンポのテスト返信 削除
2010/11/28 (日) 22:16:34 たてぐや
▼ Mr.XRAYさん
>たてぐやさん,遅くなっています.

 とんでもありません。お休みできましたか?

> まったく別のプログラムなんですが,
> 項目識別子のコードをいじっていたら,CPUウィンドウがよく出てきています.
> 多分,そうじゃないかという部分を見つけました.
> 近いうちに修正するつもりです.


 ゆっくりでいいですけど、期待しています。

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