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:

  1. var
  2.   Dir: String;
  3. begin
  4.   if SelectDirectory('Izaberi folder', 'C:\', Dir) then
  5.     ShowMessage('Izabrani folder je ' + Dir)
  6.   else
  7.     ShowMessage('Folder nije izabran');
  8. 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:

  1. function BrowseDialogCallBack(Wnd: HWND; uMsg: UINT;
  2.   lParam, lpData: lParam): Integer stdcall;
  3. var
  4.   wa, rect: TRect;
  5.   dialogPT: TPoint;
  6.   Selected: PItemIDList;
  7.   TempPath: array [0 .. MAX_PATH] of char;
  8.   EditWnd: HWND;
  9. begin
  10.   case uMsg of
  11.     BFFM_INITIALIZED:
  12.       begin
  13.         SendMessage(Wnd, BFFM_SETSELECTION, 1, Integer(@lg_StartFolder[1]));
  14.         wa := Form3.GetClientRect;
  15.         GetWindowRect(Wnd, rect);
  16.         dialogPT.X := Form3.Left +
  17.           ((wa.Right - wa.Left - rect.Right + rect.Left) div 2);
  18.         dialogPT.Y := Form3.Top +
  19.           ((wa.Bottom - wa.Top - rect.Bottom + rect.Top) div 2) +
  20.           (GetSystemMetrics(SM_CYCAPTION) div 2);
  21.         MoveWindow(Wnd, dialogPT.X, dialogPT.Y, rect.Right - rect.Left,
  22.           rect.Bottom - rect.Top, True);
  23.       end;
  24.     BFFM_SELCHANGED:
  25.       begin
  26.         Selected := PItemIDList(lParam);
  27.         if Selected <> nil then
  28.         begin
  29.           SHGetPathFromIDList(Selected, TempPath);
  30.           EditWnd := FindWindowEx(Wnd, 0, 'Edit', 0);
  31.           if EditWnd <> 0 then
  32.             SetWindowText(EditWnd, TempPath);
  33.         end;
  34.       end;
  35.   end;
  36.   Result := 0;
  37. 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 994 korisnika na forumu :: 93 registrovanih, 13 sakrivenih i 888 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: Abebe Bikila, aksentijeivan, aleph_one, ALFASPORTIVO, aramis s, Asteker, baltazar01, BaneM75, BB, Bloody, boromir, Boroš, brkan1, brundo65, bukefal, ccoogg123, cenejac111, Cian, Ciri1994, DalmatinacMF, Django777, Dogma21, dunavzed, E_Kurir, eagle.rs, Georgius, HrcAk47, iceburn, istina, Istman, ivran064, Jakonjveliki, Jerry Drake, JK, kalens021, Koridor 11, kybonacci, leptirleptir, Lieutenant, LostInSpaceandTime, luka35, M74AB3, Marko Marković, markomacii9, Maruti, Mercury, Milan Miscevic, Milan1996, milbos, mile.ilic75, milenko crazy north, MILJEVINAC, Milometer, MiloradKomadic, milos.cbr, MK10, N.e.m.a.nj.a., neutrino, Nmr, ostoja, pein, precan, probisic, proka89, promajauglavi, rovac, samo opusteno, sedan, sekretar, Sirius, SpeedyGonzales, Srle993, Steeeefan, stibium51, synergia, Szigetwar, therealgodzilla, trajkoni018, Tribal, Tumansky, User98, vathra, VJ, Vrač, vukajlo71, Wehicle, wexy, x011, yufighter, zajcev1, Zvone, |_MeD_|, 79693