Ĺadny brzuch
Witam. Piszę tu gdyż od paru tygodni nęka mnie błąd Access Violation.
Opiszę sytuację:
Forma - zarządzanie wtyczkami dll
Wszystkie wtyczki (informacje o nich) są wyświetlane na TScrollBox1 jako osobne TPanel. Na każdym TPanel jest TButton, który kasuje wtyczkę.
Kasując wtyczkę procedura pobiera plik z tablicy wtyczek (Nazwa, uchwyt, stan (zał / wył)) następnie zwalnia biblioteke przez FreeLibrary i usuwa plik z dysku.
Po całej operacji następuje odwołanie do SpeedButton2.Click - czyli przycisk z napisem odśwież.
jego zadaniem jest zwolnić ScrollBox'a i utworzyć go ponownie, a potem wczytać ponownie wtyczki.
I jestem w 100% pewien, że błąd powoduje własnie ta operacja na ScrollBox:
ScrollBox1.Free; with TScrollBox.Create(weps) do begin Parent:= weps; Align:= alNone; AutoScroll:= True; AutoSize:= False; BorderStyle:=bsNone; Name:= 'ScrollBox1'; TabOrder:=2; Left:=8; Top:=72; Width:=630; Height:=210; Visible:=True; end; Sleep(1000); Application.ProcessMessages; Found := FindFirst(ExtractFilePath(Application.ExeName)+'Plugins\*.*', faAnyFile, SR); while (Found = 0) do begin Found := FindNext(SR); end;
zakomentowałem CAŁY KOD procedury odswiezajacej. SpeedButton2.Click. zostało tylko to co widać i teraz zonk. Jeśli zakomentuję jeszcze te operacje na ScrollBox
wszystko jest ok, ale jeżeli je pozostawie to następna część dziwnie się zachowuje. Procecdura się wykona i i tak wywali błąd. Nawet nie wiem gdzie.
Proceduraa kasująca:
DLLs[StrToInt(s)].Status:= False; try FreeLibrary(DLLs[StrToInt(s)].Uchwyt); except end; if DeleteFile(DLLS[StrToInt(s)].plik) then Application.MessageBox(PChar(Komunikat(9)), PChar(Application.Title), MB_ICONWARNING or MB_OK or MB_SYSTEMMODAL) else Application.MessageBox(PChar(Komunikat(10)), PChar(Application.Title), MB_OK or MB_ICONWARNING or MB_SYSTEMMODAL); break; //zatrzymanie pętli po usunięiu pluginu end; ShowMessage('L'); SpeedButton2.Click; ShowMessage('M'); except end; end;
Komunikat 'L' pokazuje się. 'M' też. Błąd AccessViolation również. Tuż po komunikacie 'M'.
Ktoś wie o co w tym może chodzić?
Użytkownik DJ Mentos edytował ten post 12 grudzień 2008, 14:15
hmm, a czemu zwalniasz ScrollBox'a a potem tworzysz go na nowo, nie wystarczy ScrollBox.Refresh albo Application.ProcessMessages?
ach. zapomniałem napisać o tym. :)
zwalniam go ponieważ chcę go oczyścić ze wszystkich TPanel, które sie na nim znajdują
Użytkownik DJ Mentos edytował ten post 12 grudzień 2008, 16:41
słyszałeś o breakpointach? :)
Ustaw sobie breakpoint'a na linijce ze ScrollBox1.Free; i zobacz krok po kroku co się dzieje w programie :)
dzięki za porade. co prawda trudno było ale doszedłem do tego, że wszystko powoduje TXPMenu.
tylko czemu? 0_o
Właściwie czepia się obojętnie czego. Bo czy ja dam to ScrollBox.Free czy ja w pętli usune wszystkie komponenty to i tak potem wywali ten błąd.
A żeby ciekawiej było - jeśli liczba paneli nie jest większa niz 2 to wszystko jest w porządku xD
Jakieś sugestie?
Użytkownik DJ Mentos edytował ten post 12 grudzień 2008, 18:50
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Opiszę sytuację:
Forma - zarządzanie wtyczkami dll
Wszystkie wtyczki (informacje o nich) są wyświetlane na TScrollBox1 jako osobne TPanel. Na każdym TPanel jest TButton, który kasuje wtyczkę.
Kasując wtyczkę procedura pobiera plik z tablicy wtyczek (Nazwa, uchwyt, stan (zał / wył)) następnie zwalnia biblioteke przez FreeLibrary i usuwa plik z dysku.
Po całej operacji następuje odwołanie do SpeedButton2.Click - czyli przycisk z napisem odśwież.
jego zadaniem jest zwolnić ScrollBox'a i utworzyć go ponownie, a potem wczytać ponownie wtyczki.
I jestem w 100% pewien, że błąd powoduje własnie ta operacja na ScrollBox:
ScrollBox1.Free; with TScrollBox.Create(weps) do begin Parent:= weps; Align:= alNone; AutoScroll:= True; AutoSize:= False; BorderStyle:=bsNone; Name:= 'ScrollBox1'; TabOrder:=2; Left:=8; Top:=72; Width:=630; Height:=210; Visible:=True; end; Sleep(1000); Application.ProcessMessages; Found := FindFirst(ExtractFilePath(Application.ExeName)+'Plugins\*.*', faAnyFile, SR); while (Found = 0) do begin Found := FindNext(SR); end;
zakomentowałem CAŁY KOD procedury odswiezajacej. SpeedButton2.Click. zostało tylko to co widać i teraz zonk. Jeśli zakomentuję jeszcze te operacje na ScrollBox
wszystko jest ok, ale jeżeli je pozostawie to następna część dziwnie się zachowuje. Procecdura się wykona i i tak wywali błąd. Nawet nie wiem gdzie.
Proceduraa kasująca:
DLLs[StrToInt(s)].Status:= False; try FreeLibrary(DLLs[StrToInt(s)].Uchwyt); except end; if DeleteFile(DLLS[StrToInt(s)].plik) then Application.MessageBox(PChar(Komunikat(9)), PChar(Application.Title), MB_ICONWARNING or MB_OK or MB_SYSTEMMODAL) else Application.MessageBox(PChar(Komunikat(10)), PChar(Application.Title), MB_OK or MB_ICONWARNING or MB_SYSTEMMODAL); break; //zatrzymanie pętli po usunięiu pluginu end; ShowMessage('L'); SpeedButton2.Click; ShowMessage('M'); except end; end;
Komunikat 'L' pokazuje się. 'M' też. Błąd AccessViolation również. Tuż po komunikacie 'M'.
Ktoś wie o co w tym może chodzić?
Użytkownik DJ Mentos edytował ten post 12 grudzień 2008, 14:15
hmm, a czemu zwalniasz ScrollBox'a a potem tworzysz go na nowo, nie wystarczy ScrollBox.Refresh albo Application.ProcessMessages?
ach. zapomniałem napisać o tym. :)
zwalniam go ponieważ chcę go oczyścić ze wszystkich TPanel, które sie na nim znajdują
Użytkownik DJ Mentos edytował ten post 12 grudzień 2008, 16:41
słyszałeś o breakpointach? :)
Ustaw sobie breakpoint'a na linijce ze ScrollBox1.Free; i zobacz krok po kroku co się dzieje w programie :)
dzięki za porade. co prawda trudno było ale doszedłem do tego, że wszystko powoduje TXPMenu.
tylko czemu? 0_o
Właściwie czepia się obojętnie czego. Bo czy ja dam to ScrollBox.Free czy ja w pętli usune wszystkie komponenty to i tak potem wywali ten błąd.
A żeby ciekawiej było - jeśli liczba paneli nie jest większa niz 2 to wszystko jest w porządku xD
Jakieś sugestie?
Użytkownik DJ Mentos edytował ten post 12 grudzień 2008, 18:50