Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/131: Рейтинг темы: голосов - 131, средняя оценка - 4.69
 Аватар для Fe_DoS
1 / 1 / 0
Регистрация: 12.12.2008
Сообщений: 29

Не работает SelectDirectory

16.07.2009, 19:00. Показов 24411. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Не работает функция SelectDirectory.

C++
1
2
3
4
5
6
#include <FileCtrl.hpp>
AnsiString Dir;
if(SelectDirectory("Выберите папку","",Dir))
{
  Edit->Text=Dir;
}
При компиляции выскакивает ошибка:
[BCC32 Error] Umain.cpp(139): E2285 Could not find a match for 'SelectDirectory(const char *,const char *,AnsiString)'
Пишу в Code Gear RAD Studio 2009.
В чём может быть проблемма?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.07.2009, 19:00
Ответы с готовыми решениями:

SelectDirectory Отмена
SelectDirectory('Выберите каталог для поиска файлов','\',Path,); Path это уже указанный путь, что бы открыть в нужном месте Проблема в...

Функция SelectDirectory
var Directory: WideString; begin if SelectDirectory('Укажите каталог БД:', 'D:\',Directory) then begin Table1.DatabaseName :=...

SelectDirectory(вопрос)
У меня вопрос по функции SelectDirectory. Как с ее помощью открыть папку с файлами и их поместить в ListBox if (...

30
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
16.07.2009, 20:13
Не находит эту функцию в хидере. Попробуй изменить расширение хидера. *.h, *.hpp и вообще без расширения - это 3 разных хидера.
Также " или < влияют на место поиска.
0
 Аватар для Fe_DoS
1 / 1 / 0
Регистрация: 12.12.2008
Сообщений: 29
16.07.2009, 20:36  [ТС]
Попробывал поменять *.h, *.hpp, ", <. Не помогает.
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
16.07.2009, 21:09
Не находит эту фукцию. Посмотри эту функцию в хелпе.
0
 Аватар для Fe_DoS
1 / 1 / 0
Регистрация: 12.12.2008
Сообщений: 29
16.07.2009, 21:54  [ТС]
Решил проблему так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <shlobj.h>
 
void __fastcall TFmain::Button2Click(TObject *Sender)
{
 
    BROWSEINFO    info;
    char          szDir[MAX_PATH];
    char          szDisplayName[MAX_PATH];
    LPITEMIDLIST  pidl;
    LPMALLOC      pShellMalloc;
 
    // SHBrowseForFolder возвращает PIDL. Память для  PIDL
    // распределяется оболочкой. В итоге, мы должны очистить
    // эту память, так как мы должны получить указатель на объект
    // shell malloc COМ который будет позже освобожден PIDL.
    if(SHGetMalloc(&pShellMalloc) == NO_ERROR)
    {
        //если мы получили оболочку malloc объекта,
        // тогда продолжите, инициализируя структуру BROWSEINFO
        memset(&info, 0x00,sizeof(info));
        info.hwndOwner = Handle;                 // Owner window
        info.pidlRoot  = 0;                      // root folder
        info.pszDisplayName = szDisplayName;     // return display name
        info.lpszTitle = "Browse Title";         // label caption
        info.ulFlags   = BIF_RETURNONLYFSDIRS;   // config flags
        info.lpfn = 0;                           // callback function
 
        // вызовем диалог
        pidl = SHBrowseForFolder(&info);
 
        // pidl будет null если пользователь нажмет cancel в диалоге выбора
        // pidl не будет null если пользователь выбрал папку
        if(pidl)
        {
            // попытаемся преобразовать pidl в строку
            // при успешном преобразовании возвращаемое значение - true
        if(SHGetPathFromIDList(pidl, szDir))
            {
                // set one caption to the directory path
                E1->Text = szDir;
            }
 
            // set another caption based on the display name
            //E2->Text = info.pszDisplayName;
 
            // Освобождим pidl.
            // затем вызовем Relasee для сигнализирования, что мы больше
            // не нуждаемся в shell malloc object
            pShellMalloc->Free(pidl);
        }
        pShellMalloc->Release();
    }
}
1
Jlepert
30.07.2010, 11:30
А что если этот путь нужно сохранить в текстовый файл? В этом случае русские буквы печатаются не так как нужно. И в свойствах программы я не могу отключить UNICODE.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
BROWSEINFO bi = { 0 };
    LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
    if ( pidl != 0 )
    {
    TCHAR path[MAX_PATH];// get the name of the folder
    if ( SHGetPathFromIDList ( pidl,path  ) )
    {
        editpath=((LPCTSTR)path);         
    }
    FILE *datapath;
    datapath=fopen("C:\\Program files\\Application-Help\\path.txt","w");
    if (datapath==NULL)
    MessageBox(0,_T("Ошибка! Путь не сохранён"), _T("ERROR!"),  MB_ICONWARNING);
    else{
    char* cstrep = new char[512];
    wchar_t* wstrep = new wchar_t[512]; 
    wstrep = editpath.GetBuffer(editpath.GetLength()); 
    CharToOem( wstrep,cstrep);
    fprintf(datapath,"%s",cstrep);
    fclose(datapath); 
    }
    }
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
30.07.2010, 20:43
может тип ему юнекодовский надо а не AnsiString Dir;
раз уж у тебя 2009 то думаю там все по умолчанию юникод
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.09.2010, 18:02
На одном из форумов нашёл лекарство:

1) add a FileCtrl-based component to one of your forms, such as
TDirectoryListBox, TDriveComboBox, or TFileListBox. Save the form so that
the project makefile is updated to include the FileCtrl package, and then
remove the component from the form and re-save. The package reference will
remain in the project makefile.
2) edit the project's BPR makefile directly and add the reference to the
FileCtrl package manually.
1
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
26.09.2010, 18:10
Цитата Сообщение от Airhand Посмотреть сообщение
Не находит эту функцию в хидере.
Совершенно неверно. Функция уже найдена. Не найден перегруженный прототип, способный принять текущие параметры.
Fe_DoS, нужно было внимательно ознакомится с необходимыми параметрами. Функция способна принимать:
C++
1
2
UnicodeString &Directory, TSelectDirOpts Options, int HelpCtx
UnicodeString Caption, WideString Root, UnicodeString &Directory, TSelectDirOpts Options, TWinControl *Parent
Вырезка из FileCtrl.hpp:

C++
1
2
extern PACKAGE bool __fastcall SelectDirectory(System::UnicodeString &Directory, TSelectDirOpts Options, int HelpCtx)/* overload */;
extern PACKAGE bool __fastcall SelectDirectory(const System::UnicodeString Caption, const System::WideString Root, System::UnicodeString &Directory, TSelectDirExtOpts Options = (TSelectDirExtOpts() << TSelectDirExtOpt::sdNewUI ), Controls::TWinControl* Parent = (Controls::TWinControl*)(0x0))/* overload */;
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.09.2010, 18:33
Цитата Сообщение от Evg Посмотреть сообщение
На одном из форумов нашёл лекарство
Лекартство относилось в проблеме с линковкой.

Добавлено через 3 минуты
Кстати, кто-нибудь может нормальным языком пояснить, куда нажать для этого:

2) edit the project's BPR makefile directly and add the reference to the
FileCtrl package manually.
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
26.09.2010, 18:43
Цитата Сообщение от Evg Посмотреть сообщение
Кстати, кто-нибудь может нормальным языком пояснить, куда нажать для этого:
2) edit the project's BPR makefile directly and add the reference to the
FileCtrl package manually.
Если честно, не понимаю, зачем был упомянут BPR файл.
Имелось в виду то, что необходимо было добавить заголовочный файл в файл проекта.

Для проекта по умолчанию это файл Project1.cpp.
В него и нужно добавить #include <FileCtrl.hpp>

Но скорее всего, это проблема старых IDE от Borland.
Новые автоматически поднимают этот хидер в заголовочном файле модуля.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
26.09.2010, 22:48
MikeSoft, в 2007 не помогло. Я посмотрел, что сделалось, когда пошёл по первому пункту. В списке AllPackageLib появилось vclx.lib (т.е. добавилась библиотека к линковке и хидер тут как-то не при чём). Но не очень понимаю, как сие ручками сделать
0
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 5
30.09.2010, 01:33
Цитата Сообщение от Fe_DoS Посмотреть сообщение
Здравствуйте!
Не работает функция SelectDirectory.

C++
1
2
3
4
5
6
#include <FileCtrl.hpp>
AnsiString Dir;
if(SelectDirectory("Выберите папку","",Dir))
{
  Edit->Text=Dir;
}
При компиляции выскакивает ошибка:

Пишу в Code Gear RAD Studio 2009.
В чём может быть проблемма?

Ларчик открывается просто, нужно вместо AnsiString Dir написать UnicodeString Dir , в CodeGear используется другой тип переменной в функции SelectDirectory
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
30.09.2010, 01:36
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от teror Посмотреть сообщение
нужно вместо AnsiString Dir написать UnicodeString Dir
Не нужно вообще привязывать к Ansi или Unicode ...
Напишите String... компилятор сам подставит нужный тип, исходя из того, было ли заявлено использования юникода, что предпочтительнее.

