Delphi.int.ru — Портал программистов

Вход Регистрация | Забыли пароль?

События

Сегодня:
Вопросы0    Ответы0    Мини-форумы0


Последние:
Вопрос26.08, 21:10 / #6673
Ответ02.08, 00:42 / #6619
Новости30 апреля 2012


Сейчас онлайн:
На сайте — 20
На IRC-канале — 3

Ссылки

Пишем компонент - окно выбора папки

Автор: Трофим Роцкий
Источник: http://delphid.dax.ru

Среди стандартных диалогов Delphi 6 (вкладка Dialogs) диалог выбора папки, как это не прискорбно, отсутствует. Но ничего, сейчас мы исправим данное упущение, написав соответствующий компонент.

Чтобы создать новый компонент, в Delphi IDE выберите пункт File > New > Other и затем в появившемся окне нажмите New Component. Появится диалоговое окно, в котором:

  • Ancensor type (класс-предок нового компонента) - введите TComponent;
  • Class Name (имя нового класса) - TBrowseFolderDlg;
  • Palette Page (имя вкладки: поместим наш диалог вместе со стандартными дельфийскими) - Dialogs.

Остальное оставьте без изменений и нажмите OK. Наш мегадиалог будет вызываться функцией, продекларированной в Public Declarations компонента:

function BrowseFolder(title: PChar; h: hwnd): String;

Где title - заголовок диалога (поставьте любой на ваш вкус), h - хэндл окна-владельца (то есть вашей программы). А команды, использованные в коде, содержатся в ShlObj.pas, так что не забудьте указать этот модуль в разделе uses.

unit BrowseFolderDlg;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Controls, ShlObj;
 
type
  TBrowseFolderDlg = class(TComponent)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    function BrowseFolder(title: PChar; h: hwnd): String;
  published
    { Published declarations }
end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('Dialogs', [TBrowseFolderDlg]);
end;
 
function TBrowseFolderDlg.BrowseFolder(title: PChar; h: hwnd): String;
var
  lpItemID: PItemIDList;
  path: array[0..Max_path] of char; //выбранная папка
  BrowseInfo: TBrowseInfo; //настройки диалога
begin
  FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
  SHGetSpecialFolderLocation(h,csidl_desktop,BrowseInfo.pidlRoot);
  //устанавливаем свойства диалогового окна
  with BrowseInfo do
    begin 
    hwndOwner := h; //окно-владелец
    lpszTitle := title; //заголовок диалога
    //не показываем некоторые системные папки: "Корзина", "Панель управления" и т.д
    ulFlags := BIF_RETURNONLYFSDIRS+BIF_EDITBOX+BIF_STATUSTEXT;
  end;
  //выводим диалог
  lpItemID := SHBrowseForFolder(BrowseInfo);
  //папка, указанная юзером, существует?
  if lpItemId <> nil then
    begin 
    SHGetPathFromIDList(lpItemID, Path);
    result:=path;
    GlobalFreePtr(lpItemID); //освобождаем ресурсы
  end;
end;
 
end.

Готово? Сохранитесь и, выбрав Component > Install Component, проинсталлируйте наш диалог, указав в разделе Unit File Name путь к файлу BrowseFolderDlg.pas.

Осуществить вызов диалога из программы можно так (разумеется, предварительно бросив TBrowseFolderDlg на форму):

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Caption:= 'Выбрана следующая папка: '+
  BrowseFolderDlg1.BrowseFolder('Укажите каталог:',Application.Handle);
end;

Конечно, это только "скелет" полноценного компонента, и просторы для модернизации безграничны.

Статья добавлена: 4 сентября 2005

Следующая статья: Конвертирование графических форматов »

Рейтинг статьи: 5.00 Голосов: 2 Ваша оценка:

Зарегистрируйтесь/авторизируйтесь,
чтобы оценивать статьи.


Статьи, похожие по тематике

 

Для вставки ссылки на данную статью на другом сайте используйте следующий HTML-код:

Ссылка для форумов (BBCode):

Быстрая вставка ссылки на статью в сообщениях на сайте:
{{a:13}} (буква a — латинская) — только адрес статьи (URL);
{{статья:13}} — полноценная HTML-ссылка на статью (текст ссылки — название статьи).

Поделитесь ссылкой в социальных сетях:


Комментарии читателей к данной статье

Насыров Павел
Репутация: +1

Насыров Павел (11 сентября 2009, 23:06):

Молодца
Липницкий Олег Сергеевич
Репутация: нет

Липницкий Олег Сергеевич (5 июня 2007, 23:49):

Можно подумать о расширенных возможностях обычного диалога открытия!

Оставлять комментарии к статьям могут только зарегистрированные пользователи.