CentrumXP.pl » Witamy
CentrumXP.pl
 
Szukaj
Subskrypcja
Powiadomienie e-mailem o nowościach na CentrumXP.pl:
E-mail: Zapisz
Czy zamierzasz pobrać Internet Explorer 9?


CentrumXP.pl » Microsoft .NET » Visual C# w praktyce » Dodaj do ulubionych Dodaj do ulubionych   Dodaj do ulubionych Wersja do wydruku

Commander w C#

Autor: Marcin Hałaczkiewicz    Opublikowano: 24 kwietnia 2007    Odsłon: 64088    »Skomentuj...
Strona:
Zobacz również:

Analogowy zegarek

Budzik w C#

Kalkulator w C#

Komunikator w C#

Mini Paint w C#

Notatnik w C#

Przeglądarka internetowa w C#

Przeglądarka zdjęć w C#

Przetwarzanie obrazów

Snake w C#

Tetris w C#

Wygaszacz ekranu w C#

»Uzyskaj pomoc na forum

Napiszmy teraz w klasie z formą dwie przydatne funkcje: void wyswietl(ListView gdzie, string katalog) oraz void KopiujKatalog(string zrodlo, string cel). Pierwsza z nich wyświetli zawartość katalogu przekazanego w drugim argumencie w oknie ListView przekazanym w pierwszym argumencie. Jeśli znajdujemy się głębiej niż tylko na dysku (np. C:\Windows) to u góry zostanie wyświetlone ...,  co pozwoli nam wrócić do katalogu znajdującego się wyżej w hierarchii. Dla plików w kolumnie Typ pojawi się rozszerzenie pliku, dla katalogów znajdzie się tam napis <DIR>. Kolumna Rozmiar będzie wypełniona jedynie w przypadku pliku.

Niestety programiści Microsoftu nie pomyśleli o funkcji pozwalającej skopiować katalog. Musimy więc zająć się tym sami. Zajmie się tym funkcja void KopiujKatalog(string zrodlo, string cel). Działa ona w sposób rekurencyjny. Oznacza to, że jeśli kopiowany katalog zawiera podfoldery, to z poziomu kopiowania tego właśnie katalogu zostanie wywołana funkcja do skopiowania podfolderu. KopiujKatalog sprawdza kolejno elementy kopiowanej "teczki". Jeśli tym elementem jest folder, to KopiujKatalog skopiuje go rekurencyjnie wywołując samą siebie, jeśli jest to plik - dokona się zwyczajne kopiowanie. Niby nic wielkiego, jednak Microsoft na to nie wpadł ;)

Stwórzmy teraz obsługę zdarzenia FormLoad dla naszej formy. Pobierze ono litery wszystkich dostępnych w systemie dysków, oraz pozwoli wybrać je w kontrolkach Dysk1 i Dysk2. Ponadto dla każdej z nich spowoduje aktywację "C:\", co w konsekwencji sprawi, że zawartość tego dysku wyświetli się w oknach (zaraz napiszemy zdarzenie, które to obsłuży).

Gdy zakończyliśmy projektowanie wyglądu aplikacji zostało powiedziane, że to jeszcze nie wszystko. Chodzi o to, że podczas zmieniania rozmiaru okna programu, kontrolki nie rozszerzają się dokładnie tak jakbyśmy sobie tego życzyli. Najlepiej by było, gdyby okna ListView były jednakowych rozmiarów i spotykały się na środku formy z takim samym odstępem jak po uruchomieniu aplikacji. Zapewnimy to wszystko oprogramowując zdarzenie FormResize dla formy. W jego kodzie obliczane są odpowiednie rozmiary oraz położenia okien lvOkno1 i lvOkno2.

Chcielibyśmy, aby po wybraniu dysku z ComboBoxa uaktualniło się odpowiednie okno. W tym celu dodajemy dwa zdarzenia SelectedIndexChanged dla obu kontrolek ComboBox. Będą działać one dokładnie tak samo z tym, że dla odpowiednich okien i ComboBoxów. Spowodują wyświetlenie nowo wybranego napędu we właściwym oknie lub ewentualnie wyświetlą komunikat o błędzie, gdy np. w cd-romie nie ma płyty.

