Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.25;
Скачать: CL | DM;

Вниз

OpenFileDialog, туда, где недавние документы   Найти похожие ветки 

 
savyhinst ©   (2008-04-25 18:17) [0]

Здраствуйте.
Подск. пож., Как в OpenFileDialog, туда, где недавние документы, рабочий стол и проч. добавить ещё своё? Т.е. чтобы в мой диалог добавилась справа кнопка, по нажатию на которую диалог бы переходил в определённую папку. Спасибо за внимание.


 
Jimmy   (2008-04-25 19:36) [1]

Привожу выдержку из какого-то форума. От себя добавлю: если хотите добавить контрол, получиться, иначе, думаю - нет.

Вообще, винда предоставляет возможность расширения некоторых стандартных диалогов с помощью шаблонов и hook-процедуры. Например, для OpenFileDialog"а пишется к примеру, такой rc-скрипт с шаблоном

myres.rc
Code:
OFT DIALOG -1, 1, 304, 62
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
CONTROL "Select Options", 100, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 69, 4, 224, 52

CONTROL "CheckBox1", 101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12

CONTROL "CheckBox2", 102, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 38, 60, 12
}

потом он компилится brcc32.exe myres.rc
и получается myres.res, который линкуется к проекту директивой {$R} (удобнее, конечно создавать и компилить шаблон в каком-нить редакторе ресурсов, типа Resource Workshop"а).

Ну а в проге заполняется структура TOpenFileName (надо в uses подключить commdlg), у которой в поле lpTemplateName задается имя шаблона, а в поле lpfnHook - hook-процедура. В этой hook-процедуре и обрабатывается реакция на дополнительные контролы (например чекбоксы). Там же можно обработать смену типа файла, директории, выбранного файла, нажатие на OK, etc.
Ну а для показа самого диалога вызывается API"шная GetOpenFileName

Короче, вот пример кода
Code:
uses commdlg;

{$R *.dfm}

{$R MYRES.RES} // файл ресурсов с шаблоном

var ofn:TOpenFileName;
f:array[0..MAX_PATH-1] of Char;
// hook-процедура
function Fh(Wnd: HWND; Msg:cardinal; wParam,lParam: Integer): UINT stdcall;
begin
result:=0;
case Msg of
WM_INITDIALOG:
          begin
            CheckDlgButton(Wnd,101,BST_CHECKED);  // отметим первый чекбокс
           end;
WM_COMMAND: // реакция на изменение состояния чекбоксов
    case LOWORD(wParam) of
     101:
        begin
         if (IsDlgButtonChecked(Wnd,101)=BST_CHECKED) then MessageBox(Wnd,"CheckBox1 Checked!","FileOpenDialog",0);
        end;
     102:
        begin
         if (IsDlgButtonChecked(Wnd,102)=BST_CHECKED) then MessageBox(Wnd,"CheckBox2 Checked!","FileOpenDialog",0);
        end;
    end;
WM_NOTIFY:
 case
 POFNotify(lParam)^.hdr.code of
  CDN_FILEOK:  // реакция на выбор файла
      begin
       if (IsDlgButtonChecked(Wnd,101)=BST_CHECKED) then
        MessageBox(Wnd,PChar("CheckBox1 Checked and "+ofn.lpstrFile+" selected"),"FileOpenDialog",0);
       if (IsDlgButtonChecked(Wnd,102)=BST_CHECKED) then
        MessageBox(Wnd,PChar("CheckBox2 Checked and "+ofn.lpstrFile+" selected"),"FileOpenDialog",0);
       end;
 end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FillChar(f,sizeof(f),0);
FillChar(ofn,sizeof(ofn),0);
ofn.lStructSize := sizeof(TOpenFileName);
ofn.hwndOwner := Handle;
ofn.hInstance := hInstance;
ofn.lpstrFilter       :=  "Text Files (*.TXT)"#0"*.txt"#0+
                         "Executables (*.EXE)"#0"*.exe"#0+
                          "All files (*.*)"#0"*.*"#0#0;
ofn.lpstrTitle        := "Select File";
ofn.lpstrFile         := f;
ofn.nMaxFile          := MAX_PATH;
ofn.lpTemplateName    :="OFT";   // имя шаблона
ofn.lpfnHook          := Fh;     // hook-процедура
ofn.Flags             := OFN_EXPLORER or OFN_CREATEPROMPT or
                        OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or
                        OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or
                        OFN_ENABLETEMPLATE;
// показываем диалог
if GetOpenFileName(ofn) then ShowMessage(ofn.lpstrFile);
end;


 
savyhinst ©   (2008-04-25 20:55) [2]

у... серьёзно. спасибо.



Страницы: 1 вся ветка

Текущий архив: 2008.05.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.016 c
2-1209038366
worldmen
2008-04-24 15:59
2008.05.25
Как показать Hint любого объекта на StatusBar?


15-1208079846
webster
2008-04-13 13:44
2008.05.25
Домен


2-1209063299
Артемка
2008-04-24 22:54
2008.05.25
mainmenu


11-1189607486
imp
2007-09-12 18:31
2008.05.25
Ошибка в методе TStrList.LoadFromFile, kol 2.78


2-1209748967
NieL
2008-05-02 21:22
2008.05.25
API-функция