Poslao: 14 Sep 2010 13:44
|
offline
- Petar
- Građanin
- 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.
|
|
Poslao: 15 Sep 2010 20:07
|
offline
- Srki_82
- Moderator foruma
- 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.
|
|
|
|
Poslao: 16 Sep 2010 09:35
|
offline
- Petar
- Građanin
- 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;
|
|
|
|
Poslao: 16 Sep 2010 19:53
|
offline
- Srki_82
- Moderator foruma
- 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 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;
|
|
|
|
Poslao: 17 Sep 2010 09:50
|
offline
- Petar
- Građanin
- 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.
|
|
|
|
Poslao: 17 Sep 2010 15:21
|
offline
- Srki_82
- Moderator foruma
- 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;
|
|
|
|
Poslao: 17 Sep 2010 23:39
|
offline
- Petar
- Građanin
- 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).
|
|
|
|
Poslao: 19 Sep 2010 01:07
|
offline
- Srki_82
- Moderator foruma
- 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
|
|
|
|