Не по теме:

Пишу об этом уже далеко не первый раз на данном форуме.



Полюбуйтесь сами, вырезка из <sysmac.h>:
C++
1
2
3
4
5
#if defined(_DELPHI_STRING_UNICODE)
    typedef UnicodeString        String;           //
#else
    typedef AnsiString           String;           //
#endif
3
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.09.2010, 09:15
Цитата Сообщение от MikeSoft Посмотреть сообщение
Напишите String... компилятор сам подставит нужный тип, исходя из того, было ли заявлено использования юникода, что предпочтительнее
Етить-растудыть.... Но в help'е по функциям так или иначе везде торчит класс AnsiString. Это просто недоработка help'а или есть какая-то дополнительная магия?
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
30.09.2010, 15:52
Evg, это нежелание полностью переделать справку.
За это они уже поплатились уймой вопросов по поводу методов t_str() и c_str().

Между прочим, в версиях Builder'a выше 2009-го в опциях проекта появилось право выбора представления типа данных _TCHAR.
По умолчанию до 2010 версии это опция представляла _TCHAR как обычный однобайтовый char.

В новой RAD Studio XE данная опция по умолчанию преобразует в wchar_t.
Что мы имеем в итоге?
В итоге мы имеем три метода, которые представляют String в двухбайтовый массив символов.
То есть, методы w_str(), t_str() и c_str() выполняют одно и то же действие.

Вот какие меры производитель принимает для перехода в Unicode-пространство.
Выход - переключить опцию: _TCHAR maps to char (кстати, об этом они удосужились написать в справке)
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.09.2010, 16:43
MikeSoft, а поподробнее есть где об этом почитать?
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
30.09.2010, 17:22
Evg, можно. В онлайн документациях есть описание данных методов:
UnicodeString::t_str Method - то, что сейчас представлено в справке.
System.UnicodeString.t_str - а вот здесь описана разница между представлениями _TCHAR
_TCHAR Mapping - о самом _TCHAR (описано использование макросов _TEXT и L)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
30.09.2010, 17:47
В общем я уже запутался.
Как правильно-то делать? Использовать String и c_str()? Или чего?
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
30.09.2010, 18:27
Цитата Сообщение от Evg Посмотреть сообщение
Использовать String и c_str()?
Зависит от версии IDE.

Составлю небольшой псевдокод, думаю по нему будут понятны те отличия, о которых я говорил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Если ( "Версия IDE" >= 2009 ) {  // версии: RAD 2009, RAD 2010, RAD XE
  //------------------------------------------------------------------
  String == UnicodeString;
  Если (Опция _TCHAR maps to == char ) {
    UnicodeString::t_str() -> (char *)
  } Иначе {
    UnicodeString::t_str() -> (wchar_t *)
  }
  UnicodeString::c_str() -> (wchar_t *)
  UnicodeString::w_str() -> (wchar_t *)
  //------------------------------------------------------------------
} Иначе { // версии BCB 6, BDS 2006, RAD 2007
  //------------------------------------------------------------------
  String == AnsiString;
  AnsiString::c_str() -> (char *)
  AnsiString::WideChar(wchar_t* dest, int destSize) -> (wchar_t *)
  //------------------------------------------------------------------
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.09.2010, 18:27
Помогаю со студенческими работами здесь

Could not find a match for SelectDirectory
Появился такой косяк: в коде в функции Select Directory компилятор находит ошибку, в чём ошибка - не знаю. Подскажите что изменить надо для...

SelectDirectory в RAD Studio XE4
Взял код из хелпа void __fastcall TOptions::SpeedButton1Click(TObject *Sender) { AnsiString Dir = &quot;C:\\Program Files&quot;; const...

SelectDirectory - Увеличивает диалоговое окно
Вызываю вот так if SelectDirectory('Выбор папки', '', Dir) then и с каждым вызовом окно смещается и увеличивается, на скрине видно. Это...

SelectDirectory сохранение пути к файлам
Доброго времени суток, форумчани ! Возникла пробелема с функцией SelectDirectory, реализовал я выбор католага с последующим добавлемением...

Ошибка: Unresolved external '__fastcall Vcl::Filectrl::SelectDirectory
Код: //--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru