[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

[VCL] Formy wewn±trz klas

cut

7/18/2007 9:17:00 AM

Witam

U¿ywam C++ Buildera. Mam nastêpuj±cy problem z b³êdem "Access volation",
który wystêpuje w momencie _zamkniêcia_ aplikacji (po wyj¶ciu z WinMain()).
Mam okno, które jest tworzone w klasie C1. Klasa C1 nie jest dziedziczona po
¿adnej klasie z VCL. Ale jej obiekt jest umieszczony w klasie g³ównego okna
F1 (jako zmienna, nie dynamicznie).

Wystêpuj± dwa warianty, w pierwszym b³±d Access Volation NIE wystêpuje (ale
jest ma³o przydatny). W pierwszym wariancie klasa C1 ma metodê M, w której
nowe okno F2 jest tworzone poprzez new, wywo³ywane ShowModal(), a nastêpnie
kasowane poprzez delete. I wszystko jest ok.

W drugim wariancie metoda M jest rozbita. Okno F2 tworzone jest w
konstruktorze klasy C1 poprzez new, kasowane poprzez delete w destruktorze,
a we wspomnianej metodzie M wywo³ywana jest tylko metoda ShowModal() tego
okna (F2). Wtedy i tylko wtedy, kiedy metoda ShowModal() bêdzie wywo³ana,
wyst±pi wspomniany b³±d (przy zamkniêciu aplikacji). Je¿eli metoda M
(defakto showModa()) nie bêdzie wywo³ana, to wszystko bêdzie dobrze (okno
jest tworzone i usuwane, i nie ma problemu).

Dodatkowo powiem, ¿e destruktor w C1 NIE jest wywo³ywany przed wyst±pieniem
b³êdu (nie dochodzi do delete F2). Ponadto adres wskazany w access volation
jest równy adresowi metody nale¿±cej do jednej z kontrolek na formie F2,
wska¼nikowi na metode DefWndProc kontrolki typu TRichEdit :-\ Zaznaczam, ¿e
wspomniana kontrolka (na razie) tylko "le¿y" na formie.

Pozdrawiam
Andrzej


5 Answers

Jacek Czerwinski

7/18/2007 9:28:00 AM

0

Dnia Wed, 18 Jul 2007 11:16:50 +0200, andrew napisa3(a):

> Witam
>
> U?ywam C++ Buildera. Mam nastepuj?cy problem z b3edem "Access volation",
> który wystepuje w momencie _zamkniecia_ aplikacji (po wyj?ciu z WinMain()).

typowe dla C s? opóznione efekty b3edów zwykle gospodarki ze
wska?nikami/buforami/niezainicjowaniem/alokowaniem/zwalnianiem. S? to wrecz
klasyczne dla C b3edy.

Opisu s3oenego przyznam sie ?e nie przeczyut3?em go g3ebi, ktokolwiek by
chcia3 ci pomóc zawo3a kod.

cut

7/18/2007 9:42:00 AM

0

"Jacek Czerwinski" <x@y.z.pl> wrote in message
news:18tmzw4lrmh5g.6zhn0yjtx3p3$.dlg@40tude.net...
> Dnia Wed, 18 Jul 2007 11:16:50 +0200, andrew napisa³(a):
>
> typowe dla C s± opóznione efekty b³edów zwykle gospodarki ze
> wska¼nikami/buforami/niezainicjowaniem/alokowaniem/zwalnianiem. S± to
> wrêcz
> klasyczne dla C b³edy.
>

Fakt, ¿e dawno w C++ nie programowa³em, ale kiedy¶ sporo w VC++6.

Anyway, to musi byæ jaki¶ bug chyba bo:
- je¿eli usunê kontrolkê RichEdit z formy F2 to wszystko jest ok
(przypominam, ze ona tylko "le¿a³a" na formie i nie u¿ywa³em jej);
- je¿eli po³o¿ê now± kontrolkê RichEdit to znowu jest to samo;
- je¿eli ustawie Visible=false kontrolki RichEdit to... b³êdu NIE ma.

imho: b³±d zarz±dzania wska¼nikami mo¿na wykluczyæ. bo w dziwny sposób mo¿na
b³±d wyeliminowaæ.

Pozdrawiam
Andrzej


cut

7/18/2007 10:07:00 AM

0


"Jacek Czerwinski" <x@y.z.pl> wrote in message
news:18tmzw4lrmh5g.6zhn0yjtx3p3$.dlg@40tude.net...
> Dnia Wed, 18 Jul 2007 11:16:50 +0200, andrew napisa³(a):
>
>
> typowe dla C s± opóznione efekty b³edów zwykle gospodarki ze
> wska¼nikami/buforami/niezainicjowaniem/alokowaniem/zwalnianiem. S± to
> wrêcz
> klasyczne dla C b³edy.

Niestety mia³e¶ racjê. W pierwszym po¶cie napisa³em "jej obiekt jest
umieszczony w
klasie g³ównego okna F1 (jako zmienna, nie dynamicznie).". I tu siê
pomyli³em,
obiekt jest tworzony dynamicznie. Zapomnia³em ¿e w jakim¶ momencie zmieni³em
tworzenie obiektu na dynamiczne a usuwanie mia³em pó¼niej dopisaæ... no i
zapomnia³em.

Tak to jest jak siê programuje za du¿o w C# ;)

Pozdrawiam
Andrzej


Jacek Czerwinski

7/18/2007 10:15:00 AM

0

Dnia Wed, 18 Jul 2007 11:42:08 +0200, andrew napisa3(a):

> "Jacek Czerwinski" <x@y.z.pl> wrote in message
> news:18tmzw4lrmh5g.6zhn0yjtx3p3$.dlg@40tude.net...
>> Dnia Wed, 18 Jul 2007 11:16:50 +0200, andrew napisa3(a):
>>
>> typowe dla C s? opóznione efekty b3edów zwykle gospodarki ze
>> wska?nikami/buforami/niezainicjowaniem/alokowaniem/zwalnianiem. S? to
>> wrecz
>> klasyczne dla C b3edy.
>>
>
> Fakt, ?e dawno w C++ nie programowa3em, ale kiedy? sporo w VC++6.
>
> Anyway, to musi bya jaki? bug chyba bo:
> - je?eli usune kontrolke RichEdit z formy F2 to wszystko jest ok
> (przypominam, ze ona tylko "le?a3a" na formie i nie u?ywa3em jej);
> - je?eli po3o?e now? kontrolke RichEdit to znowu jest to samo;

Richedit wymaga extra inicjalizacji co? w rodzaju (z pamieci)
IniCommonControls ???

Sebastian Bialy

7/19/2007 5:14:00 AM

0

andrew wrote:
> obiekt jest tworzony dynamicznie. Zapomnia³em ¿e w jakim¶ momencie zmieni³em
> tworzenie obiektu na dynamiczne a usuwanie mia³em pó¼niej dopisaæ... no i
> zapomnia³em.
> Tak to jest jak siê programuje za du¿o w C# ;)

Zainteresuj siÄ? wynalazkami typu boost::shared_ptr i podobnymi.