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 1024 korisnika na forumu :: 34 registrovanih, 6 sakrivenih i 984 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 8u47, A.R.Chafee.Jr., aleksmajstor, Andrija357, Apok, bojcistv, Boris90, crnitrn, dragoljub11987, goxin, Hans Gajger, Krusarac, kunktator, Leonov, ljuba, Lucije Kvint, MB120mm, mercedesamg, Mi lao shu, milenko crazy north, misa1xx, nikoladim, operniki, Panter, Parker, pein, Povratak1912, royst33, S-lash, Sirius, vathra, Vatreni Zmaj, vukdra, zdrebac