Katalog program

0

ten program ktory jest umieszczony nie dziala pod XP albo pod delphi 6 w kazdym badz razie jak chce plik zapisac do wyskakuje mi błąd

&gt&gt

tu &gt FName := Add(ListView.Items.Item[i].Caption, 20);
albo tu &gt FSize := Add(ListView.Items.Item[i].SubItems[0], 10);
albo tu &gt FAttr := Add(ListView.Items.Item[i].SubItems[1], 20);

&lt&lt

a blad ma tresc mniej wiecej

"project katalog.exe. raised exception class EAccesViolation with message ' acces violation at adres
004650FC in module "katalog.exe'. Read of adress 00000024 Process stoped use step or run to continue
"

uff koniec---= pozdrawiam Oskar =-

0

czy ash takie trudne pytanie zadałem ?---= pozdrawiam Oskar =-

0

Sprobuj jeszcze cos uscislic. Moze jestem za glupi, ale nie rozumiem, co oznaczaja liczby 20, 10, 20 w Twoim kodzie. W ogole to nie spotkalem sie z takim sposobem wypelniania listy. Ja to robie np. tak:

var
i,j:integer;
item:TListItem;

[...]

for i:=0 to 5 do
begin
item:=ListView1.Items.Add;
if i=3 then item.Caption:='Red' else item.Caption:='ble';
for j:=0 to 2 do
if j=1 then item.SubItems.Add('Red') else item.SubItems.Add('ble');
end;

i dziala.

Aha, jakiego typu sa FName, FSize, Fattr?--Pawel

Delphi6

0

moze ja całośc podam

unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ToolWin, ActiveX, ShlObj, ImgList;

type
TMainForm = class(TForm)
ListView: TListView;
tbTools: TToolBar;
tlbOpen: TToolButton;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
tlbSave: TToolButton;
ImageList1: TImageList;
procedure tlbOpenClick(Sender: TObject);
procedure tlbSaveClick(Sender: TObject);
private
procedure Find(const Path : String);
function FileAttr(Attr : WIN32_FIND_DATA) : String;
end;

var
MainForm: TMainForm;
Dir : String;

implementation

{$R *.DFM}

procedure TMainForm.Find(const Path: String);
var
Found : Integer;
SR : TSearchRec;
ListItem : TListItem;
begin
{
Funkcja wyszukuje wszystkie pliki zawarte w katalogu okreslonym poprzez
parametr Path. Nastepnie znaleziony plik wraz z nazwa oraz atrybutem
dodaje do komponentu ListView.
}
Found := FindFirst(Path + '*.*', faAnyFile+faHidden+faSysFile+faReadOnly, SR);
while (Found = 0) do
begin
ListItem := ListView.Items.Add;
ListItem.Caption := LowerCase(SR.Name); * nazwa
{ Pobiera rozmiar i dzieli go przez 1024 otrzymujac ilosc kilobajtow }
ListItem.SubItems.Add(FloatToStr(SR.Size div 1024) + ' kB');
ListItem.SubItems.Add(FileAttr(SR.FindData)); * dodaj artybut poprzez wywolanie funkcji

Found := FindNext(SR); * szukaj dalej

end;
FindClose(SR); * zakoncz przeszukiwanie
end;

function TMainForm.FileAttr(Attr: WIN32_FIND_DATA): String;
begin
{
Funkcja parametr podany w nawiasie przeksztalca na
wartosc opisowa. Jezeli atrybutu nie mozna okreslic to zwraca
stosowny tekst.
}
case Attr.dwFileAttributes of
FILE_ATTRIBUTE_ARCHIVE : Result := 'Plik archiwalny';
FILE_ATTRIBUTE_COMPRESSED : Result := 'Plik skompresowany';
FILE_ATTRIBUTE_HIDDEN : Result := 'Plik ukryty';
FILE_ATTRIBUTE_READONLY : Result := 'Plik do odczytu';
FILE_ATTRIBUTE_SYSTEM : Result := 'Plik systemowy';
FILE_ATTRIBUTE_NORMAL : Result := 'Brak atrybutu';
else Result := 'Nie można określić';
end;
end;

