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

Вниз

Свои кнопки в OpenDialog   Найти похожие ветки 

 
Gu   (2011-05-26 01:14) [0]

Можно ли в опен(сейв) диалог стандартный добавить свою кнопку в левое окошко (там где "мой компутер", "мои документы", "сеть" и тп.? Если можно, то пример плз. Например чтобы при нажатии свой путь активным становился. Или как вариант заменить там все кнопки на кнопки дисков в системе. Возможно, что проще свой диалог создать, но если есть возможность, то былобы проще так.


 
Rouse_ ©   (2011-05-26 11:23) [1]

Ну например вот так.

Это RC файл:

SAVE_FILE_TEMPLATE DIALOG -1, -1, 304, 22
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
CONTROL "Добавить дату и время к названию файла", 101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 69, 0, 224, 21
}


Это код:

unit CustomOpenSaveDialog;

interface

uses
 Windows, Messages, CommDlg, Dialogs;

{$R "savedlgcheck.res" "savedlgcheck.rc"}

type
 TCheckedSaveDialog = class
 private
   FFileName, FInitialDir: String;
 public
   function Execute(Handle: THandle): Boolean;
   property FileName: String read FFileName;
   property InitialDir: String read FInitialDir write FInitialDir;
 end;

var
 CheckedSaveDialog: TCheckedSaveDialog = nil;

implementation

uses SysUtils;

const
 MultiSelectBufferSize = High(Word) - 16;

var
 OpenSaveFileName: TOpenFileName;
 SaveFilePath: array [0..MAX_PATH - 1] of Char;
 OpenFilePath: array [0..MultiSelectBufferSize - 1] of Char;

{ TCheckedSaveDialog }

function HookSaveDialog(Wnd: HWND; Msg: UINT;
 WParam: WPARAM; LParam: LPARAM): UINT stdcall;
var
 TempPath, ResultPath: String;
begin
 Result := 0;
 case Msg of
   WM_INITDIALOG:
     CheckDlgButton(Wnd, 101, BST_CHECKED);
   WM_NOTIFY:
   case
     POFNotify(lParam)^.hdr.code of
       CDN_FILEOK:
         if IsDlgButtonChecked(Wnd, 101) = BST_CHECKED then
         begin
           TempPath := OpenSaveFileName.lpstrFile;
           ResultPath := ExtractFilePath(TempPath);
           ResultPath := ResultPath + "(";
           ResultPath := ResultPath +
             StringReplace(DateTimeToStr(Now), ":", "-", [rfReplaceAll]) + ") ";
           ResultPath := ResultPath + ExtractFileName(TempPath);
           Move(ResultPath[1], OpenSaveFileName.lpstrFile[0], Length(ResultPath));
         end;
   end;
 end;
end;

function TCheckedSaveDialog.Execute(Handle: THandle): Boolean;
var
 StandartDialog: TSaveDialog;
begin
 ZeroMemory(@SaveFilePath[0], MAX_PATH);
 ZeroMemory(@OpenSaveFileName, SizeOf(TOpenFileName));

 OpenSaveFileName.lStructSize := SizeOf(TOpenFileName);
 OpenSaveFileName.hwndOwner := Handle;
 OpenSaveFileName.hInstance := hInstance;

 OpenSaveFileName.lpstrFilter :=  "Файлы пользовательских баз (*.gsd)"#0"*.gsd"#0#0;
 OpenSaveFileName.lpstrTitle := "Выберите имя файла";
 OpenSaveFileName.lpstrFile := SaveFilePath;
 OpenSaveFileName.nMaxFile := MAX_PATH;
 OpenSaveFileName.lpTemplateName :="SAVE_FILE_TEMPLATE";
 OpenSaveFileName.lpfnHook := HookSaveDialog;
 OpenSaveFileName.Flags := OFN_EXPLORER or OFN_CREATEPROMPT or
   OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or
   OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or OFN_ENABLETEMPLATE or
   OFN_ENABLESIZING;
 OpenSaveFileName.lpstrInitialDir := PChar(FInitialDir);
 OpenSaveFileName.lpstrDefExt := "gsd";
 Result := GetSaveFileName(OpenSaveFileName);

 if not Result then
 begin
   if CommDlgExtendedError <> 0 then
   begin
     StandartDialog := TSaveDialog.Create(nil);
     try
       StandartDialog.Filter :=
         "Файлы пользовательских баз (*.gsd)|*.gsd";
       StandartDialog.Title := OpenSaveFileName.lpstrTitle;
       StandartDialog.InitialDir := OpenSaveFileName.lpstrInitialDir;
       StandartDialog.DefaultExt := OpenSaveFileName.lpstrDefExt;
       Result := StandartDialog.Execute;
       OpenSaveFileName.lpstrFile := PChar(StandartDialog.FileName);
     finally
       StandartDialog.Free;
     end;
   end;
 end;
 
 if Result then
   FFileName := OpenSaveFileName.lpstrFile
 else
   FFileName := "";
end;


 
icWasya ©   (2011-05-26 17:16) [2]

Человек спрашивал немного не про то. (Я ответ тоже не знаю).
Слева располагается список снандартных папок, и вопрос был "как добавить свою папку именно туда";


 
Dennis I. Komarov ©   (2011-05-26 17:41) [3]


> Слева располагается список снандартных папок, и вопрос был
> "как добавить свою папку именно туда";

Нечего юзерам впаривать свои супер-пупер диалоги, вместо стандартных...
Вот увести его в свою диру, еще куда не шло, и то с возможностью настройки...


 
QAZ   (2011-05-26 18:51) [4]


> Можно ли в опен(сейв) диалог стандартный добавить свою кнопку
> в левое окошко

через реестр


 
Rouse_ ©   (2011-05-26 19:58) [5]


> icWasya ©   (26.05.11 17:16) [2]
>
> Человек спрашивал немного не про то.

Слева дак-же через шаблон, параметры шаблона на вскидку не помню, в MSDN гарантированно есть.


 
Gu   (2011-05-27 03:47) [6]

>> через реестр

дайте ключ, где это лежит

>> в MSDN гарантированно есть

там все есть, подскажите ссылку на статью. Это все равно что написать ищи в гугле, а я не за этим тут спрашивал


 
Gu   (2011-05-27 07:21) [7]

Нашел, но на Win7 это не фурычит, тока на Xp.
http://fhasovic.blogspot.com/2004/09/custom-places-bar.html



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

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

Наверх




Память: 0.49 MB
Время: 0.008 c
2-1306492115
rxngl
2011-05-27 14:28
2011.09.11
Из интернета в Exel


6-1235892446
Vladimir
2009-03-01 10:27
2011.09.11
TSocketClient и TSocketServer работа с потоками


2-1306447304
barsik
2011-05-27 02:01
2011.09.11
Как подключить ClientSocket к ServerSocket через шлюз?


2-1306827736
Handle
2011-05-31 11:42
2011.09.11
не определяется версия приложения


2-1306831572
Max
2011-05-31 12:46
2011.09.11
массивы