-
Я новичок в программировании и вчера столкнулся с проблемой выбора папки в приложении. Перепробывал огромное количество компонентов но ни один не подходит. Может у кого есть исходник диалога выбора папки, необходимо чтоб в диалоге была кнопка "Создать папку". Вот исходник моего компонента (может его как-то изменить).
unit DirectoryDialog;
interface
uses
SysUtils, Classes, Dialogs, FileCtrl;
type
TDirectoryDialog = class(TCommonDialog)
private
FInitialDir: string;
FTitle: string;
FSelectDir:String;
FCleanUp:Boolean;
procedure SetInitialDir(const Value: string);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Execute: Boolean; override;
property SelectedDir:string read FSelectDir write FSelectDir;
published
property InitialDir: string read FInitialDir write SetInitialDir;
property Title: string read FTitle write FTitle;
property CleanUpLastFolder:Boolean read FCleanUp write FCleanUp;
end;
procedure Register;
implementation
constructor TDirectoryDialog.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Title:='Быберите директорию...';
end;
destructor TDirectoryDialog.Destroy;
begin
inherited Destroy;
end;
function TDirectoryDialog.Execute: Boolean;
begin
if CleanUpLastFolder then
FSelectDir:='';
if (InitialDir='Desktop') then
Result:=FileCtrl.SelectDirectory(self.title,'',FSelectDir) else
Result:=FileCtrl.SelectDirectory(self.title,InitialDir,FSelectDir);
end;
procedure TDirectoryDialog.SetInitialDir(const Value: string);
var
L: Integer;
begin
L := Length(Value);
if (L > 1) and IsPathDelimiter(Value, L)
and not IsDelimiter(':', Value, L - 1) then Dec(L);
FInitialDir := Copy(Value, 1, L);
end;
procedure Register;
begin
RegisterComponents('Components', [TDirectoryDialog]);
end;
end.
-
Функция SelectDirectory из юнита FileCtrl тебе поможет.
-
> [1] Efir (05.01.08 19:46) > Функция SelectDirectory из юнита FileCtrl тебе поможет.
Дык:
> function TDirectoryDialog.Execute: Boolean; > begin > if CleanUpLastFolder then > FSelectDir:=''; > if (InitialDir='Desktop') then > Result:=FileCtrl.SelectDirectory(self.title,'',FSelectDir) else > Result:=FileCtrl.SelectDirectory(self.title,InitialDir,FSelectDir); > end;
...именно она ему и помогает :)
-
Точно, сразу не заметил. тогда чё мешает использовать перегруженную версию: function SelectDirectory(const Caption: string; const Root: WideString;
var Directory: string; Options: TSelectDirExtOpts = [sdNewUI]; Parent: TWinControl = nil): Boolean; overload; SelectDirectory('', '', dir, [sdNewFolder, sdShowEdit, sdShowShares, sdNewUI, sdShowFiles, sdValidateDir]); Есть кнопка создать папку.
-
Я про нее знаю... но вот дизайн ее мя как-то не устраивает
-
> [4] Maloj2007 © (05.01.08 21:28)
А зачем сей компонент вообще нужен? Хотя может и нужен кому..... Просто весь смысл сего компонента в одной строчке кода по сути, верно ведь?
Собственно, я не против данного компонента.... Это.... Дестрой не нужен.... он и без этого - инхеритед :)
ЗЫ: Я обычно в таких случаях, не компонеты пишу, а процедурки/функции..... мне намного легче с ними, чем с компонентами.... устанавливай их(компоненты) потом случай чего :)
-
Давно скачал из инета такую функцию, вроде удобная. Надо подключить модуль ShlObj (и может еще ActiveX) function AdvSelectDirectory(const Caption: string;
const Root: WideString;
var Directory: string;
EditBox: Boolean = False;
ShowFiles: Boolean = False;
AllowCreateDirs: Boolean = True): Boolean;
function SelectDirCB(Wnd: HWND; uMsg: UINT;
lParam, lpData: lParam): Integer; stdcall;
var
PathName: array[0..MAX_PATH] of Char;
begin
case uMsg of
BFFM_INITIALIZED:
SendMessage(Wnd, BFFM_SETSELECTION, Ord(True), Integer(lpData));
end;
Result := 0;
end;
var
WindowList: Pointer;
BrowseInfo: TBrowseInfo;
Buffer: PChar;
RootItemIDList, ItemIDList: PItemIDList;
ShellMalloc: IMalloc;
IDesktopFolder: IShellFolder;
Eaten, Flags: LongWord;
const
BIF_USENEWUI = $0040;
BIF_NOCREATEDIRS = $0200;
begin
Result := False;
if not DirectoryExists(Directory) then Directory := '';
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
Buffer := ShellMalloc.Alloc(MAX_PATH);
try
RootItemIDList := nil;
if Root <> '' then
begin
SHGetDesktopFolder(IDesktopFolder);
IDesktopFolder.ParseDisplayName(Application.Handle, nil,
POleStr(Root), Eaten, RootItemIDList, Flags);
end;
OleInitialize(nil);
with BrowseInfo do
begin
hwndOwner := Application.Handle;
pidlRoot := RootItemIDList;
pszDisplayName := Buffer;
lpszTitle := PChar(Caption);
ulFlags :=
BIF_RETURNONLYFSDIRS or
BIF_USENEWUI or
BIF_EDITBOX * Ord(EditBox) or
BIF_BROWSEINCLUDEFILES * Ord(ShowFiles) or
BIF_NOCREATEDIRS * Ord(not AllowCreateDirs);
lpfn := @SelectDirCB;
if Directory <> '' then lParam := Integer(PChar(Directory));
end;
WindowList := DisableTaskWindows(0);
try
ItemIDList := ShBrowseForFolder(BrowseInfo);
finally
EnableTaskWindows(WindowList);
end;
Result := ItemIDList <> nil;
if Result then
begin
ShGetPathFromIDList(ItemIDList, Buffer);
ShellMalloc.Free(ItemIDList);
Directory := Buffer;
end;
finally
ShellMalloc.Free(Buffer);
end;
end;
end;
-
> Я про нее знаю... но вот дизайн ее мя как-то не устраивает
ну так напиши свой диалог... делов то?!
-
Удалено модератором
-
-
Ой блин, этож ап старой темы... Пардон :)
-
Есть ещё одна, но она не русифицирована.
-
Оффтоп: Розыч, диалог клевый.
|