OpenDialog a ListBox

dział ogólny

OpenDialog a ListBox

Nowy postprzez Minister » wtorek, 24 sierpnia 2010, 20:21

Cze.
Mam problem. Chcę wsadzić do ListBoxa lokalizacje wszystkich plików wybranych poprzez OpenDialog. Ustawiłem MultiSelect na true, więc mogę kilka zaznaczyć. Jak można teraz przenieść te nazwy plików do listboxa? Chcę potem po kolei coś z nimi zrobić.
Z góry dzięki
Avatar użytkownika
Minister
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): wtorek, 24 sierpnia 2010, 20:18
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Firefox

Re: OpenDialog a ListBox

Nowy postprzez MisticFrezer » wtorek, 24 sierpnia 2010, 20:29

To bardzo proste. OpenDialog ma właściwość Files->Strings, gdzie siedza ścieżki. Tak więc
Kod: Zaznacz cały
if(OpenDialog1->Execute() && !OpenDialog1->FileName.IsEmpty())
{
int ileplikow = OpenDialog1->Files->Count;
        for(int i=0;i<ileplikow;i++)
        {
         ListBox1->Items->Add(ExtractFileName(OpenDialog1->Files->Strings[i] ) );
        }
}
Avatar użytkownika
MisticFrezer
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): wtorek, 23 lutego 2010, 23:57
Lokalizacja: Wrocław
Podziękował : 1
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP3, Windows 7 Pro
Kompilator: BCB6, RAD Studio 2010, VS 2010
Gadu Gadu: 0
    Windows XPOpera

Re: OpenDialog a ListBox

Nowy postprzez Cyfrowy Baron » środa, 25 sierpnia 2010, 06:28

To jest prostsze niż myślisz. Pętla jest zbędna, a warunek też powinien być inaczej skonstruowany, gdyż ten element !OpenDialog1->FileName.IsEmpty() jest zbędny. Dlaczego? Dlatego, że jeżeli nie wybierzesz żadnego pliku w OpenDialog to nie będziesz mógł wybrać przycisku Otwórz, a okno będziesz mógł zamknąć tylko przyciskiem Anuluj, a wybranie przycisku Anuluj nie spełnia warunku OpenDialog->Execute(), więc nic nie będzie dodawane. Powinieneś jeszcze w opcjach OpenDialog ustawić właściwość Options->ofFileMustEists na true. Ta właściwość nakazuje wybranie tylko plików które istnieją, czyli są obecne w podanej lokalizacji. Przydaje się to w sytuacji gdy ktoś zamiast wybrać plik w oknie dialogowym wpisuje do niego ścieżkę dostępu w pole Nazwa pliku, a plik np. nie istnieje w podanej lokalizacji.

Kod: Zaznacz cały
OpenDialog1->FileName = "";
if(OpenDialog1->Execute())
{
   ListBox1->Items->AddStrings(OpenDialog1->Files);
}


OpenDialog->Files zwraca wartość typu TStrings a funkcja Items->AddStrings pobiera również wartość typu TStrings, dlatego za każdym wywołaniem tego kodu do listy ListBox1 będą dodawane pliki, gdybyś chciał za każdym wywołaniem kodu zmieniać zawartość listy ListBox1 wtedy można postąpić tak:

Kod: Zaznacz cały
OpenDialog1->FileName = "";
if(OpenDialog1->Execute())
{
   ListBox1->Items->Clear();
   ListBox1->Items->AddStrings(OpenDialog1->Files);
}


ale prościej będzie tak:

Kod: Zaznacz cały
OpenDialog1->FileName = "";
if(OpenDialog1->Execute())
{
   ListBox1->Items->Assign(OpenDialog1->Files);
}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Minister
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: OpenDialog a ListBox

Nowy postprzez Minister » środa, 25 sierpnia 2010, 14:26

Dzięki.
Ale ja to i tak zawsze problemy stwarzam. Ładnie lokalizacje sie wgrywały do ListBoxa. Poprawne.
Ale potem chcę je odczytać - i tu jest błąd. Zamiast przykładowo:
D:\2010\Polski.txt
Mam
:\2010\Polski.txt
czyli literke dysku wywala.
A w listboxie wyświetla dobrze.
W taki sposób to wyświetlam:

KOD cpp:     UKRYJ  
for (i = 0; i < ListBox1->Items->Count; i++) {
 ShowMessage(ListBox1->Items->ValueFromIndex[i]);
}


Znalazłem rozwiązanie - zamiast ValueFromIndex[i] dałem Strings[i]
Avatar użytkownika
Minister
Bladawiec
Bladawiec
 
Posty: 5
Dołączył(a): wtorek, 24 sierpnia 2010, 20:18
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP
Kompilator: C++ Builder 2007
Gadu Gadu: 0
    Windows 7Firefox

Re: OpenDialog a ListBox

Nowy postprzez Cyfrowy Baron » czwartek, 26 sierpnia 2010, 09:22

Funkcja Items->ValueFromIndex[index] też zwróci prawidłową wartość, chociaż tej funkcji używa się w sytuacji gdy lista zawiera nazwy i wartości przypisane do nazw. Użycie tej funkcji w sytuacji gdy lista nie jest zbudowana z nazw i wartości, gdzie separatorem jest znak równości powinno sprawić, że nic nie zostanie zwrócone, więc dziwne jest dla mnie, że funkcja cokolwiek zwraca, gdyż brak tutaj separatora w postaci domyślnego znaku równości ( = ).
► patrz serwis: Cyfrowy Baron dział: porady -> TStringList -> Tworzenie listy zawierającej nazwy i wartości przypisane do nazw.

Funkcja Items->Strings[index] zwróci element listy niezależnie od tego jaką konstrukcję ma ta lista.
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 14 gości