Wcześniej stworzyliśmy zmienne pomocnicze przechowujące aktywne/nieaktywne ścieżki i okna. Aby zapewnić ich poprawną zawartość tworzymy dwa zdarzenia Enter dla kontrolek lvOkno1 i lvOkno2. Spowodują one odpowiednie uaktualnienie zmiennych pomocniczych w zależności od tego jakie okno zostało wybrane (czyli stało się aktywne). Przyda się to podczas kopiowania i przenoszenia. Operacje te będą się odbywać z aktywnego do nieaktywnego ListView'a.


«Wstecz 1 2 3 Dalej» 

Aktualna ocena to: 3,23

Oceń artykuł...
Porażka Kiepski Taki Sobie Dobry Super!

Tagi:  

A teraz:    Dodaj do ulubionych Dodaj do ulubionych    Wydrukuj Wydrukuj    Wyślij link znajomemu Wyślij link znajomemu    Skomentuj Skomentuj

Komentarze do Commander w C#

Dodaj komentarz»

kamas 12 lipca 2007, 14:11

Przykład bardzo ciekawy, ale wydaje mi się, że wkradł się mały błąd: Wywołanie funkcji lvOkno_MouseDoubleClick(object sender, MouseEventArgs e) z parametrami null powoduje zgłoszenie wyjątku (takie wywołanie ma miejsce wewnątrz funkcji cmdOtworz_Click(object sender, EventArgs e)). Powodem zgłoszenia wyjątku jest poniższa instrukcja warunkowa w funkcji lvOkno_MouseDoubleClick: if (e.Button == MouseButtons.Left) Ponieważ obiekt e nie istnieje (przekazaliśmy null do funkcji) nie można go z niczym porównywać. Dla mniej doświadczonych czytelników przedstawiam proste rozwiązanie: Instrukcja warunkowa powinna wyglądać tak: if (e == null || e.Button == MouseButtons.Left) Ważne jest, aby warunek e == null występował jako pierwszy, gdyż jeśli jest on spełniony to 2 warunek nie będzie sprawdzany i nie wygeneruje błędu (skrócone wyznaczanie wartości wyrażeń). I jeszcze jedna rzecz, którą bym zmienił/poprawił: funkcja wyswietl() może wygenerować wyjątek jeśli spróbujemy otworzyć katalog, do którego nie mamy dostępu (np System Volume Information). Wystarczy umieścić kod funkcji w bloku try, natomiast w bloku catch wstawić MessageBox z informacją o braku dostępu do katalogu.

mon 23 lipca 2007, 14:08

hmmm, coś MouseDoubleClick nie działa...

x or y? 12 sierpnia 2007, 1:30

Hmm...wszystko pieknieładnie ale prosiłbym o gotowy projekt, wielka prośba. z góry dziekuję.

Napi 20 listopada 2007, 14:51

Może nieuważnie coś przekleiłem gdzie indziej, ale... u mnie wchodząc w katalog na dysku innym niż C: program się sypał - katalogu wyświetlonego (np.) z D: szukał na C:... Najprościej dodać linkijkę dla ComboBox"ów jak poniżej: private void Dysk1_SelectedIndexChanged(object sender, EventArgs e) { sciezka1 = cbxDysk.Text; AktywnaSciezka = cbxDysk.Text; //poprawka

pewoj 8 stycznia 2008, 20:32

zrobiłem zapisałem i uruchamiam aplikację nagle w polach Dysk 1 2 liOkno 1 2 są puste co zrobiłem zle

Vesp3r 1 marca 2008, 14:24

Wszystko łądnei pięknei ale niedziała w ogóle :| Program wysypuje się u mnie już na "FileInfo plik;" i pokazuje ze takeigo czegoś nie moze znaleźć :/

krho 23 czerwca 2008, 0:13

