Skocz do zawartości

[delphi]błąd przy "niszczeniu" komponentu


sazian

Polecane posty

stworzyłem sobie prostą klasę o nazwie TZaklatka na bazie komponentu TSpeedButton

w tej klasie dodałem drugi komponent TSpeedButton o nazwie p

po kliknięciu na przycisk(p), cały komponent (TZaklatka) ma zostać zniszczony (wywołanie procedury Free) i usunięty z listy(TList)

i wszystko nawet działa :)

tylko że nie zawsze <_>

czasem działa poprawnie a czasem wyskakuje piękny błąd

Schowek01.jpg

a oto fragmenty kodu

TZaklatka = class(TSpeedButton)
   p: TSpeedButton;
   fu[]^
[ĘN[XX]JSćW#D6ćVBfW'&FS&6VGW&RFVĆWFR6VćFW#D&(ą(Ń(ŃŃ((
constructor tzaklatka.Create(AOwner: TComponent);
begin
 i]YHYY]X]J[N]HYNvĆDg&fĆRb33ć&b33vGFŁ#!Ą(Q(=
ąŹąŃ(((ion := '';
 Height := 25;
end;

procedure Tzaklatka[]J[X
NY[YNLK[]J[^
ŚVćC&6VGW&RDf&ÓćFVĆWFRćFWFVvW\"f Ł)(ąąŃĄ((Ńźist.Count - 1 do
 begin


   TZaklatka(list.Items[j]).LeftHZ]J][JK]^
Z]J]V5śFWBb33b33GF7G\"b33b33ŹQiąŃĄą%Ńmt]Ń(QiąŃĄątems[j]).index := j;


 end;
end;

procedura jest na TForm1 żebym mógł wygodniej testować program

i co ciekawe

przy zewnętrznym(czyli poza tym komponentem) wywołaniu zawsze działa poprawnie

Link do komentarza
Udostępnij na innych stronach

nie no KKKas naprawdę bardzo pomocna odpowiedz :P

tylko że ja chciałem się dowiedzieć dlaczego (czasem) mi ten błąd wyskakuje i ewentualnie jak to naprawić

 

a poza tym co ty masz do mojego formatowania kodu ??

przecież jest bardzo czytelne

Chętnie bym Ci pomógł, ale przy takich losowych wcięciach nie mogę odczytać kodu.

 

Tutaj masz opis Borlanda jak powinno się formatować kod: http://dn.codegear.com/article/10280

҉

Link do komentarza
Udostępnij na innych stronach

Dla mnie ten sposób formatowania jest okropny, trudno wyodrębnić jakąś strukturę kodu, aż strach pomyśleć co się dzieje gdy masz 6 razy zagnieżdżone beginy i pętle.

Dla mnie dziwna jest ta zakładka, dziedziczy po TSpeedButton i sama ma go w sobie.

Kiedy zwalniasz p z TZakladka?

I Sposób użycia TList jest dla mnie dziwny, przecież tam wrzuca się Pointery

Baza tysięcy lotnisk: http://airportsbase.com

Link do komentarza
Udostępnij na innych stronach

CYTAT(Force @ pon, 27 sie 2007 - 20:25) Kiedy zwalniasz p z TZakladka?

 

no i tu jest problem :P

gdy probuje zwolnić "p" to zawsze krzyczy błędem

próbowałem tutaj Tzaklatka.delete

i w destruktorze Tzaklatka'ki

 

I Sposób użycia TList jest dla mnie dziwny, przecież tam wrzuca się Pointery

też sie zdziwiłem, ale działa :P

Link do komentarza
Udostępnij na innych stronach

skoro twierdzisz że to ma znaczenie

 z := Tzaklatka.Create(panel2);
 z.Parent := panel2;
 z.[H[[[^H[[^ĆVgBŁs6WEFWBb33ś'WGF#b33GFŃĄą
(Ź]Ń(ąĄ(^'jŹi(ui'
procedure TForm1.Button2Click(Sender: TObject);
begin
 tza]J][[
Y]K^
WJKYN[]JBVFCFWBŚVćC

to wszystkie zakładki posłusznie znikają

 

 

------------------

ostatnio zauważyłem że tylko obiekty które początkowo znajdują się na 3 pierwszych miejscach listy wywołują błąd

Link do komentarza
Udostępnij na innych stronach

jak ustawuiasz parenta to komponenty dodaja sie do jego listy.

Gdy parent ginie to niszczy swoje dzieci. W efekcie nastepuje podwojne kasowanie jednego elementu. Najpierw ty niszczysz w destruktorze a pozniej robi to parent.

 

Takie jest moje zdanie, ale zaznaczam ze na kod zerknalem tylko pobierznie bo jest obrzydliwy.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

ale zaznaczam ze na kod zerknalem tylko pobierznie bo jest obrzydliwy.

nikt nie chce czytać mojego kodu,

będę płakałplacze.GIF

 

a tak na serio

czyli jeśli dobrze zrozumiałem najpierw mam zwolnić rodzica przez parent:=nil; a później wywołać procedurę free ??

 

bo jeśli tak to nie pomogło ;)

 

jak sazian skopie kod to nic nie pomoże :P

 

PS. co wy chcecie od mojego kodu ??

Link do komentarza
Udostępnij na innych stronach

juz lepiej, ok popatrzmy.....

w constructor tzaklatka.Create(AOwner: TComponent);

tworzysz SpeedButona ktorego rodzicem bedzie twoj komponent, o ile sie nie myle jesli cos zniszczy twoj komponent to po wejsciu do inherited z destruktora zostanie wywolane niszczenie na twoim speed butonie

 

teraz w:

procedure Tzaklatka.delete(Sender: TObject);

kasujesz obiekt na ktorym wykonujesz delete ?

bo wywolanie samego free domyslnie bedzie na self.free....

czy to jest zamierzone ? jesli tak to strasznie dziwne

 

ogolnie ten kod jest od d*** strony robiony... Napisz moze jaka funkcjonalnosc chciales uzyskac bo zwatpilem jak to przeanalizowalem...

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

procedure Tzaklatka.delete(Sender: TObject);
begin
 Free;
LK[]J[^
N[

Najpierw zwalniasz objekt (Free), a później odwołujesz się do jego właściwości (Index). Prawdopodobnie przez to masz AV. Tego odwołania do formy w klasie to nawet nie próbuję zrozumiec ;-)

 

Btw. Nie ma to jak klasa z ortem, heh.

҉

Link do komentarza
Udostępnij na innych stronach

ogolnie ten kod jest od d*** strony robiony... Napisz moze jaka funkcjonalnosc chciales uzyskac bo zwatpilem jak to przeanalizowalem...

 

Mi się też tak wydaje. ;) Ja zrobiłbym to trochę inaczej. Przede wszystkim kosmetyczne zmiany:

TZaklatka = class(TSpeedButton)
public
 { Public declaratiBYY][^[Y^[\067G'V7F\"7&VFRvćW#D6ćVBfW'&FSgVćŃMŃQĄLMŃMŃ(ąŃĄMObject);
end;
+kjzĄśŚzzZaYHZ]K[]J[X
NY[YNf&ÓćFVĆWFRćFWŚVćC:'ęh)iźvę)dĄŹśśu--źśźm\",ĘŁĄhZx3jŚvZŚ)9Ą)ĄŃŃ(

 

Ja osobiście tak zrobiłbym. :)

Przy okazji, zmień nazwę tej klasy na TZakladka. :)

Link do komentarza
Udostępnij na innych stronach

FreeAndNil(p);
inherited Destroy();
vĄŚ)ąŃĄ)(

a ten błąd był spowodowany tym że próbowałem już chyba dosłownie wszystkiego i przerabiałem to we wszystkie strony

 

efekt ciągle jest ten sam

Napisz moze jaka funkcjonalnosc chciales uzyskac bo zwatpilem jak to przeanalizowalem...

chce żeby utworzyły się 2 komponenty TSpeedButton

po naciśnięciu jednego z nich (tego o nazwie p) cały komponent ma zostać zniszczony

Link do komentarza
Udostępnij na innych stronach

tak właśnie robie

kod po drobnych przeróbkach

 TZakladka = class(TSpeedButton)
 public
   p: TSpeedBut[^[Y^[YHEFWB37G&ćr67G'V7F\"7&VFRvćW#D6ćVB(ąŃĄMQ=(()structor tzakladka.Create(AOwner: TComponent);
begin
 inher]YHYY]X]J[N]HYNvĆDg&fĆRb33ć&b33vGFŁ#Ą(Q(=
ąŹąŃźź3;!!!!!

 caption := '';
 HeigHN[YHZYK[]J[X
Nf ŁFVvW#Ś&VvĆ7BFVĆWFRćFWrŁfŃźą
ź((QiąĄą%Ń[j]).Left := w;
   TZakladka(list.Items[j]).setText(TZakladJ][JK^
      NĘ   N
[H
      NĘI3rŁrEŚśĆFśĆ7BFV5śvGFEŚśĆĄą%Ńmt(((()(

Link do komentarza
Udostępnij na innych stronach

Zdaje się, że teraz to będzie działać. :) Chociaż ja jeszcze poprawiłbym dwie rzeczy:

 

1.)

for j := 0 to list.Count - 1 do
jŹiźŚzZaH[LHżmŚ(QiąĄą%Ńmt1(QiąĄątems[j]).setText(TZakladka(list.Items[j]).text + '(Ǝ
[H
      NĘINĘNH
ZYJ^V5śvGFEŚśĆFśĆ7BFV5śććFWŁŁĘł:hŚ,śŚ+ui'
list[j]

 

Do reszty nie mogę się przyczepić. :)

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...