Blad w watku....

0

Mam problem z programem szukajacym plikow na kompie. W zaznaczonej linijce. Jezeli ja wywale to program dziala jak powinien ale jezeli ona jest wywala blad: Acces violation..... itp.itd. Nie wiem dlaczego??

#####################################################

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FileCtrl, ComCtrls, PathTreeView, XPMan, ImgList;

type
TForm1 = class(TForm)
lpliki: TListBox;
dyski: TDriveComboBox;
Button1: TButton;
XPManifest1: TXPManifest;
tree: TPathTreeView;
ImageList1: TImageList;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

function kropki(l:int64):string;
var qq,w:string;
a,s:word;
begin
str(l,qq);
str(l,w);
a:=length(qq) div 3;
for s:=1 to a do insert('.',w,length(qq)-(3*s)+1);
if w[1]='.' then delete(w,1,1);
if (w[1]='-')and(w[2]='.') then delete(w,2,1);
kropki:=w;
end;

function ist(co,gdzie:string):boolean;
var q:word;
begin
for q:=1 to Length(co) do co[q]:=upcase(co[q]);
for q:=1 to Length(gdzie) do gdzie[q]:=upcase(gdzie[q]);
if pos(co,gdzie)>0 then ist:=true else ist:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Pliki2 : TThread;
begin
setlength(unit2.foldery,1);
unit2.foldery[0]:=dyski.Drive+':';
Pliki2 := Pliki.Create(FALSE);
end;

end.

#####################################################

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FileCtrl;

type
Pliki = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

type tablica=array of string;
var foldery:tablica;

implementation

uses Unit1;

procedure Pliki.Execute;
var q,w,e,r,t,y,u,i,o,p:longint;
dl,teraz,blad:longint;
sciezka:string;
plik:tsearchrec;
attrs:integer;
begin
//thread
teraz:=0;
dl:=length(foldery);
{1}while teraz<=dl do begin

sciezka:=foldery[teraz];

blad:=findfirst(sciezka+'.',Faanyfile,plik);
{2}if blad=0 then while blad=0 do begin
{4}if (plik.Name<>'.')and(plik.Name<>'..') then begin
Attrs := FileGetAttr(sciezka+plik.Name);
{5}if Attrs and faDirectory <> 0 then begin
setlength(foldery,dl+1);
foldery[dl+1]:=sciezka+plik.Name+'';
dl:=length(foldery);
{5}end else begin
{form1.lpliki.Items.Append(sciezka+plik.Name);}
form1.tree.DestPath:=sciezka+plik.Name;
form1.tree.AddPath;
end;
{4}end;
blad:=findnext(plik);
{2}end;
teraz:=teraz+1;
{1}end;

end;

end.

0

Ja mam taki sam błąd tylko w programie do stron internetowych jak zrobi za dużo nowych zakładek z dokumentem to ten sam błąd sie mi sypie

0

while teraz<=dl do begin
sciezka:=foldery[teraz];
...

To dlatego, że Length zwaraca ILOŚĆ elementów tablicy, ale one są numerowane od zera, więc indeks ostatniego to dl-1. Zatem:

while teraz<dl do begin
...</quote>

A tak nawiasem mówiąc, Access Violation to błąd dostępu - czyli powstaje wtedy, kiedy program odwołuje się do czegoś, co nie istnieje. Przykłady: odwołanie się do szóstego elementu tablicy pięcioelementowej, lub użycie jakiejś klasy bez uprzedniego użycia konstruktora.

0

A tak nawiasem mówiąc, Access Violation to błąd dostępu - czyli powstaje wtedy, kiedy program odwołuje się do czegoś, co nie istnieje. Przykłady: odwołanie się do szóstego elementu tablicy pięcioelementowej, lub użycie jakiejś klasy bez uprzedniego użycia konstruktora.

Wiem co to jest ale nawet po zmianie tego co napisales dalej sie pojawia. Moze zle sie odwoluje do dynamicznej tablicy? Albo jeszcze cos innego?

0

Ej, ej! A przypadkiem nie tu:

foldery[dl+1]:=sciezka+plik.Name+''; //???

Myślę, że tak byłoby lepiej:

foldery[dl]:= ...

Chyba po prostu zapominasz o tej ilości elementów i najwyższym indeksie. Ja, żeby się nie mylić, używam jeszcze funkcji High - indeks ostatniego elementu tablicy.

I wtedy np.
SetLength(T,Length(T)+1);
T[High(T)] := ...

Rzadziej się wtedy mylę.

0

Ej, ej! A przypadkiem nie tu:

foldery[dl+1]:=sciezka+plik.Name+''; //???

Myślę, że tak byłoby lepiej:

foldery[dl]:= ...

To zalatwilo sprawe...
!!! DZIEKI !!!

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