![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выбрать папку. Нормально. [D2005, XP]
Vovan#1 © (2006-10-25 17:39:00)Уже спрашивал на форуме - дали код:
unit unitChooseFolder;
interface
uses Windows, Classes, SysUtils, ShlObj;
function GetFolderDialog(Handle: Integer; Caption: string; var strFolder: string): Boolean;
implementation
function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: LPARAM; lpData: LPARAM): Integer; stdcall;
begin
if (uMsg = BFFM_INITIALIZED) then
SendMessage(hwnd, BFFM_SETSELECTION, 1, lpData);
BrowseCallbackProc := 0;
end;
function GetFolderDialog(Handle: Integer; Caption: string; var strFolder: string): Boolean;
const
BIF_STATUSTEXT = $0004;
BIF_NEWDIALOGSTYLE = $0040;
BIF_RETURNONLYFSDIRS = $0080;
BIF_SHAREABLE = $0100;
BIF_USENEWUI = BIF_EDITBOX or BIF_NEWDIALOGSTYLE;
var
BrowseInfo: TBrowseInfo;
ItemIDList: PItemIDList;
JtemIDList: PItemIDList;
Path: PAnsiChar;
begin
Result := False;
Path := StrAlloc(MAX_PATH);
SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, JtemIDList);
with BrowseInfo do
begin
hwndOwner := GetActiveWindow;
pidlRoot := JtemIDList;
SHGetSpecialFolderLocation(hwndOwner, CSIDL_DRIVES, JtemIDList);
{ return display name of item selected }
pszDisplayName := StrAlloc(MAX_PATH);
{ set the title of dialog }
lpszTitle := PChar(Caption);//'Select the folder';
{ flags that control the return stuff }
lpfn := @BrowseCallbackProc;
{ extra info that's passed back in callbacks }
lParam := LongInt(PChar(strFolder));
end;
ItemIDList := SHBrowseForFolder(BrowseInfo);
if (ItemIDList <> nil) then
if SHGetPathFromIDList(ItemIDList, Path) then
begin
strFolder := Path;
Result := True
end;
end;
end.
Но оказалось, что с утечками памяти. Собственно, я не знаю - либо там чего пофиксить надо, либо по-другому выбирать, но надо, чтоб без утечек было.
Vovan#1 (2006-10-26 19:50:00) [1]>Т.е. одно слово SelectDirectory, которое заменяет всю эту байду, уже не в моде?
Да надо да, заюзать сабж.
Vovan#1 (2006-10-26 19:49:00) [2]>а как же [3]? предал свою религию, и таки стал "программировать виндовсвкие штучки"?
Я же ни в чём не разбирался. Сказали, что можно отправить сообщение, чтобы кнопка активировалась. Одно сообщение в callback'е уже отправлялось - я его скопировал и заменил параметры уже на сам не помню какой флаг (ну, Мелкософт не Борланд, справку нормальную сделал). Не знаю, когда в следующий раз загляну внутрь этого модуля - работает и пускай. Программирования здесь нет, только штучки.
DrPass (2006-10-26 19:42:00) [3]
> Уже спрашивал на форуме - дали код:
Т.е. одно слово SelectDirectory, которое заменяет всю эту байду, уже не в моде?
Ketmar (2006-10-26 19:29:00) [4]>[14] Vovan#1 26-Oct-2006, 19:25
а как же [3]? предал свою религию, и таки стал "программировать виндовсвкие штучки"?
Vovan#1 (2006-10-26 19:25:00) [5]> он не будет. см. [3], [9].
Почему? Совет [12] был по существу. Отослал BFFM_SETOKTEXT, всё заработало.
Ketmar (2006-10-26 01:22:00) [6]>[12] MetalFan_pda 25-Oct-2006, 23:42
>смотри хелп и мсдн
он не будет. см. [3], [9].
MetalFan_pda (2006-10-25 23:42:00) [7]при вызове callback функции с опр.параметром,необходимо слать некоеисообщение,кот будет вкл/выкл кнопку выбора.смотри хелп и мсдн
Vovan#1 (2006-10-25 21:05:00) [8]Чего-то указанная мной штука не работает как надо в Win98 - диалог появляется, но кнопка выбора постоянно неактивна.
Ketmar (2006-10-25 18:45:00) [9]>[9] Vovan#1 25-Oct-2006, 18:31
>Кетмару. Нет, не пытался. Ни ответить, ни разобраться.
хорошо, что предупредил о твоём подходе. буду знать, что отвечать бессмысленно.
Vovan#1 (2006-10-25 18:31:00) [10]>Где ж ты видал бесплатный код без утечек?
Из разряда элементарно-классических - видал. Вот и сейчас - добавил по совету [1] и без утечек.
Кетмару. Нет, не пытался. Ни ответить, ни разобраться.
Dmitrij_K (2006-10-25 18:27:00) [11]SelectDirectory() + F1
Zeqfreed (2006-10-25 18:25:00) [12]Где ж ты видал бесплатный код без утечек?
Ketmar (2006-10-25 18:19:00) [13]>[5] Vovan#1 25-Oct-2006, 18:16
>Используй свой чудный дивайс, чтобы ответить на этот
>вопрос.
не тот дивайс используешь. ты не понял: не только пальцы и глаза. прежде всего -- мозг. ответитьна вопросы ты даже не пытался. так же, как и разобраться в коде, кстати.
Vovan#1 (2006-10-25 18:16:00) [14]>тогда что ты здесь делаешь? линукс и прочее не здесь обсуждают.
Используй свой чудный дивайс, чтобы ответить на этот вопрос.
Ketmar (2006-10-25 18:14:00) [15]>[3] Vovan#1 25-Oct-2006, 18:13
>Не интересует программирование виндовских штучек.
тогда что ты здесь делаешь? линукс и прочее не здесь обсуждают.
Vovan#1 (2006-10-25 18:13:00) [16]> для этого в голове есть чудный дивайс: мозг. очень часто помогает. особенно хорошо, если мозг протестует против технологии copy/paste/f9.
Не интересует программирование виндовских штучек.
Ketmar (2006-10-25 17:57:00) [17]>[0] Vovan#1 25-Oct-2006, 17:39
>но надо, чтоб без утечек было.
для этого в голове есть чудный дивайс: мозг. очень часто помогает. особенно хорошо, если мозг протестует против технологии copy/paste/f9.
MetalFan (2006-10-25 17:47:00) [18]StrAlloc'и есть... а StrDispose не надо чтоли?