人気ブログランキング | 話題のタグを見る

[Delphi] TShellTreeViewやTShellListView間でドラッグ&ドロップする 【EListError回避版】

こんにチワワ。どーもボキです。

前回の紹介バージョンでは、何も入っていないフォルダに対してドロップを行うと、TListErrorが発生する。(下図)
ちなみに、エラーメッセージウィンドウを閉じれば押せば正常に処理される。

おそらくTShellListViewかその親となるコンポーネントにバグがあると思われるが、
ShellCtrls.pasのソースがインストールされてなく修正できない(あってもやらない)ので、別の回避方法を考えた。
[Delphi] TShellTreeViewやTShellListView間でドラッグ&ドロップする 【EListError回避版】_a0021757_1733233.gif


以下のように、TShellListViewが何も表示していない場合、
DragDropイベント時にダミーファイルを作成し表示更新させ、EndDragイベントで、そのダミーファイルを消す。

こうすればエラーを回避できる。
// ドラッグ中にダミーファイル作成
procedure TForm1.ShellListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
_SLV : TCustomShellListView;
_STV : TCustomShellTreeView;
begin
if Sender is TShellListView then begin
_SLV := TCustomShellListView(Sender);
_STV := _SLV.ShellTreeView;
end else if Sender is TShellTreeView then begin
_STV := TCustomShellTreeView(Sender);
_SLV := _STV.ShellListView;
end else exit;
if _SLV.Items.Count > 0 then exit;

//※EListError回避のため、ダミーファイルを作成し表示更新
FileClose(FileCreate(_STV.Path+'\AvoidEListError'));
_SLV.Refresh;
end;

// ドラッグ終了時にコピー処理
procedure TForm1.ShellListView1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
//~ 省略 ~

DeleteFile(_STV[1].Path +'\AvoidEListError'); // ダミーファイルを削除
_SLV.Refresh;
end;

[Delphi] TShellTreeViewやTShellListView間でドラッグ&ドロップする
by yozda | 2015-05-17 17:02 | プログラミング | Comments(0)