@Vesp3r musisz dodać na początku using System.IO;

Janekk 30 października 2008, 0:41

wszystko extra zrobilem i niedziala nie wyswietla mi nic w ComboBoxie oraz w ListView... kompletnie puste... kto wysle dzialajacy projekt? z gory dzieki... GG:6347525

Janekk 10 listopada 2008, 14:42

to ktos mi powie jak to zrobic, lub da projekcik? :)

Justin 7 grudnia 2008, 0:28

ty janek pewnie skopiowales caly kod do siebie tak? musisz ręcznie wywolac eventy dla form bo program ich nei widzi jak je skopiujesz pozatym jest tam pare burakow nazewniczych 

bzzzz 7 grudnia 2008, 0:51

w obsludze kopiowania jest mozliwosc zapetlenia rekurencji :">
a nikt nie lubi miec duzo folderow o tej samej nazwie jeden pod drugim :">
 
ja to tak rozwiazalem:
 
<br />                    if (AktSciezka + AktOkno.SelectedItems.Text + "\\" == NAktSciezka)<br />                    {<br />                        MessageBox.Show("NIE WOLNO ZAPETLAC REKURENCJI!! ", "error");<br />                        return;<br />                    }<br />                    <br />                    zrodlo = AktSciezka + AktOkno.SelectedItems.Text + "\\";<br />                    cel = NAktSciezka + AktOkno.SelectedItems.Text + "\\";<br />                    KopejDira(zrodlo, cel);<br />

freemp3 8 grudnia 2008, 16:15

No programik bardzo ładnie tyle, że nie działa. Normalnie się włącza ale, że tak powiem nic nie robi. W combobox-ach moge pisać co chce i jest zero reakcji, przyciski też sobie moge wćiskać ile chce i nic. Tak jak by wogóle kodu z funkcjami nie było :/

HANYS 24 grudnia 2008, 13:22

Nie działa mi ten program nie moge dysków otwierac w comboboksie a potrzebuje drzewko plików i folderów zboku do mojej przegladarki prosze o pomoc GG 1069394

Janekk 4 stycznia 2009, 18:54

nic nie rozumiem wezcie mi napiszcie projekcik dzialajacy, 5% osobom sie udalo zrobic a 95% nie umie...

Alucard 17 stycznia 2009, 17:08

Podaj maila to prześle Ci działający programik

Janekk 19 stycznia 2009, 22:27

VandziorX@o2.pl
 
dziex ;)

Janekk 19 stycznia 2009, 22:28

(sory ze 2 posty na raz)
 
ale projekt daj ok ;) z gory dzieki ;)

Maciek 28 stycznia 2009, 21:58

Też mam pytanie, wydaje mi się że wszystko zrobiłem dobrze, a mimo to po włączeniu programu, nie wyświetla się zawartoś dysków mimo iż program zczytuje wszystkie napędy w komputerze? Co może być nie tak?

Eider878 15 lutego 2009, 10:13

Właśnie, coś jest nie tak z tym kodem...

ES 15 lutego 2009, 17:18

Może mi ktoś przesłać projekt na emaila: robotboy111@gmail.com
 
Z góry dziękuję

tajniak 27 lutego 2009, 12:44

Ej! Przecie zrobienie tego to bułka z masłem. Fakt, że jest tam błąd, ale pierwszy komentarz kamas"a pokazuje jak go rozwiązać. I nie przeklepujcie w ciemno kodu - przeczytajcie komentarz Justin:
 
"ty janek pewnie skopiowales caly kod do siebie tak? musisz ręcznie wywolac eventy dla form bo program ich nei widzi jak je skopiujesz pozatym jest tam pare burakow nazewniczych "

 
...

wszystko działa ... wystarczy czytac ...

ES 4 marca 2009, 21:25

Jeżeli jesteś taki mądry to pokaż to i daj link do pliku

MP 5 marca 2009, 18:48

