kamil274
Użytkownicy-
Zawartość
5 -
Rejestracja
-
Ostatnia wizyta
Zawartość dodana przez kamil274
-
Poczytałem na ten temat ale udało mi się zrobić tylko coś takiego: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ShellCtrls, FileCtrl; type TForm1 = class(TForm) TreeView1: TTreeView; ComboBoxEx1: TComboBoxEx; ListView1: TListView; DriveComboBox1: TDriveComboBox; Label1: TLabel; procedure DriveComboBox1Change(Sender: TObject); procedure TreeView1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Licznik:integer; {zmienna ktora steruje glebokoscia wpisywania elementow(katalogow) do drzewa} implementation {$R *.dfm} procedure ListujKatalogi(tnRodzic : TTreeNode; Sciezka : string); {Metoda falenicka} var sr : TSearchRec; Wynik : integer; tnDziecko : TTreeNode; begin if Licznik=2 then begin Licznik:=0; end else begin Wynik := FindFirst(Sciezka + '*.*', faAnyFile, sr); {czytamy pierwszy plik_katalog} while Wynik = 0 do{jesli funkcja cos znalazla(wynik=0) rob} begin if (sr.Name <> '.')and(sr.Name <> '..') then {jezeli jest to katalog} begin{dopisujemy do drzewka} tnDziecko := Form1.TreeView1.Items.AddChild(tnRodzic, sr.Name);{dopisujemy katalog jako podrzedny} Inc(Licznik); ListujKatalogi(tnDziecko ,Sciezka + sr.Name + '\'); {TO JEST TO WYWOLANIE REKURENCYJNE KTORE CZYTA NASTEPNE KATALOGI} {wywolujemy rekeurncyjnie metode, jako kat. nadrzedny bedzie teraz ostatnio znaleziony kat.} end; Wynik := FindNext(sr);{szukamy nastepnych} end; FindClose(sr); end; end; procedure TForm1.DriveComboBox1Change(Sender: TObject); begin TreeView1.Items.Clear; Licznik:=0; if DriveComboBox1.Drive='c' then begin ListujKatalogi(TreeView1.Items.AddChild(nil, '(Dysk ' + 'C' + ''),'C' + ':\'); end else if DriveComboBox1.Drive='d' then begin ListujKatalogi(TreeView1.Items.AddChild(nil, '(Dysk ' + 'D' + ''),'D' + ':\'); end else if DriveComboBox1.Drive='e' then begin ListujKatalogi(TreeView1.Items.AddChild(nil, '(Dysk ' + 'E' + ''),'E' + ':\'); end; Form1.TreeView1.Items.BeginUpdate; Form1.TreeView1.Items.EndUpdate; end; procedure TForm1.TreeView1Click(Sender: TObject); var Node,tmp:TTreeNode; I:integer; b:boolean; MousePos:TPoint; begin {Wyznacza plik} Node := TreeView1.Selected; if TreeView1.Selected.Level=1 then Form1.Label1.Caption:='Jestesmy w : '+Node.Text; end; end. Zrobiłem pętle(w procedurze rekurencyjnej) ale to nie działa zbyt dobrze.Otóż niektórych katalogów mi nie ładuje do drzewa.Ma ktoś jakiś pomysł jak to zrobić żeby ładowało mi tylko do 3 rzędu (licząc od 0) i gdy posunie się o 1 dalej w tym rzędzie to ładuje np o 3 rzędy dalej? Oto przykładowy układ tych rzędów: 0 1 2 2 1 2 3 <--Trzeci rząd 3 <--Trzeci rząd 4 1 2 2 3 <--Trzeci rząd 3 <--Trzeci rząd 4 4 2 1
-
Witam, próbuje zrobić coś na wzór TotalCommander. korzystam z TTreeView i DriveComboBox(wiem że są te komponenty z shell ale mi nie pasują). Oto kod procedury wyszukującej katalogi i pliki: procedure ListujKatalogi(tnRodzic : TTreeNode; Sciezka : string); {Metoda falenicka} var sr : TSearchRec; Wynik : integer; tnDziecko : TTreeNode; begin Wynik := FindFirst(Sciezka + '*.*', faAnyFile, sr); {faAnyFile} {czytamy pierwszy plik_katalog} while Wynik = 0 do{jesli funkcja cos znalazla(wynik=0) rob} begin if (sr.Name <> '.')and(sr.Name <> '..') then {jezeli jest to katalog} begin{dopisujemy do drzewka} tnDziecko := Form1.TreeView1.Items.AddChild(tnRodzic, sr.Name); {dopisujemy katalog jako podrzedny} ListujKatalogi(tnDziecko ,Sciezka + sr.Name + '\'); {TO JEST TO WYWOLANIE REKURENCYJNE KTORE CZYTA NASTEPNE KATALOGI} {wywolujemy rekeurncyjnie metode, jako kat. nadrzedny bedzie teraz ostatnio znaleziony kat.} end; Wynik := FindNext(sr); {szukamy nastepnych} end; FindClose(sr); {zwalniamy pamiec} if tnRodzic = Nil then else {tnRodzic.AlphaSort; } end; Jest to kod zaczerpnięty z neta ale działa z tym że przeszukuje od razu po wyborze dysku wszystkie katalogi i zajmuje to strasznie duzo czasu zanim to wyszuka(okolo 30 -40 sekund) i zapisze w TreeView.Pytanie mam takie : w jaki sposób przerobić procedurę aby wyszukiwała kolejne "zagłębione" katalogi dopiero po kliknięciu w wybrany katalog (czyli jesli mam 3 foldery A,B,C to gdy klikne dajmy na to B to dopiero przeszukuje mi ten folder i dopiero teraz zapisuje jego zawartosc do treeview np na glebokosc 3 katalogow).Drugie pytanie to: jeśli zaznaczę jakiś plik w tym drzewie myszką to jak mam to oprogramować? np chce zrobic cos takiego ze jak zaznaczę plik to mi wysle jego sciezke do jakiegos stringa/PChara zebym mogl operować na tym pliku. Bardzo chętnie przyjmę jakiekolwiek rady
-
No teraz wiem jaki to błąd ale nie mam pojęcia jak to zrobić .
-
Exited with Exitcode = 216 To mi wywala.I Bóg jeden wie co mam źle wiem że wina leży po mojej stronie ale nie mam pojęcia jak to wykminić.
-
Witam, mam program który tworzy liste w TP ale gdy chce napisać procedure która dodaje element na końcu tej listy to podczas działania programu oczywiście się wysypuje Czy ktoś mógłby spróbować mi pomóc? Oto kod tego programu : (Chodzi mi dokładniej o sama procedurę "DodajZa") program CerateList; uses crt; TYPE PElem = ^TElem; TElem = RECORD dane : integer; wsk :PElem; END; VAR q,poczatek,glowa,temp:PElem; licz,k:integer; procedure ListCreate(var pocz:PElem; var k:integer); {tworzenie listy} var q:PElem; n:integer; begin write('Podaj dlugosc listy (0<n<100) n='); readln(n); k:=n; pocz:=nil; WHILE n>0 DO BEGIN new(q); q^.wsk:=pocz; pocz:=q; pocz^.dane:=n; n:=n-1; END; end; procedure ListAdd(var pocz:PElem;var n:integer); var k:integer; q:PElem; begin write('Podaj wartosc dadawanego elementu na poczatek listy k='); readln(k); new(q); q^.wsk:=pocz; pocz:=q; pocz^.dane:=k; n:=n+1; end; Procedure DodajZa(var n:integer; var koniec:PElem); {To ta zla procedura} Var q:PElem; k:integer; Begin write('Podaj wartosc dodawanego elementu na koncu listy '); readln(k); new(q); {tworzenie nowego elementu} q^.wsk:=nil; {wsk na NIL} while koniec<>NIL do {przeszukuje dopoki nie znajdzie konca listy} koniec:= koniec^.wsk; q:=koniec; {koniec powinien wskazywac na q-ktory staje sie teraz nowym koncem} koniec^.dane:=k; n:=n+1; End; procedure ListWrite(pocz:PElem); {wypisywanie listy} begin writeln; WHILE pocz<>NIL DO BEGIN q:=pocz; write(' ',q^.dane); pocz:=q^.wsk; END; end; function ListSearch(head:PElem;k:integer):PElem; {funkcja sekwencyjnie przeglada Liste zlozona z elementow typu TElem} {w poszukiwaniu wartosci pola dane = k, wynikiem funkcji jest: } { wskaznik do elementu, w ktorym przechowywane jest k} {lub wskaznik pusty, gdy taki element nie istnieje} begin while (head <> nil) and (k <> head^.dane) do head := head^.wsk; ListSearch := head; end; Begin clrscr; ListCreate(poczatek,licz); writeln('!!!! uwaga !!!',licz); {dopisywanie elementu na poczatek listy} {ListAdd(poczatek,licz);} glowa:=poczatek; DodajZa(licz,poczatek); {wypisywanie listy} ListWrite(poczatek); {wyszukiwanie elementu z listy} writeln; write('Poszukiwany element dane=' );readln(k); temp:=ListSearch(glowa,k); IF temp<>NIL THEN writeln('Znaleziona dana = ',temp^.dane) ELSE writeln('Nie znaleziono wartosci ',k); readln; End.