procedure TMainForm.tlbOpenClick(Sender: TObject);
var BI:TBrowseInfo;
Dirs,Root:PItemIDList;
Alloc:IMalloc;
Buf : PChar;
begin

  • Pobieramy obiekt zarządzający pamięcią
    SHGetMalloc(Alloc);

  • Przydzielamy pamięć na string
    Buf:=Alloc.Alloc(Max_Path);

  • Ograniczamy wybór tylko do katalogu "Menu Start\Programs"
    SHGetSpecialFolderLocation(Handle,CSIDL_DESKTOP,Root);

with BI do
begin
hwndOwner:= Handle;
pidlRoot:=Root; * Tu można podać NIL żeby można było wybrać każdy katalog
pszDisplayName:=Buf;
lpszTitle:='Wybierz katalog'; * Etykietka przed listą katalogów
ulFlags:=0;
lpfn:=nil;
end;

try
Dirs:=SHBrowseForFolder(BI);
if Dirs&lt&gtNil then
begin

  • Pobieramy pełną ścieżkę do katalogu
    SHGetPathFromIDList(Dirs ,Buf);
  • Przykładowe zastosowanie
    Find(Buf);
    Dir := Buf;
    Alloc.Free(Dirs);
    end;
    finally
    Alloc.Free(Root);
    Alloc.Free(Buf);
    end;
    end;

procedure TMainForm.tlbSaveClick(Sender: TObject);
var
TF : TextFile;
FName, FAttr : String[20]; * na te pola przydziel max. 20 znakow
FSize : String[10]; * na te pole przydziel 10 znakow.
I : Integer;

function Add(sText : String; Index : Integer) : String;
var iLen : Integer;
begin
{
Jezeli tekst podany w parametrze sText jest krotszy niz wartosc
podana jako Index to do tej zmiennej dodawane sa spacje i zwracana
jest nowa zmienna.
}
iLen := Length(sText); * okresl dlugosc zmiennej
if iLen &lt Index then * Jezeli jest krotsza niz wartosc Index...
begin
repeat
Application.ProcessMessages;
iLen := Length(sText); * pobierz tekst jeszcze raz...
Insert(' ', sText, iLen + 1); * wstaw na koncu spacje
until iLen = 20; * kontynuuj dopoki zmienna nie osiagnie wartosc 20
end;
Result := sText; * zwroc nowa wartosc
end;

begin
if SaveDialog.Execute then * wywolaj okno
begin
AssignFile(TF, SaveDialog.FileName);
Rewrite(TF); * stworz okno

try

  Writeln(TF, 'Plik wygenerowany automatycznie w dniu: ' + DateToStr(Date));
  Writeln(TF, 'Oto zawartość katalogu: ' + Dir);
  Writeln(TF, `);
  Writeln(TF, ' |  Nazwa pliku           |  Rozmiar     |  Atrybut pliku         |');
  Writeln(TF, ' |------------------------|--------------|------------------------|');

  For I := 0 to ListView.Items.Count do
  begin

{
Przypisz zmiennym wartosc poszczegolnych kolumn z komponentu ListView
}
FName := Add(ListView.Items.Item[i].Caption, 20);
FSize := Add(ListView.Items.Item[i].SubItems[0], 10);
FAttr := Add(ListView.Items.Item[i].SubItems[1], 20);

    Writeln(TF, ' |  ' + FName +  '  |  ' + FSize + '  |  ' + FAttr + '  |  ');
  end;

  Writeln(TF, `);
  Writeln(TF, '  |  W sumie plików:  ' + IntToStr(ListView.Items.Count));

except
  CloseFile(TF);
  Exit; * w przypadku bledu - nie rob nic...
end;
CloseFile(TF); * zamknij plik

end;
end;

end.

(autor Adam Boduch )---= pozdrawiam Oskar =-

0

Bardzo pomoglo, pojalem ze Add to Twoja wlasna funkcja, i ze nie zapisujesz do ListView w jakis nieznany mi sposob, ale z niego czytasz!