Nie wiem dlaczego, ale po kompilacji programu wyświetla się tylko interface... żadna z funkcji programu nie działa (po prostu tak jakby jej nie było). Poza tym wywala błąd using System.Linq; oraz odwołuje się do nazwy Directory.
Jeżeli są w śród nas jeszcze dobrzy ludzie to proszę niech ktoś mi podeśle działający kod źródłowy pod:
pawel-m_p@tlen.pl
 
z góry dzięki :">
 

Janekk 9 marca 2009, 21:12

ok pogrzebalem i nie dzialalo ale na forum jednym napisalem i odrazu pomogli ;)

ES 12 marca 2009, 20:43

Mógłbyś podać adres tego forum?

ES 15 marca 2009, 16:08

Trochę pogrzebałem i działa, tylko na Win Vista mówi, że błąd dostępu do dysku, ale na XP działa...

HERKI 11 maja 2009, 9:00

Witam. Mam do Was pytanie, czy komuś działają przyciski funkcyjne (F5,F6,F7,F8) ?? Jeśli ktoś ma na to rozwiązanie to proszę o kontakt na GG:1905825 lub herki17@gmail.com

maksio1 6 czerwca 2009, 9:19

Co do przycisków funkcyjnych, to trzeba jedynie ustawić we właściwościach przycisku odpowiedni skrót klawiszowy we właściwości przycisku: "ShortcutKeys". Potem ustawić zdarzenie "ShowShortcutKeys" na false. Podobnie z resztą przycisków. No i po co się tak męczyć ze skrótami?

Szefik 8 lipca 2009, 21:05

moglby ktos wysłać ten program na mail szefik19@wp.pl 
Z góry dzięki...

Ufolec 10 lipca 2009, 11:59

Ludzie ja nie wiem w czym wy widzicie problem, uważam że wszelkie kłopoty zostały rozwiane w komentarzach powyżej różnych ludzi. Jeśli nie robiliście tego sami tylko skopiowaliście kod i dodaliście kontrolki, to jeśli chcecie by program coś robił - POWINNIŚCIE DO ZDARZEŃ KONTROLEK (EVENT) DODAĆ POSZCZEGÓLNE FUNKCJE, było już o tym kilka razy pisane, ale nadal macie z tym problem? Poza tym chciałbym w tym komentarzu podziękować za tego Commandera, oraz chociażby autorowi pierwszego komentarza (kamas) który bardzo szybko uporał się z małymi niedoróbkami projektu i się tym podzielił z resztą świata. Sam artykuł oceniam na pełne 4. Pozdrawiam.

MAT44869 22 września 2009, 17:02

Nie Wiem o co Wam chodzi, wsztko działa idealnie! I nie kopiujcie w sślepo kodu bo się pogubicie! Myślcie co kopiujecie i gdzie to dajecie.

jj 18 listopada 2009, 12:36

a ja mając Win7 nie mogę się dostać do katalogu "Documents and Settings" zwraca wyjątek - brak dostępu. jak to można rozwiazać?

J 20 listopada 2009, 20:48

Jakby nie patrzyć program tochę lipny. W normalnych systemach obok nazwy katalogu lub pliku pojawia się jego ikonka. A tu? Auto poszedł na łatwiznę i wylistował jedynie zawartość katalogu. :-/

eidersoft 14 stycznia 2010, 15:31

Jeżeli ktoś ma jakieś problemy z kompilacja możecie pobrać kod źródłowy + skompilowany program pod adresem: http://www.eider.boo.pl/upload/Commander.zip

dzadzar 29 stycznia 2010, 14:48

link niestety nie działa:( można jeszcze raz upnąć?

Beginner 19 lutego 2010, 0:02

Działa w sumie, ale trzeba wszystkie eventy wywołać ;)

$tomek 3 marca 2010, 18:31

Po drobnych problemach udało się! Programik działa, jest ok

Paweł 5 marca 2010, 11:17

Jak dodać event dla kontrolki?

Ania 30 marca 2010, 14:34

