喫茶XRAYトップページ

[スレッド全体
]

[4037] Re3:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/21 (火) 20:37:09 Sara
▼ Mr.XRAYさん こんばんは

> > う〜ん.SelectFolderが取得できいるみたいなんですが...
> いずれにしても、明日以降に検証してみます。


検証しました。

procedure TForm2.FormCreate(Sender: TObject);
begin
   flg := True;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
   if flg then begin
     flg := False;
     plExplorerFolderTree1.RootFolder := '';
     plExplorerFolderTree1.SelectFolder := 'D:\';
     caption := plExplorerFolderTree1.SelectFolder;
   end;
end;

この状態だと、設定がされません・・・ソースをよくよく見ると、
ItemPrePaint内でFSelectFolderの設定をしているんですね。
ということは、初期表示前の状態では設定されないんですね・・・(^^;

と、いうわけで、私のような使い方をしたい場合は、
    SHGetPathFromIDList(FpidlSelectFolder, pFullPath);
    FSelectFolder := pFullPath;
の2行が必要そうです・・・(^^;

よろしくお願いいたします。

[4038] Re4:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/21 (火) 23:37:09 Mr.XRAY
▼ Saraさん

> と、いうわけで、私のような使い方をしたい場合は、
>     SHGetPathFromIDList(FpidlSelectFolder, pFullPath);
>     FSelectFolder := pFullPath;
> の2行が必要そうです・・・(^^;


なるほど,了解しました.そういうことでしたか.
やっぱり自分だけで,固定したコードでテストしているだけじゃダメ
ですね.後で見直しておきます.


[4043] Re5:947_ExplorerBrowser の plExplorerFolderTreeにて返信 削除
2010/12/22 (水) 00:43:19 Sara
▼ Mr.XRAYさん

> なるほど,了解しました.そういうことでしたか.
> やっぱり自分だけで,固定したコードでテストしているだけじゃダメ
> ですね.後で見直しておきます.


すいません、抜けがありました・・・(^^;
あの2行を追加すると、OnSelctFolderChangedが発生しないような・・・
検証がしきれてないですが、そんな気がします。(^^;

また、明日再度検証してみます。

[4046] コンポのプロパティ返信 削除
2010/12/22 (水) 11:43:59 Mr.XRAY
▼ Saraさん,いいとこついてきますねぇ.

> あの2行を追加すると、OnSelctFolderChangedが発生しないような・・・
> 検証がしきれてないですが、そんな気がします。(^^;


このあたりは,話だすと長くなりそうなんですが,
コンポの動作仕様をどのようにするかとも関係してくるんです.
今回のは,ビジュアルなコンポです,つまり,コントロールを,TPanelと
フォルダーツリーのインターフェイスオブジェクトです.

ビジュアルなコンポの場合,コンポのCreate,それを配置したフォームの
Createでは,まだ表示,生成されていません.
もちろん,フォーム自体もですが,

多くのコンポのプロパティは,既に設定してある値と同じ値を設定しようと
すると,再設定しないようにしています.
つまり,まだ表示されていないCreateで設定すると,プロパティは設定済み
です.表示してからプロパティを設定すると,同じ値だと設定作業はしない,
ということになります.したがって,その関係のイベントも発生しません.

そこで,ビジュアルなコンポでは,プロパティの設定のタイミングは,
表示に関係しないプロパティは,Create等,表示に影響を与えるプロパティは
OnLoad,SetParent等で行っています.

実は,プロパティの設定のタイミングは変更することも可能です.
それは,
ComponentStateを使うことです.
http://docwiki.embarcadero.com/VCL/ja/Classes.TComponent.ComponentState
(しかし,ホントに重たいサイトです)

    if csReading in ComponentState then exit;
    if csLoading in ComponentState then exit;
こんな感じで使用します.
この2行は,コンポが,ストリームから読出し中と,ロード中の時は設定
しないようにする例です.

別のページを作成しているコンポの場合,このことをある程度考慮して
コーディングしていますが,サンプルの方は,あまり考えないコードと
なっています.
そうでなくても,「Mr.XRAYさんのサンプルは難解すぎます」なんて
言われちゃうので (^^;

コンポが,プロパティを設定を試みるのは,完全に表示されるまで,難解,
いや,何回かあります.


[4055] Re:コンポのプロパティ返信 削除
2010/12/22 (水) 20:57:26 Sara
▼ Mr.XRAYさん こんばんは

>     if csReading in ComponentState then exit;
>     if csLoading in ComponentState then exit;
> こんな感じで使用します.

なるほど、参考になります。
ちなみに、この情報を見る前に、例の2行の下に

    if Assigned(FOnSelctFolderChanged) then begin
       if DirectoryExists(FSelectFolder) then begin
          FOnSelctFolderChanged(Self,FpidlSelectFolder,FSelectFolder);
       end;
    end;

を追加してみました。(^^; とりあえず、動いていますが、だめ?(^^;


あと、例の2行が問題だったのではなく、plExplorerFolderTreeが非表示の状態
(といっても、PageControlで別ページにある)状態で設定していたため、
またしても、ItemPrePaintが行われずOnSelctFolderChangedが発生しない状況に
あったというのが、真相でした。 ので、問題なければ、この方法で・・・(^^;


> そうでなくても,「Mr.XRAYさんのサンプルは難解すぎます」なんて
> 言われちゃうので (^^;

そうですね。私にも難解なサンプルが結構・・・(^^;
でも、まぁ私の場合、なんとなくいじっている内に理解できるので、
まずはいじり倒す・・・(^^;

[4057] Re2:コンポのプロパティ返信 削除
2010/12/22 (水) 23:31:46 Mr.XRAY
▼ Saraさん

> を追加してみました。(^^; とりあえず、動いていますが、だめ?(^^;

そんな感じでいろいろやってくださいませ.
で,ファイルリストと併用する場合は,その点に矛盾がないか確認を.

ご存知だとは思いますが,コンポーネント内のコードでプロパティを
操作する場合は,必ず,proctected部のプロパティの定義名,
ほとんど,習慣的に,先頭がFになっていますが,このFXXXXを操作します.
そうしないと,内部で循環してえらいことになることがあります.
Fなんとかがなく,Set... Getで操作しいる場合は別ですが.

> まずはいじり倒す・・・(^^;

ですよね.
「百聞は一見にしかず,百見るは,一触にしかず」
いじっているうちに見えてきたりすることもありまよね.


[4058] Re3:コンポのプロパティ返信 削除
2010/12/23 (木) 17:49:15 Mr.XRAY
> > を追加してみました。(^^; とりあえず、動いていますが、だめ?(^^;
>
> そんな感じでいろいろやってくださいませ.


ということで,いろいろいじれますので,記事のサンプルコードは
そのままにしておきます.


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