Перевод одноимённой статьи с сайта delphi.about.com )

 

Стандарные диалоговые окошки

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

В этой статье мы рассмотрим основные свойства и методы этих диалогов и, особенно, сфокусируем внимание на диалогах Open и Save.

 

Code:

 

function DisconnectNetworkDrive(Wnd: HWND = 0): DWORD;

begin

if Wnd = 0 then Wnd:=FindWindow('Shell_TrayWnd','');

Result:=WNetDisconnectDialog(Wnd, RESOURCETYPE_DISK);

end;

  

 

Пример использования:

Code:

DisconnectNetworkDrive(Application.Handle);

 

Code:

uses ShellAPI, ShlObj;

 

procedure TForm1.Button1Click(Sender: TObject);

var

TitleName : string;

lpItemID : PItemIDList;

BrowseInfo : TBrowseInfo;

DisplayName : array[0..MAX_PATH] of char;

TempPath : array[0..MAX_PATH] of char;

begin

FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);

BrowseInfo.hwndOwner := Form1.Handle;

BrowseInfo.pszDisplayName := @DisplayName;

TitleName := 'Please specify a directory';

BrowseInfo.lpszTitle := PChar(TitleName);

BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;

lpItemID := SHBrowseForFolder(BrowseInfo);

if lpItemId  nil then begin

   SHGetPathFromIDList(lpItemID, TempPath);

   ShowMessage(TempPath);

   GlobalFreePtr(lpItemID);

end;

end;

 

 

  

Code:

procedure TStartForm.NetBtnClick(Sender: TObject);

var

OldDrives: TStringList;

i: Integer;

begin

OldDrives := TStringList.Create;

// Запоминаем список дисков

OldDrives.Assign(Drivebox.Items);

// Показываем диалог подключения

if WNetConnectionDialog(Handle, RESOURCETYPE_DISK) = NO_ERROR then

begin

   // Обновляем список дисков

   DriveBox.TextCase := tcLowerCase;

   for i := 0 to DriveBox.Items.Count - 1 do

   begin

     // Ищем свободный логический диск

     if Olddrives.IndexOf(Drivebox.Items[i]) = -1 then

     begin

       // Показываем первый найденный логический диск

       DriveBox.ItemIndex := i;

       // Каскадируем обновление на список подключенных каталогов и др.

       DriveBox.Drive := DriveBox.Text[1];

     end;

   end;

   DriveBox.SetFocus;

end;

OldDrives.Free;

end;

 

Для вывода диалога "Обзор папок" существует функция SHBrowseForFolder. Для выбора того, какие папки будут выведены в диалоге, используется функция SHGetSpecialFolderLocation. В этой программе выводится рабочий стол со всеми подпапками (папки рабочего стола, Мой компьютер, Корзина). Для выбора папки в меню пуск используется CSIDL_STARTMENU вместо CSIDL_DESKTOP.

Автор: Terrance Hui

 

Пример показывает стандартное диалоговое окно, которое обычно используется для подтверждения дальнейших действий в любой программе с галочкой "Don't show this message again."

 

Используем функцию CreateMessageDialog и добавляем любой компонент до того как будет вызвана ShowModal.

Code:

ShellExecute(Application.Handle, 'open', 'sysdm.cpl', nil, nil,sw_ShowNormal);

 

 

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   SaveDialog1: TSaveDialog;

   Button1: TButton;

   procedure SaveDialog1Show(Sender: TObject);

   procedure Button1Click(Sender: TObject);

private

   { Private declarations }

public

 

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

// Стили: $7029 - значки, $702B - список, $702C - таблица, $702D - эскизы, $702E - плитка

// ставим, например таблицу

function NewSaveDlgProc(wnd:HWND; uMsg:integer; wParam:integer; lParam:integer):integer; stdcall;

begin

if uMsg=WM_SHOWWINDOW then

begin

MoveWindow(wnd, 10, 30, 500, 300, True) ;

SendMessage(FindWindowEx(wnd, 0, 'SHELLDLL_DefView', nil), WM_COMMAND, $702C, 0);

end;

result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,uMsg,wParam,lParam)

end;

 

procedure TForm1.SaveDialog1Show(Sender: TObject);

begin

SetWindowLong(GetParent(SaveDialog1.Handle),GWL_USERDATA,

    SetWindowLong(GetParent(SaveDialog1.Handle),DWL_DLGPROC,DWORD(@NewSaveDlgProc)));

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

SaveDialog1.Execute

end;

 

end.

 
Автор: Krid

 

Code:

uses ComObj;

 

{....}

 

procedure TForm1.Button1Click(Sender: TObject);

var

shell: Variant;

begin

shell := CreateOleObject('Shell.Application');

shell.ShutdownWindows;

end;

 

Данная функция демонстрирует 3 очень мощных и полезных процедуры, интегрированных в Delphi.

 

Диалоговые окна InputBox и InputQuery позволяют пользователю вводить данные.

 

Функция InputBox используется в том случае, когда не имеет значения что пользователь выбирает для закрытия диалогового окна - кнопку OK или кнопку Cancel (или нажатие клавиши Esc). Если вам необходимо знать какую кнопку нажал пользователь (OK или Cancel (или нажал клавишу Esc)), используйте функцию InputQuery.

 

Приведенный пример показывает использование DDE для вызова диалога 'Найти файлы и паки' Explorerа. Диалог открывается на каталоге "C:\Download".

Code:

           procedure TForm1.Button1Click(Sender: TObject);

            begin

              with TDDEClientConv.Create(Self) do begin

                ConnectMode := ddeManual;

                ServiceApplication := 'explorer.exe';

                SetLink( 'Folders', 'AppProperties');

                OpenLink;

                ExecuteMacro('[FindFolder(, C:\DOWNLOAD)]', False);

                CloseLink;

                Free;

              end;

            end;