pokazujDwieKropki :Boolean;//pola przechowujace ustawienia komponentusciezkaKatalogu :String;uwzglednijKatalogi :Boolean;uwzglednijPliki...
Serwis znalezionych hasełOdnośniki
- Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
- public static void main(String[] args) { analyze("I am happy about this"); analyze("I am not happy about this"); analyze("I am not! I am happy");...
- Family: UInt4;Model: UInt4;Stepping: UInt4;Features: TCpuFeatureSet;Vendor: string[12];end;// Pobranie informacji o CPU i zapisanie...
- string ob_get_length ( void) ob_implicit_flush Włącza lub wyłącza ukryte opróżnianie bufora wyjściowego (jeżeli nie podany został znacznik...
- — Chrystus zmartwychwstał! — krzyknąłem przechodząc...
- kończył obrót o sto osiemdziesiąt stopni, ustawiając okręt ekranami ku przeciwnikowi i kontynuując ostry skręt w lewo...
- Often you will need to see if a string contains a group of characters...
- Przykład ten pokazuje, że logika Arystotelesa dotyczy stosunku między pojęciami, w tym przypadku pojęciami „żywej istoty” i „śmiertelności”...
- Jeeli nie chcesz aby pojawia si ten komunikat, musisz ustawi w pliku php...
- W przypadku immobiliserw bardzo wana jest bezpieczna konstrukcja i uycie wysokiej jakoci komponentw, gdy urzdzenia te wpywaj w sposb bezporedni na...
- Przykład ten pokazuje, że nabieranie dystansu i przyjmowanie różnych ról badawczych jest elastycznym procesem, wymagającym od badacza dużej pomysłowości i...
Smutek to uczucie, jak gdyby się tonęło, jak gdyby grzebano cię w ziemi.
Do sekcji implementation dodajemy natomiast definicję tej metody (listing 7.4): Listing 7.4. Serce komponentu
procedure TFileListBox.PobierzZawartoscKatalogu;
type TablicaObiektow = array of TObject;
begin
if sciezkaKatalogu=nil then sciezkaKatalogu:=Directory.GetCurrentDirectory; pokazujDwieKropki:=(sciezkaKatalogu<>Path.GetPathRoot(sciezkaKatalogu)) and uwzglednijKatalogNadrzedny;
if (not Directory.Exists(sciezkaKatalogu)) then
raise Exception.Create('Katalog '+sciezkaKatalogu+' nie istnieje!');
ListBox1.Items.Clear;
if uwzglednijKatalogi then
begin
if pokazujDwieKropki then ListBox1.Items.Add('[..]');
listaKatalogow:=Directory.GetDirectories(sciezkaKatalogu);
System.Array.Sort(listaKatalogow);
listBox1.Items.AddRange(listaKatalogow as TablicaObiektow);
end;
if uwzglednijPliki then
begin
listaPlikow:=Directory.GetFiles(sciezkaKatalogu);
System.Array.Sort(listaPlikow);
listBox1.Items.AddRange(listaPlikow as TablicaObiektow);
end;
if uwzglednijDyski then
begin
listaDyskow:=Directory.GetLogicalDrives();
listBox1.Items.AddRange(listaDyskow as TablicaObiektow);
end;
end;
4. Do konstruktora klasy dodajemy wywołanie zdefiniowanej metody (listing 7.5): Listing 7.5. Wywołanie funkcji PobierzZawartoscKatalogu finalizuje inicjację komponentu constructor TFileListBox.Create;
begin
inherited Create;
//
// Required for Windows Form Designer support
//
InitializeComponent;
//inicjacja prywatnych pol klasy
pokazujDwieKropki:=True;
sciezkaKatalogu:=nil;
uwzglednijKatalogi:=True;
uwzglednijPliki:=True;
uwzglednijDyski:=True;
uwzglednijKatalogNadrzedny:=True;
Rozdział 7. ♦ Kontrolka Windows Forms
265
filtr:=nil;
//zapelnianie listy
PobierzZawartoscKatalogu;
end;
5. Kompilujemy i uruchamiamy projekt naciskając klawisz F9.
Jak działa metoda PobierzZawartoscKatalogu? Na początku metody sprawdzamy, czy własność określająca ścieżkę do katalogu nie jest przypadkiem pusta. Jeżeli jest, to umieszczamy w niej ścieżkę do bieżącego katalogu roboczego odczytanego za pomocą polecenia Directory.GetCurrentDirectory. Kolejny warunek sprawdza, czy katalog wskazywany przez własność sciezkaKatalogu istnieje na dysku. Jeżeli nie — zgłaszany jest wyjątek z odpowiednim komunikatem.
Następnie sprawdzamy, czy na początku listy powinny znajdować się dwie kropki reprezentujące katalog nadrzędny (to okaże się bardzo wygodne, gdy będzie już możliwe wędrowanie po katalogach za pomocą tego komponentu). Abyśmy mogli dodać owe dwie kropki, muszą być spełnione dwa warunki. Po pierwsze katalog, którego zawartość zamierzamy zaprezentować, nie może być katalogiem głównym dysku oraz rów-nocześnie własność uwzglednijKatalogNadrzedny musi być ustawiona na True.
Za pomocą polecenia ListBox1.Items.Clear czyścimy zawartość ListBox1 i przystę-
pujemy do odczytania listy plików, katalogów i dysków przy użyciu odpowiednich metod statycznych klasy Directory. Wreszcie, po posortowaniu, umieszczamy je w ListBox1 za pomocą jego metody ListBox1.Items.AddRange, uwzględniając wartość odpowiednich pól z grupy uwzglednij.... Aby skorzystać z metody AddRange, rzutu-jemy dynamiczną tablicę łańcuchów na tablicę obiektów (operator as). Korzystamy w tym celu ze zdefiniowanego w nagłówku metody typu TablicaObiektow. Zasadnicze zna-czenie ma w powyższym kodzie klasa Directory. Poza wykorzystanym przez nas od-czytywaniem zawartości wskazanego katalogu udostępnia ona także statyczne metody, pozwalające na manipulowanie katalogami (tworzenie, kasowanie).
Dodając wywołanie metody do konstruktora musimy zwrócić uwagę na to, aby znalazło się ono za wywołaniem metody InitializeComponent inicjującej umieszczone w trakcie projektowania komponenty. Nie musimy inicjować pola sciezkaKatalogu łańcuchem odpowiadającym konkretnemu katalogowi, bo gdy metoda PobierzZawartoscKatalogu wykryje, że jest ono niezainicjowane, sama zapisze do niej ścieżkę bieżącego katalogu.
Projekt 125. Z pełnej ścieżki dostępu do plików
wyłaniamy samą nazwę plików i katalogów
Jak zwykle przy pierwszej kompilacji kodu nie wszystko działa jak należy (o ile w ogóle się kompiluje i uruchamia). Aplikacja Czytelnika powinna wyglądać jak na rysunku 7.1, co oznacza, że również u Czytelnika komponent prezentuje pliki z pełną ścieżką do-stępu. Musimy zatem zmodyfikować tę metodę w taki sposób, aby widoczna była tylko sama nazwa pliku lub katalogu.
266
Część III ♦ Projektowanie komponentów
Rysunek 7.1.
Jak widać pierwsza
wersja komponentu
nie działa w pełni
zgodnie z naszymi
oczekiwaniami
Inny sposób wyodrębnienia nazwy pliku za pomocą klasy FileInfo opisany został
w projekcie 102.
1. Przystępujemy do edycji modułu komponentu (zakładka FileListBox).
2. Na każdą pozycję z list listaPlikow i listaKatalogow działamy metodą Path.GetFileName przed dodaniem jej do ListBox1. Nazwy katalogów
uzupełniamy nawiasami kwadratowymi, a symbole dysków — nawiasami
utworzonymi ze znaków < i > (listing 7.6):
Listing 7.6. Poprawione serce komponentu
procedure TFileListBox.PobierzZawartoscKatalogu;
type TablicaObiektow = array of TObject;
var
i :Integer;
sciezka :String;
begin
if sciezkaKatalogu=nil then sciezkaKatalogu:=Directory.GetCurrentDirectory; pokazujDwieKropki:=(sciezkaKatalogu<>Path.GetPathRoot(sciezkaKatalogu)) and uwzglednijKatalogNadrzedny;
if (not Directory.Exists(sciezkaKatalogu)) then
raise Exception.Create('Katalog '+sciezkaKatalogu+' nie istnieje!');
ListBox1.Items.Clear;
if uwzglednijKatalogi then
begin
if pokazujDwieKropki then ListBox1.Items.Add('[..]');
listaKatalogow:=Directory.GetDirectories(sciezkaKatalogu);
System.Array.Sort(listaKatalogow);
for sciezka in listaKatalogow do
listBox1.Items.Add('['+Path.GetFileName(sciezka)+']');
end;
if uwzglednijPliki then
Rozdział 7. ♦ Kontrolka Windows Forms
267
begin
if (filtr<>nil) then
listaPlikow:=Directory.GetFiles(sciezkaKatalogu,filtr)
else
listaPlikow:=Directory.GetFiles(sciezkaKatalogu);
System.Array.Sort(listaPlikow);
for sciezka in listaPlikow do
listBox1.Items.Add(Path.GetFileName(sciezka));
end;
if uwzglednijDyski then
begin
listaDyskow:=Directory.GetLogicalDrives();