[Delphi] gupkowaty blad acess violation z ktorego nic nei ka

0

mam DirList i po kazdym uaktualnieniu w listView przeszukuje on dany katalog w poszukiwaniu plikow o rozszerzeniu podanym pon izej

jednak po kilkukrotnym kliknieciu program mi sie zawiesza .

i wyskakuije blad:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress BFF7B997 in module KERNEL32.DLL'. Write of adress 00430F24. Process stopped. Use step or Run to continue

co robic?

czy nienalezy zwolnic pamieci poprzez DirList.Free; ?

0

Free usuwa komponent z pamięci. Wywołuj dopiero wtedy, gdy nie będziesz już z niego korzystał.

0

aha a co zrobic zeby ten gupkowaty blad sie nie pojawial?

0

Prześlij fragment, gdzie Ci błąd wywala.

0

ale to nie w kodzie mi wyskakuje blad tylko podczas dzialania programu

0

Mam przeczucie że DirList.Free wsadziłeś w OnChange tego komponentu lun innym iego zdarzeniu, tego absolutnie nie możesz robić.

PS:
skróć swoją sygnaturkę, trochę mine już męczy wyławianie treści posta.

0

oto kod procedury otworz, ktora wyszukuje pliki o rozszerzeniu podanym w polu Edit o nazwie Maska

procedure TFormOtworz.Otworz(Dir, Maska: String);
var
SR : TSearchRec; // rekord
List : TListItem; // pozycja w ListView
Found : Integer; // zmienna oznacza ilosc znalezionych plikow
I : WORD;
Icon : TIcon; // ikona
begin
I := 0;
ListView.Items.Clear;
Icon := TIcon.Create; // tworzy ikone danego pliku
Icon.Handle := ExtractAssociatedIcon(hInstance, PChar(Dir + '' + Maska), i);
ImageList1.InsertIcon(0, Icon); // dorzucamy ikonke
Found := FindFirst(Dir + '' + Maska, faAnyFile, SR);
while ( Found = 0) do
begin
List := ListView.items.Add;
List.Caption := Dir + '' + SR.Name; // pozycja
List.SubItems.Add(IntToStr(SR.Size) + 'bajtow');
List.ImageIndex := 0;
Found := FindNext(SR);
end;
FindClose(SR);

co w tym jest zle? ze sie wiesza po kilku wyszukaniach

0

A probowales skompilowac z ustawionym breakpointem na poczatku tej procedury.

Wtedy w momencie wykonywania sie programu z delphi przerwie jego wykonywanie gdy dotrze do tego breakpointu i naciskajac F7 bedziesz mogł wykonywać po jednej linijce naraz kiedy skonczys sprawdzac fragment nacisnij F9 aby program dalej pracowal znowu normalnie.

Istnieje tez cos takiego watch w menu run lub ctrl + F5 mozna za jego pomoca ogladac zawartosc zmiennych w trakcie pracy programu.

kiedy znajdziesz punkt gdzie program sie zawiesza pomyśl co dane polecenie wykonuje i czemu ono zawiesza wykonanie programu, ew. zamieść to w poście.

Powodzenia [cya]

0

wyskakuje przy tym:

procedure TFormOtworz.DirListChange(Sender: TObject);
begin
Otworz(DirList.Directory, Maska.Text);
end;

0

wyskakuje przy tym:

procedure TFormOtworz.DirListChange(Sender: TObject);
begin
Otworz(DirList.Directory, Maska.Text);
end;

Pozwol ze przytoczę mirekpil'a (patrz kilka postow wyzej

"

Mam przeczucie że DirList.Free wsadziłeś w OnChange tego komponentu lun innym iego zdarzeniu, tego absolutnie nie możesz robić.
"

a sądząc po tym co napisales to dokladnie zrobiles to czego nie powinienes czyli twoja procedurka wywoluje sie wywoluje sie w evencie OnChange. Nie wiem czemu tego nie mozna robic ale sproboj np zrobic cos takiego.

1)Zadeklaruj globalna zmienna typu boolean
2)wstaw timerka (zalozmy ze nazywa sie "Zmiana") ustaw mu interval na 1 ms, a enabled na false i przypisz procedurke jak nastepuje (wykonaj te czynnosci np w OnCreate formy):

