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

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