Nie ukrywam ze miejscami programik przerasta moja znajomosc Delphi (a raczej Windows API), lecz natknalem sie na miejsce, ktore budzi moja watpliwosc:

W funkcji Add jest:

iLen := Length(sText); * okresl dlugosc zmiennej
if iLen &lt Index then * Jezeli jest krotsza niz wartosc Index...
begin
repeat
Application.ProcessMessages;
iLen := Length(sText); * pobierz tekst jeszcze raz...
Insert(' ', sText, iLen + 1); * wstaw na koncu spacje
until iLen = 20; // kontynuuj dopoki zmienna nie osiagnie wartosc 20
end;

czy przypadkiem nie powinno byc:
until iLen = Index;

Pozdarwiam,

pawel--Pawel

Delphi6

0

hmm zaraz przerobie i sprawdze---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

No ciekawe czy trafilem. --Pawel

Delphi6

0

dupa nic to nie zmienia nadal ten sam blad i nie wiem od czego, moze jest jakis prostrzy sposob
na zrobienie tego programu
???---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

No to chyba dorwalem pluskwe! (Hi, hi, optymista ze mnie)

zamiast:

For I := 0 to ListView.Items.Count do
begin
{
Przypisz zmiennym wartosc poszczegolnych kolumn z komponentu ListView
}
FName := Add(ListView.Items.Item[i].Caption, 20);
FSize := Add(ListView.Items.Item[i].SubItems[0], 10);
FAttr := Add(ListView.Items.Item[i].SubItems[1], 20);
itd..

daj:

For I:=0 to Pred(ListView.Items.Count) do itd...

Itemy sa numerowane od zera wiec ostatni ma numer Count-1

--Pawel

Delphi6

0

Ale moja poprzednia poprawka tez ma sens, chociaz akurat w przypadku krotkich lancuchow (String[x]) nie powoduje bledu. Zwroc uwage, ze przy normalnych stringach kazdy mialby dlugosc 20 niezaleznie od wartosci Index

Pozdrawiam--Pawel

Delphi6

0

dzieki moze sobie poradze mma taka nadzieje a jak nie to zaraz sie z krzykiem znowu odezwie :)---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

dobra z tego wzgledu ze jestem troche wiecej nish poczatkujacy ale ciagle malo to mam pytan kilka
co oznacza

  1. Pred(ListView.Items.Count

  2. samo "item" ktore w wielu miejscach wystepuje

  3. until

  4. Application.ProcessMessages;

  5. Alloc.Free(Root);
    Alloc.Free(Buf);

  6. co to jest NIL

  7. jak w tym programiku pliki byly wyswietlone ale wraz z takalogami w formie drzewa lub cokolwiek i jak je do html zapisac

---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

Chyba powinienes poczytac troche :))) . Ksiazki madre i help do Delphi, ktory jest nienajgorszy. Mozesz najechac kursorem na nazwe w kodzie programu i nacisnac F1. Zapewne czegos sie dowiesz wtedy.

  1. Pred(ListView.Items.Count)

ListView.Items.Count to liczba itemow na liscie ListView

Pred(x)=x-1 ( a Succ(x)=x+1 )

  1. W ListView znajduja sie pewne rzeczy. Items to lista tych rzeczy. Odwolanie do tych rzeczy uzyskuje sie np ListView.Items.Item[x].Caption co oznacza nazwa, napis {Caption} przedmiotu {Item} numer x listy {Items} obiektu ListView.

Item moze posiadac SubItemy (dodatkowe stringi) ListView.Items.Item[x].SubItem[y] to odwolanie do 'pod-przedmiotu' numer y Itemu numer x ... itd. Wazne; zarowno liczenie Itemow jak i SubItemow zaczyna sie od zera. czyli jesli jest 5 Itemow to pierwszy ma numer 0 a ostatni ma numer 4. To w Delphi dotyczy wielu rzeczy, stad przydatnosc funkcji Pred i Succ

Items w ogole wystepuja nie tylko w ListView...

  1. repeat..until to jedna z petli pascala i oznacza powtarzaj...az

np

repeat
inc(x);
inc(y);
until x+y&gt10

bedzie tak dlugo zwiekszal wartosc x i y az ich suma przekroczy 10

