CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [BCB C++] SelectDirectory z możliwością utworzenia

[BCB C++] SelectDirectory z możliwością utworzenia

dział ogólny

[BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Darek_C++ » czwartek, 2 sierpnia 2012, 08:23

Witam ponownie,
poniższy kod:
KOD cpp:     UKRYJ  
        String Dodir1;
        if(SelectDirectory("Wybierz folder","",Dodir1))
        {
                LabeledEdit11->Text = Dodir1+"\\"; ;
        }

Wywołuje "te ładniejsze" okno katalogów, ale bez możliwości tworzenia katalogu.

PYTANIE -> Czy możemy zmienić tak by była taka możliwość ?
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Corvis » czwartek, 2 sierpnia 2012, 08:37

W helpie Buildera masz przykład:

KOD cpp:     UKRYJ  
uses FileCtrl;
const
  SELDIRHELP = 1000;
procedure TForm1.Button1Click(Sender: TObject);
var
  Dir: string;
begin
  Dir := 'C:\Windows';
  if FileCtrl.SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then
    Label1.Caption := Dir;
end;

 


W delphi ale chyba dasz rade ?
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Darek_C++ » czwartek, 2 sierpnia 2012, 08:46

Tak, ale te okno co się pojawia z dodatkowymi opcjami jest inne niż bez dodatkowych opcji i jest "brzydnie" i nieczytelne :shock:
I nie ma (przynajmniej ja nie widzę) opcji tworzenia nowego folderu :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Corvis » czwartek, 2 sierpnia 2012, 08:53

Tak wygląda funkcja której trzeba użyć w C++

KOD cpp:     UKRYJ  
Boolean SelectDirectory(const AnsiString Caption, const BSTR Root, AnsiString Directory, TSelectDirExtOpts Options = [sdNewUI], TWinControl * Parent = nil);


Czyli:

KOD cpp:     UKRYJ  
String Directory;
SelectDirectory("Otwórz", String("2").w_str(), Directory, TSelectDirExtOpts() << sdNewUI << sdNewFolder );
 


Nie mam pojęcia co to jest
KOD cpp:     UKRYJ  
 const BSTR Root


Zobacz http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/FileCtrl_TSelectDirExtOpts.html
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House

Za ten post autor Corvis otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Darek_C++ » czwartek, 2 sierpnia 2012, 09:02

Dokładnie o to "Takie Okno" mi chodziło .... 8-)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez polymorphism » czwartek, 2 sierpnia 2012, 10:04

Nie mam pojęcia co to jest
KOD cpp:     UKRYJ  
const BSTR Root

To jest wskaźnik na specjalny unikodowy ciąg znakowy, używany w interfejsach COM. Różnica między zwykłym ciągiem znakowym a BSTR jest taka, że ten drugi zawiera długość ciągu. Dlatego też to:
KOD cpp:     UKRYJ  
SelectDirectory(..., String("2").w_str(), ...);

jest nieprawidłowe. Tak powinno być:
KOD cpp:     UKRYJ  
SelectDirectory(..., WideString(L"c:\\"), ...);

Według tego co wyczytałem w dokumentacji, WideString ma przeciążony operator konwersji na BSTR, więc powinno być dobrze.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Corvis
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Mironas » czwartek, 2 sierpnia 2012, 11:15

Witam wszystkich.
Skoro już o SelectDirectory to też mam parę pytań:

1. Czy można przed wywołaniem SelectDirectory ustalić jego pozycję i rozmiar?
2. Czy drzewko katalogów z SelectDirectory da się zastosować na swojej formie tak jak zwykłe TTreeView?
3. Do czego służy parametr 'TWinControl* Parent'?
4. Wiem co to jest parametr 'root' (np "C:\\") ale o co chodzi z tym 'WideString(L"2")'?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez polymorphism » czwartek, 2 sierpnia 2012, 11:45

Jeśli SelectDirectory jest tym samym co SHBrowseForFolder, to:
  1. nie.
  2. nie.
  3. okno-rodzic.
  4. heh, pewnie mu wcześniej wyrzucało błąd, bo zły typ pustego stringa podawał, więc musiał coś tam dać, no i cudem zadziałało ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Mironas » czwartek, 2 sierpnia 2012, 11:57

Tak, ale ja chciałem dowiedzieć co daje: WideString(L"2")
Jeśli jako parametr root wpiszę "" (ciąg pusty) to pokazuje strukturę od pulpitu. Jeśli wpiszę "C:\\" to pokazuje dysk C.
A jeśli wpiszę WideString(L"2") - pokazuje znowu od pulpitu, więc czemu to służy?
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez polymorphism » czwartek, 2 sierpnia 2012, 12:20

No to przecież napisałem czemu to służy ;) Po prostu dał '2', bo musiał(?) coś wpisać, żeby działało (oczywiście spekuluje, nie jestem Corvisem). Jeśli chodzi o klasę WideString, to zwróć uwagę, że według Corvisa*) drugi parametr jest typu const BSTR, zatem nie możesz w tym parametrze dać ot tak jakiś literał tekstowy, ponieważ nie zaszłaby poprawnie konwersja łańcuchów const char* -> const BSTR. Wymaganą konwersję spokojnie wykona klasa WideString, i dlatego jest w kodzie, który podałem (poprawiłem swój kod, żeby nie było tej kontrowersyjnej dwójki ;)).

*) tak patrze na dokumentację VCL-a na stronach embarcadero i nie widzę wersji z BSTR, jest za to wersja z WideStringiem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Mironas » czwartek, 2 sierpnia 2012, 12:46

