![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как при открытии TOpenDialog задать формат отображения файлов?
Tack © (2007-07-05 15:40:00)Т.е. нужно при показе диалога открытия файла сразу переключать его в вид "Эскизы страниц" или "Список" или "Таблица". Есть возможность это сделать в программном коде?
Rouse_ (2007-07-10 11:40:00) [1]Я немного по другому делал (через перегрытие DLGPROC), но как вариант:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure OpenDialog1Show(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
DLGStyle: Integer;
const
ODM_VIEW_ICONS = $7029;
ODM_VIEW_LIST = $702b;
ODM_VIEW_DETAIL = $702c;
ODM_VIEW_THUMBS = $702d;
ODM_VIEW_TILES = $702e;
DlgStyles: array [0..4] of Integer =
(ODM_VIEW_ICONS,
ODM_VIEW_LIST,
ODM_VIEW_DETAIL,
ODM_VIEW_THUMBS,
ODM_VIEW_TILES);
function NewOpenDlgProc(Wnd: HWND; uMsg: DWORD;
WParam, LParam:integer): Integer; stdcall;
var
ShellHandle: THandle;
begin
if uMsg = WM_SHOWWINDOW then
begin
ShellHandle := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil);
SendMessage(ShellHandle, WM_COMMAND, DLGStyle, 0);
end;
Result := CallWindowProc(Pointer(GetWindowLong(Wnd, GWL_USERDATA)), Wnd, uMsg, WParam, LParam);
end;
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
SetWindowLong(GetParent(OpenDialog1.Handle), GWL_USERDATA,
SetWindowLong(GetParent(OpenDialog1.Handle), DWL_DLGPROC, DWORD(@NewOpenDlgProc)));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DLGStyle := DLGStyles[TComponent(Sender).Tag];
OpenDialog1.Execute;
end;
end.
Tack (2007-07-07 12:01:00) [2]Никогда бы такое не пришло в голову, и в MSDN про это ни строчки.
Спасибо огромное!
clickmaker (2007-07-06 17:18:00) [3]
procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
var
Wnd: HWND;
AStyle: DWORD;
begin
Wnd := GetParent(OpenDialog1.Handle);
Wnd := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil);
if Wnd <> 0 then begin
Wnd := FindWindowEx(Wnd, 0, 'SysListView32', nil);
AStyle := GetWindowLong(Wnd, GWL_STYLE);
if (AStyle and LVS_REPORT) = 0 then
AStyle := AStyle or LVS_REPORT;
SetWindowLong(Wnd, GWL_STYLE, AStyle);
// force items recreation, didn't find more beautiful way...
PostMessage(Wnd, WM_CONTEXTMENU, 0, 0);
PostMessage(Wnd, WM_KEYDOWN, VK_ESCAPE, 0);
end;
end;
начиная с ХР можно использовать LVM_SETVIEW