inne petle to (przyklady)

while x+y&lt0 do
begin
inc(x);
inc(y);
end;

petle te sa dosc podobne ale maja zasadnicza roznice. repeat until spawdza warunek po petli a while do przed petla. Czyli jesli x+y na poczatku jest &gt10 to petla repeat..until bedzie wykonana raz, a while..do ani razu.

Inna petla to

for zmienna:=a to b do (lub a downto b)

  1. Waznym elementem Windows sa komunikaty (messages). M.in. Windows wysyla komunikaty do aplikacji nakazujac jej zrobic to czy owo, np wyswietlic(odswiezyc) to co powinno byc wyswietlone.

Application.ProcessMessages nakazuje aplikacji odebrac i prztworzyc wszystkie czekajace przeznaczone dla niej komunikaty zanim pojdzie dalej.

  1. Kwestie Alloc.Free juz mnie troche przerastaja. generalnie Free to polecenie zwolnienia (skasowania) uprzednio utworzonego obiektu. O szczegoly Alloc i roznych dziwnych rzeczy w okolicy (np SHGetSpecialFolderLocation(Handle,CSIDL_DESKTOP,Root); ) to juz pytaj kogo innego. Na moje oko dotyczy to bezposredniego wywolywania funkcji Windows.

  2. wskaznik do czegos jest to mniej wiecej adres czegos (np zmiennej, bufora, obiektu). W wielu sytuacjach, czesto np w funkcjach Windows zeby odwolywac sie do np zmiennych uzywa sie wskaznikow do tych zmiennych a nie samych zmiennych. wskaznikami sa tez o ile pamietam stringi (zwykle a nie string[2]), oraz obiekty.

Do rzeczy: nil to wskaznik pusty, czyli nic nie wskazujacy.

  1. nie mam juz sily analizowac tego programu... moze innym razem. a html'a znam nader pobieznie.

--Pawel

Delphi6

0

Jeszcze do ad2

Jesli ListView jest ustawiona jako report (tzn. wlasciwosc ViewStyle obiektu ListView jest ustawiona na vsReport). Wtedy w kolumnie pierwszej ListView sa Captiony Itemow, a w kolejnych kolumnach kolejne SubItemy tych Itemow. Przykladem uzycia ListView jest wyswietlanie folderow i plikow w Windows, gdzie wlasciwosc vsReport odpowiada View|Details--Pawel

Delphi6

0

dzieki zbawco troche to mi to usiwadomilo pare zeczy
no ale pewnie jeszcze cos tam znajde
---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

Ciesze sie. Ja tez jestem dosc swiezy w temacie Delphi ale cos niecos juz lyknalem.

Moje zrodla to:

  1. Reisdorph. Delphi 6 dla kazdego. Helion - bardzo przystepna, troche za bardzo nawet.
  2. Lischner. Delphi. Almanach. tez Helion. bardzo specjalistyczna, zorientowana glownie na Object Pascala a nie na rzeczy specyficzne dla Delphi (VCL).
  3. Delphi Help - mnostwo informacji, choc czasem trudno do niektorych dotrzec.

To na razie, dobranoc!!--Pawel

Delphi6

0

moj angielski kuleje wiec delphi help odpada ---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

No to zdecydowanie sugeruje podszkolenie w angielskim. Znajomosc tego jezyka otworzy przed Toba nie tylko dostep do helpu delphi ale tez do wielu innych cennych zrodel informacji. Jak mawia moj kumpel, kiedy go pytam o cos w Delphi: wlacz Google'a i sprawdz. I ma racje, w Delphi pisza tysiace ludzi i malo prawdopodobne jest zeby ktos juz kiedys nie mial takiego problemu jak ja. Zwykle ktos zapytal o niego na jakiejs grupie dyskusyjnej i otrzymal jakas odpowiedz. No a wiekszosc tych grup jest in English..--Pawel

Delphi6

0

angielskiego mnie nie ucza a na kursy mnie nie stac moze jakos pozniej cos sie wymysli
---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

1 użytkowników online, w tym zalogowanych: 0, gości: 1