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

Вниз

Диалог выбора директории   Найти похожие ветки 

 
Steep ©   (2007-04-28 14:46) [0]

Как запустить выбор директори?
В винде помоему этот диалог стандартный..
Еще бывает "Простой" и с возможность создать папку
-как так сделать?


 
clickmaker ©   (2007-04-28 15:08) [1]

SHBrowseForFolder()


 
$00FF00   (2007-04-28 15:19) [2]

На самом деле вот так (жутковато канешна, зато прогу лишним кодом из импортируемых модулей не нагружает :) ) --

type
// Штоб ничо лишнего не подключать к проге

 ITEMID = record                                
   cb : Word;
   ID : array [0..0] of Byte;
 end;

 ITEMIDLIST = record
   mkid : ITEMID;
 end;
 PITEMIDLIST = ^ITEMIDLIST;

 BFF_CALLBACK = function(h_Wnd: THandle; _Msg: UINT; w_Param, l_Param: Integer): Integer; stdcall;

 BROWSEINFO = record
   hwndOwner : THandle;
   pidlRoot  : PITEMIDLIST;
   pszName   : PChar;
   lpszTitle : PChar;
   ulFlags   : UINT;
   lpfn      : BFF_CALLBACK;
   lParam    : Integer;
   iImage    : Integer;
 end;

const MAX_BUF = 4096; // За глаза хватит :)))

function GetDir(var lpbi: BROWSEINFO): PITEMIDLIST; stdcall; external "Shell32.dll" name "SHBrowseForFolderA";
function ExtractPath(pidl: PITEMIDLIST; pszPath: PChar): BOOL; stdcall; external "Shell32.dll" name "SHGetPathFromIDList";

...

function cbk(Wnd: THandle; uMsg: UINT; lParam, lpData: Integer): Integer stdcall;
begin
if (uMsg=1)and(lpData<>0) then // 1=BFFM_INITIALIZED
 SendMessage(Wnd, 1126, 1, lpData); // 1126=BFFM_SETSEL
end;

function ChangeFolder(Parent:THandle; var InitDir:string):boolean;
// ------------------- \\
function CheckIfFolder(path:string):boolean;
// ++++++
function intToBin(i:Integer):string;
var tmp:string;
begin
repeat
 tmp:=IntToStr(i mod 2);
 i:=i div 2;
 Result:=tmp+result;
until i<2;
 Result:=IntToStr(i mod 2)+Result;

repeat
 result:="0"+result;
until length(result)>=8;
end;
// ++++++
function rs(const P: PChar): string;
var
 i: Integer;
begin
 SetLength(Result, Length(P));
 for i:=Length(P) downto 1 do
 begin
   Result[Length(P)-i] := P[I];
 end;
end;
// ++++++
var
 i:Cardinal;
 s:string;
begin
i:=GetFileAttributes(PChar(path));
s:=rs(PChar(intToBin(i)));
if s[5]="1" then result:=true else result:=false;
end;
// ------------------- \\
function ExtractDir(const ptc:string):string;
begin
result:=ptc;
if GetFileAttributes(PChar(result))<>$FFFFFFFF then begin
 if not CheckIfFolder(ptc) then begin
   repeat
     Delete(result, length(result), 1);
   until result[Length(result)]="\";
   Delete(result, length(result), 1);
 end;
end;
end;
// ------------------- \\
var
 bi : BROWSEINFO;
 pid : PITEMIDLIST;
 pTmp : PChar;
 sTmp : string;