No właśnie ta dwójka mnie zmyliła. U mnie też jest WideString i poprawnie działa L"C:\\" jak też "C:\\" (bez 'L').
Szkoda że nie można drzewka katalogów użyć jak TTreeView. Bardzo brakuje takiego komponentu.
Dzięki za odpowiedzi.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez polymorphism » czwartek, 2 sierpnia 2012, 13:20

Poszukaj sobie w sieci jakichś kodów, które realizują directory-tree-view, niekoniecznie z wykorzystaniem VCL-a (w sumie WinAPI pozostaje tylko). Na pewno znajdziesz coś darmowego.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Cyfrowy Baron » czwartek, 2 sierpnia 2012, 18:01

Jeszcze moja propozycja pozwalająca używać nowego typu okna do wyboru katalogu:

SHBrowseForFolder.png


Własna funkcja:
KOD cpp:     UKRYJ  
#include "shlobj.h"
String __fastcall ExecuteFolder(String sTitle)
{
 BROWSEINFO info;
 wchar_t szDir[MAX_PATH];
 wchar_t szDisplayName[MAX_PATH];
 LPITEMIDLIST pidl;
 LPMALLOC pShellMalloc;

 String Result;

 if(SHGetMalloc(&pShellMalloc) == NO_ERROR)
 {
  memset(&info, 0x00,sizeof(info));
  info. hwndOwner = NULL;
  info.pidlRoot = NULL;
  info.pszDisplayName = szDisplayName;
  info.lpszTitle = sTitle.c_str();
  info.ulFlags =  BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_USENEWUI;
  info.lpfn = 0;
  pidl = SHBrowseForFolder(&info);


  if(pidl)
  {
   if(SHGetPathFromIDList(pidl, szDir))
   {
        Result = szDir;
   }

   pShellMalloc->Free(pidl);
  }
  pShellMalloc->Release();
 }

 return Result;
}


Wywołanie funkcji:
KOD cpp:     UKRYJ  
Edit1->Text =  ExecuteFolder("Wybierz folder");


Nie można określić katalogu startowego.



polymorphism napisał(a):jest nieprawidłowe. Tak powinno być:
KOD cpp:     UKRYJ  
SelectDirectory(..., WideString(L"c:\\"), ...);


Ta konwersja jest zbędna, wystarczy przekazać wartość typu UnicodeString. Jeśli wskażesz w ten sposób katalog początkowy to okno dialogowe nie pozwoli wybierać katalogów poniżej tego wybranego. Wskaż np. katalog c:\windows, a będziesz mógł wybierać tylko podkatalogi katalogu Windows. Jeśli przekażesz pusty ciąg znaków to katalogiem początkowym będzie ten określony w parametrze Dir. Jeśli Dir również będzie pusty to katalogiem startowym będzie Pulpit.

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String RootDir = ""; /* lub np. "c:\\Windows" */
 String Dir = "C:\\Program Files";

 if( SelectDirectory("Wybierz katalog", RootDir, Dir, TSelectDirExtOpts() << sdNewFolder << sdNewUI, NULL) )
 {
        Edit1->Text = Dir;
 }
}


KOD cpp:     UKRYJ  
void __fastcall TForm1::Button8Click(TObject *Sender)
{
 wchar_t SpecDir[MAX_PATH];
 SHGetSpecialFolderPath(NULL, SpecDir, CSIDL_PERSONAL, 0); /* CSIDL_PERSONAL = Moje Dokumenty */

 String RootDir = SpecDir;
 String Dir;

 if( SelectDirectory("Wybierz katalog", RootDir, Dir, TSelectDirExtOpts() << sdNewFolder << sdNewUI, NULL) )
 {
        Edit1->Text = Dir;
 }
}


KOD cpp:     UKRYJ  
void __fastcall TForm1::Button8Click(TObject *Sender)
{
 wchar_t SpecDir[MAX_PATH];
 SHGetSpecialFolderPath(NULL, SpecDir, CSIDL_MYPICTURES, 0); /* CSIDL_PERSONAL = Moje Dokumenty\Moje obrazy */

 String RootDir = "";
 String Dir = SpecDir;

 if( SelectDirectory("Wybierz katalog", RootDir, Dir, TSelectDirExtOpts() << sdNewFolder << sdNewUI << sdShowEdit, NULL) )
 {
        Edit1->Text = Dir;
 }
}




Mironas napisał(a):2. Czy drzewko katalogów z SelectDirectory da się zastosować na swojej formie tak jak zwykłe TTreeView?


W pakiecie komponentów LMD Tools znajdziesz komponenty LMDShellFolder i LMDShellTree, które połączone działają jak to TreeView z okna dialogowego SelectDirectory. Możliwości komponentu LMDShellTree są jednak dużo większe.

LMDShellTree.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez polymorphism » czwartek, 2 sierpnia 2012, 19:37

Ta konwersja jest zbędna, wystarczy przekazać wartość typu UnicodeString.

W dokumentacji nie widzę, żeby UnicodeString miał przeciążony operator konwersji na BSTR, zatem dla parametru typu BSTR to, co podałeś, nie musi działać. Tyle tylko, jak już wcześniej wspomniałem, w dokumentacji nie ma wersji z typem BSTR. Nie wiem, skąd Corvis ją wygrzebał.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: [BCB C++] SelectDirectory z możliwością utworzenia

Nowy postprzez Cyfrowy Baron » czwartek, 2 sierpnia 2012, 20:39

polymorphism napisał(a):ie wiem, skąd Corvis ją wygrzebał.


Prawdopodobnie z wcześniejszych wersji środowiska, tych sprzed UnicodeString.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości