Skocz do zawartości
Forum komputerowe PC Centre

kamil274

Użytkownicy
  • Zawartość

    5
  • Rejestracja

  • Ostatnia wizyta

Reputacja

0 Neutralny

O kamil274

  • Tytuł
    Jestem tu nowy
  1. 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
  2. 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
  3. kamil274

    [Turbo Pascal] Listy

    No teraz wiem jaki to błąd ale nie mam pojęcia jak to zrobić .
  4. kamil274

    [Turbo Pascal] Listy

    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ć.
  5. 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.
×
×
  • Dodaj nową pozycję...