begin
 sTmp:=InitDir;
 FillChar(bi, SIZEOF(BROWSEINFO), 0);
 with bi do begin
   hwndOwner := Parent;
   pidlRoot  := nil;
   GetMem(pTmp, MAX_BUF);
   pszName   := pTmp;
   lpszTitle := "Выберите папку:";
   ulFlags   := 1; // 1=BIF_RETURNONLYFSDIRS
   lpfn      := cbk;
   if sTmp<>"" then
     lParam  := longint(PChar(ExtractDir(sTmp))) else
     lParam  := 0;
   iImage    := 0;
 end;
 pid:=GetDir(bi);
 FreeMem(pTmp);
 if pid<>nil then begin
   GetMem(pTmp, MAX_BUF);
   ExtractPath(pid, pTmp);
   InitDir:=pTmp;
   ChangeFolder:=true;
   FreeMem(pTmp);
 end else ChangeFolder:=false;
end;

Это более развёрнутый ответ ;)

ЗЫ. Вызываем ф-цию ChangeFolder: Прописываем в первый параметр идентификатор окна HWND (если это форма, то её хэндл), а во вторую - строковую вару, в которой содержится исходный путь доступа (не обязательно, можно и пустую). В неё будет возвращаться выбранная пользователем папка.


 
Германн ©   (2007-04-28 15:33) [3]

А чем SelectDirectory не угодил?


 
Steep ©   (2007-04-28 15:36) [4]

Круто %)
Я почему его в делфи 2006 не встроили ....
Вроде столько способов вызвать :)


 
Steep ©   (2007-04-28 15:48) [5]

Спасибо всем!!!!!


 
Loginov Dmitry ©   (2007-04-28 15:55) [6]

Опередили :(
Но все же выложу:


 threadvar
   StoreBrowsePath: string;

 function SelectDirectoryEx(var APath: string; const Title: string = ""; CanCreateDir: Boolean = False): Boolean;

   function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): Integer; stdcall;
   begin
     Result := 0;
     if uMsg = BFFM_INITIALIZED then
       SendMessage(hwnd, BFFM_SETSELECTION, 1, LongInt(PChar(StoreBrowsePath)))
   end;

 var
   ItemID: Pointer;
   BrowseInfo: TBrowseInfo;
   DisplayName, Path: array [0..MAX_PATH] of Char;
   Index: Integer;
 begin
   Result := False;

   {Запоменаем переданный путь, иначе callback-функция BrowseCallbackProc не сможет
    получить доступ к строке APath}
   StoreBrowsePath := APath;

   ZeroMemory(@BrowseInfo, SizeOf(BrowseInfo));

   BrowseInfo.hwndOwner := GetActiveWindow;
   BrowseInfo.pszDisplayName := @DisplayName;
   BrowseInfo.lpszTitle := PChar(Title);
   BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS or BIF_EDITBOX;
   if CanCreateDir then
     BrowseInfo.ulFlags := BrowseInfo.ulFlags or BIF_NEWDIALOGSTYLE;
   BrowseInfo.lpfn:= @BrowseCallbackProc;

   ItemID:= SHBrowseForFolder(BrowseInfo);
   if ItemID <> nil then
   try
     SHGetPathFromIDList(ItemID, Path);
     if DirectoryExists(Path) then
     begin
       APath := Path;
       Result := True;
     end;
   finally
     GlobalFreePtr(ItemID);
   end;
 end;


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


 procedure TForm1.Button1Click(Sender: TObject);
 var
   APath: string;
 begin
   APath := Caption;
   if SelectDirectoryEx(APath, "Выберите каталог с данными", True) then
     Caption := APath;
 end;


 
Loginov Dmitry ©   (2007-04-28 15:57) [7]

Переменную Index забыл удалить :(



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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
15-1176523384
РТР
2007-04-14 08:03
2007.05.20
Воскресенье 20:40


8-1157978391
Dmitriy O_
2006-09-11 16:39
2007.05.20
Как получить быстрый доступ к Пикселям BMP ?


15-1176963653
Anton_La
2007-04-19 10:20
2007.05.20
Записать в цикле.


15-1177036036
Конференция
2007-04-20 06:27
2007.05.20
Внешний вид Delphi Studio 2005


3-1172729445
NikNet
2007-03-01 09:10
2007.05.20
Авто - нумерация строк в Селекте, Возможно ли такое