Browse for Folder - full path

Browse for Folder - full path

offline
  • Pridružio: 26 Feb 2004
  • Poruke: 55
  • Gde živiš: Banja Luka

Kako da u dijalogu Browse for Folder u edit-u dobijem full path, a ne samo
ime trenutno odabranog foldera?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Zar taj dialog ne daje celu putanju izabranog foldera? Postavi ovde kod kojim dobijes samo ime izabranog pa da vidimo sta se desava.



offline
  • Pridružio: 26 Feb 2004
  • Poruke: 55
  • Gde živiš: Banja Luka

Ne daje(meni), a evo koda.
Dir := BrowseDialog('String titlee', CurrentDir, BIF_EDITBOX or BIF_RETURNONLYFSDIRS);

var
lg_StartFolder: String;

function BrowseDialogCallBack(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM): Integer stdcall;
var
wa, rect: TRect;
dialogPT: TPoint;
begin
//center in work area
if uMsg = BFFM_INITIALIZED then
begin
SendMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1]));
// wa := Screen.WorkAreaRect; // bez taskbara (Height of askBar = 30)(sredina ekrana)
wa := Form1.GetClientRect;
GetWindowRect(Wnd, Rect);
// dialogPT.X := ((wa.Right-wa.Left) div 2) - ((rect.Right-rect.Left) div 2); // sredina ekrana
// dialogPT.Y := ((wa.Bottom-wa.Top) div 2) - ((rect.Bottom-rect.Top) div 2); // sredina ekrana
dialogPT.X := Form1.Left + ((wa.Right - wa.Left - rect.Right + rect.Left) div 2); // sredina aplikacije H
dialogPT.Y := Form1.Top + ((wa.Bottom - wa.Top - rect.Bottom + rect.Top) div 2) + (GetSystemMetrics(SM_CYCAPTION) div 2); // sredina aplikacije V
MoveWindow(Wnd, dialogPT.X, dialogPT.Y, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, True);
end;
Result := 0;
end; // BrowseDialogCallBack

function TForm1.BrowseDialog(const Title, InitDir: string; const Flag: Integer): string;
var
lpItemID: PItemIDList;
BrowseInfo: TBrowseInfo;
DisplayName: array[0..MAX_PATH] of char;
TempPath: array[0..MAX_PATH] of char;
begin
Result := '';
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
with BrowseInfo do
begin
hwndOwner := Application.Handle;
pszDisplayName := @DisplayName;
lpszTitle := PChar(Title);
ulFlags := Flag;
lg_StartFolder := InitDir;
lpfn := BrowseDialogCallBack;
end;
lpItemID := SHBrowseForFolder(BrowseInfo);
if lpItemId <> nil then
begin
SHGetPathFromIDList(lpItemID, TempPath);
Result := TempPath;
GlobalFreePtr(lpItemID);
end;
end;

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ti si sam pisao neku svoju funkciju za to Smile Iskoristi vec gotovu SelectDirectory koja se nalazi u unit-u FileCtrl:
var   Dir: String; begin   if SelectDirectory('Izaberi folder', 'C:\', Dir) then     ShowMessage('Izabrani folder je ' + Dir)   else     ShowMessage('Folder nije izabran'); end;

offline
  • Pridružio: 26 Feb 2004
  • Poruke: 55
  • Gde živiš: Banja Luka

Znam za to ali sa tom funkcijom ne mozes nista, npr. dijalog je uvijek na istom mjestu.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Napisano: 17 Sep 2010 15:12

Kopirao sam tvoj kod i dobijem punu putanju.

Dopuna: 17 Sep 2010 15:21

Sorry... tek sad sam ukapirao sta ti je problem... popravi BrowseDialogCallBack funkciju:
function BrowseDialogCallBack(Wnd: HWND; uMsg: UINT;   lParam, lpData: lParam): Integer stdcall; var   wa, rect: TRect;   dialogPT: TPoint;   Selected: PItemIDList;   TempPath: array [0 .. MAX_PATH] of char;   EditWnd: HWND; begin   case uMsg of     BFFM_INITIALIZED:       begin         SendMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1]));         wa := Form3.GetClientRect;         GetWindowRect(Wnd, rect);         dialogPT.X := Form3.Left +           ((wa.Right - wa.Left - rect.Right + rect.Left) div 2);         dialogPT.Y := Form3.Top +           ((wa.Bottom - wa.Top - rect.Bottom + rect.Top) div 2) +           (GetSystemMetrics(SM_CYCAPTION) div 2);         MoveWindow(Wnd, dialogPT.X, dialogPT.Y, rect.Right - rect.Left,           rect.Bottom - rect.Top, True);       end;     BFFM_SELCHANGED:       begin         Selected := PItemIDList(lParam);         if Selected <> nil then         begin           SHGetPathFromIDList(Selected, TempPath);           EditWnd := FindWindowEx(Wnd, 0, 'Edit', 0);           if EditWnd <> 0 then             SetWindowText(EditWnd, TempPath);         end;       end;   end;   Result := 0; end;

offline
  • Pridružio: 26 Feb 2004
  • Poruke: 55
  • Gde živiš: Banja Luka

Svaka cast, nema sta, radi, ali pretpostavljam da ima neki elegantniji put da se ovo rijesi(da se ne poziva funkcija 3x).

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

U sustini, moras uzeti izbrani folder iz lParam, moras uzeti putanju na koju pokazuje preko funckije SHGetPathFromIDList, jedino sto moze da se optimizuje je da samo na pocetku pronadje handle prozora editora, a ne svaki put kad se izabere folder, i moras na kraju preko tog handle-a da upises tekst koji si dobio. Ti sad probaj da optimizujes to Smile

Ko je trenutno na forumu
 

Ukupno su 691 korisnika na forumu :: 34 registrovanih, 5 sakrivenih i 652 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 4channer, _Sale, A.R.Chafee.Jr., acatomic, Apok, apostata, awathorn, Bane san, boki199777, Boris90, Dežurni pod palubom, Duh sa sekirom, filiplukac1337, frenki1986, gzoki, kolateralnasteta, Kos93, LUDI2, Milan A. Nikolic, milanstankovic087, Motocar, obozo, repac, rodoljub2, royst33, SAA fan, Srki94, Stefan1207, suton, t84dar, vasa.93, VJ, vlvl, wizzardone