Co do zapetlania się rekurencyjnie wywoływanej procedury KopiujKatalog, wystarczy w niej zamienić miejscami 2 wiersze na:             nazwy = Directory.GetFileSystemEntries(zrodlo);             if (!Directory.Exists(cel)) Directory.CreateDirectory(cel); i to, o czym pisał: bzzzz 7 grudnia 2008, 0:51 - jest już zbedne.

Maury 22 sierpnia 2010, 15:34

Ja mam dziwny problem, program dziala ladnie i wogole. Ale w Jak go uruchamiam to w lvOkno1 nie wyswietla sie nic jakby niedzialalo. Co moze byc nie tak?? Poprawilem wszystko z tych komentarzy, co jeszcze moge zrobic ??

Nerin 21 listopada 2010, 13:30

ListView ma wbudowane funkcje do czytania wszystkich plików i folderów, pisząc "Microsoft" nie wpadł na to, zapewne korzystasz z windowsa z zamkniętymi oczyma. Ale poradnik bardzo ładny.

Mich4el 28 stycznia 2011, 6:03

Prześlij ktoś proszę mi ten projekt gotowy jezymut@gmail.com

max_zone 3 lutego 2011, 18:28

Witam dzieki wasyzm komentarza naprawilem te niewielkie bledy nadal nie dzialaja mi skroty klawiszowe nie ma takiej wlasnosci na buton shortkey ale wyczytalem w microsoft ze powino dzialas keydown mam z tym kodem :  private void FTP_KeyDown(object sender, KeyEventArgs e)         {                        switch (e.KeyCode)             {                 case Keys.F5:                                        cmdOtworz_Click(null, null);                     break;                 case Keys.F6:                     cmdKopiuj_Click(null, null);                     break;                 case Keys.F7:                     cmdPrzenies_Click(null, null);                     break;                 case Keys.F8:                     cmdUsun_Click(null, null);                     break;             }         }

max_zone 3 lutego 2011, 18:28

Oczywiscie na zdazenie events nie kopiowanie recznie do kodu . Niestety nie dziala probowalme messagesboxshow ale wogole nie dochodzi co zadnego case zwykly if tez nie dziala probowalem na innym kodzie: w innym zdarzeniu tez nie dziala  Pomozcie        private void FTP_KeyPress(object sender, KeyPressEventArgs e)         {             switch (e.KeyChar)             {                 case ((char)116):                     cmdOtworz_Click(null, null);                     break;                 case ((char)117):                     cmdKopiuj_Click(null, null);                     break;                 case ((char)118):                     cmdPrzenies_Click(null, null);                     break;                 case ((char)119):                     cmdUsun_Click(null, null);                     break;             }

max_zone 3 lutego 2011, 18:30

Key_preview na true w wlasnosciach forma trzeba dac.No ok juz mam moglem poczekac z tym komentarzem ale no coz moze komus sie przydaja acii code :)

Kamil 24 czerwca 2011, 11:18

Panowie ale zauwazyliście ze gdy nie mam aktywnej listy z plikam klikamy button Usun to program sie wysypuje? jakby nie działał if(AktywneOkno == null) wicie co jest grane?

Kamil 24 czerwca 2011, 12:33

Okej zastosowanie zdarzenia Enter jest błedne focus dla kontrolki listaplikow ejst ustawiany zanim program sie uruchomi :) czyli jakby zawsze atywne okno nie będzie nullem i warunek if(aktywneokno ==null) nigdy nie zostanie spełniuony proponuje użyc zdarzenia click :)

Krzysiek Q 22 października 2011, 23:10

Interesuje mnie jedna rzecz. Czemu tak prosty projekt zajmuje 28Mb pamięci, gdzie cały działający Total Commader tylko 12? Jak to można odchudzić?


Dodaj swój komentarz

»Zasady udzielania komentarzy

Autor:  
Komentarz:
Dodaj komentarz
© 2012 Onex Group
Onex Group O Onex Group  |  O CentrumXP.pl  |  Kontakt  |  Reklama
Nasze serwisy: CentrumXP.plXboxSpot.pl  |  Jama Mastaha