[delphi]
procedure Wykonaj (Sender: Tobject);
begin
Zmiana.Enabled := False;
Otworz(DirList.Directory, Maska.Text);
end;
[/delphi]

  1. ostatnia rzecz jaka musisz zrobic to zmienic procedure onchange tak aby ustawiala enabled timera na true. Powinno pomoc.

Jeśli nie pomaga przeslij mi na maila caly program ([email protected]) a sproboje go poprawic tak aby dzialał. Pod dwonma warunkami: dobrze go skomentuj, i dobrze opisz co ma ten program wykonac.

0

jak zadeklarowac globalna zmienna?

oto kod programu:

unit Unit3;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl, ImgList, ComCtrls, ShellAPI, DBLookup, ExtCtrls;

type
TFormOtworz = class(TForm)
btnOtworz: TButton;
Drive: TDriveComboBox;
btnAnuluj: TButton;
DirList: TDirectoryListBox;
ListView: TListView;
ImageList1: TImageList;
Maska: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Zmiana: TTimer;
procedure btnAnulujClick(Sender: TObject);
procedure Otworz(Dir: String; Maska: String);
procedure DirListChange(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
FormOtworz: TFormOtworz;

implementation

uses Unit1;

{$R *.DFM}

procedure TFormOtworz.btnAnulujClick(Sender: TObject);
begin
Close;
end;

procedure TFormOtworz.Otworz(Dir, Maska: String);
var
SR : TSearchRec; // rekord
List : TListItem; // pozycja w ListView
Found : Integer; // zmienna oznacza ilosc znalezionych plikow
I : WORD;
Icon : TIcon; // ikona
begin
I := 0;
ListView.Items.Clear;
Icon := TIcon.Create; // tworzy ikone danego pliku
Icon.Handle := ExtractAssociatedIcon(hInstance, PChar(Dir + '' + Maska), i);
ImageList1.InsertIcon(0, Icon); // dorzucamy ikonke
Found := FindFirst(Dir + '' + Maska, faAnyFile, SR);
while ( Found = 0) do
begin
List := ListView.items.Add;
List.Caption := Dir + '' + SR.Name; // pozycja
List.SubItems.Add(IntToStr(SR.Size) + 'bajtow');
List.ImageIndex := 0;
Found := FindNext(SR);
end;
FindClose(SR);

end;

end.

i teraz chce aby w komponencie ListView pokazywaly sie pliki o rozszerzeniu podnym w polu Edit o nazwie Maska. Gdy dalem event komponentu ListBox zeby je wyszukiwal po jazdej zmianie te pliki to po pewnym czasie sie program zawieszal :9

0

Jeśli znasz chociaż trochę angielski to korzystaj z pomocy. delphi dotepna pod klawiszem F1 jesli chcesz uzyskac pomoc dla klasy badz procedury istniejacej od momentu zainstalowania delphi. Aczkolwiek jesli masz wersję personal nie zawsze znajdziesz odpowiedz.

W każdym razie, globalna zmienna moźe być tuż pod deklaracja zmiennej twojej formatki w czesci interface:

unit TwojUnit

interface

Uses ToCzegoUzywaTwojProgram

Type
TTwojeInneTypy;

TTwojaJKlasaFormatki = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var //zmienne globalne
FormOtworz: TFormOtworz;
MojaZmiennaGlobalna: Boolean;

implementation

{$R *.dfm} //zerknij do pomocy pod haslo Resource file po wiecej informacji

end;

Gdybys zerknal do pomocy pod haslo Formal grammar uzysaklbys odpowiedz ktorej nie bede zalaczl bo jest zadluga.

Generalnie globalna zmienna to np zmienna do ktorej sie odwolujesz jesli chcesz miec dostep do formatki. Jest ona dostepna w calym programie ktory piszesz.

PS Mówiłem wyslij na maila ([email protected]) cały program co oznacza projekt, unit itd. Sam program oznacza ze musze recznie zrekonstruowac wyglad formatkui itp a nie mam na to czasu! [diabel]

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