Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.14 c
15-1176785713
Задача
2007-04-17 08:55
2007.05.20
Задача


15-1176804812
Kolan
2007-04-17 14:13
2007.05.20
А что это с rsdn &amp;#151; негрузится че-то&amp;#133


1-1174368333
Fin
2007-03-20 08:25
2007.05.20
Формирование отчёта в FastReport


15-1177066657
ArtemESC
2007-04-20 14:57
2007.05.20
Перенаправление почты с mail.ru


2-1178366375
Ламер 2.Х
2007-05-05 15:59
2007.05.20
Перезагрузка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский