[ Chimera144 @ 05.08.2002. 10:46 ] @
Prvo pozdrav svima. Imam dva ne tako strasna problema, ali bih voleo da znam sta je u pitanju.
1. Program mi javlja neke izuzetke tipa "Abstract Error" i "Access violation at address..." ali tek posto izvrsi sve linije koda. Znaci ovo se desava samo kad pokrecem program iz Delphi IDE-a i posle OK i F9 program radi kako valja. Ono sto me zanima je kada Delphi inace daje takve poruke i da li je zaista sve OK sa programom posto kao sto rekoh ja ne zapazam nikakve greske.
2. Imam MenuItem kraj i logicno klikom na njega trebe da se zavrsi aplikacija.
Ja sam u obradi dogadjaja OnClick napisao samo Close. Uzgred imam dve forme Main i dialog, ako to nesto znaci. E sad, kada misem kliknem na krstic prozora program se zavrsi korektno, dok kada ga zatvaram iz menija prozor se odmah ukloni ali Delphi-ju treba jos neko vreme da ga zaista zavrsi (vise sekundi je u stanju Running). Isto se desava kad pokrecem EXE fajl: zatvori prozor ali ako probam da brzo ponovo startujem isti program dolazi do zastoja. Ono sto sam ja uocio je da ovoga nije bilo dok nisam koristio Windows API PlaySound.
[ alix @ 06.08.2002. 07:17 ] @
Problem je ochigledno u Windows API PlaySound.
Da bi' znao tachno kako da ti pomeognem poshalji source code od oba .pas file-a. za Prvi problem sigurno pozivash neku funkciju ili proceduru koju ne bi smeo da pozivash. Ali poshalji code pa chu videt' kako mogu da ti help.
[ Chimera144 @ 06.08.2002. 11:06 ] @
Ma nije toliko strasno da te sad zamajavam sa source kodom koji ionako obiman i prilicno neuredan. Nego zanima me sta ti znaci "pozivash neku funkciju ili proceduru koju ne bi smeo da pozivash"? Kakve to funkcije i procedure ne smem da pozivam?
[ BobMarley @ 06.08.2002. 12:39 ] @
Za errore imas u Helpu objasnjenja sta svaki error znaci..
a ovo drugo nije nista strasno vec ono u meniju zatvara samo Form1 .. znaci ono u meniju je zapravo Form1.Close; i onda kada se to izvrsi on od te forme zatvara sve njene "childove" pa to malo traje dok sa 'X'-ićem vjerojatno zatvori sve odjednom ... probaj ICQ zatvoriti saX i sa Exit u meniju isti slucaj :))
[ Chimera144 @ 06.08.2002. 18:30 ] @
-Access Violation: Attempts to access a memory address for which there is no virtual memory allocated to the application.

-EAbstractError is raised when an application tries to call an abstract method. It is also raised at design time when a component with an abstract method is placed on a form.

Mene bas zanima zasto bi program u principu pristupao tim adresama. Koji je moguci razlog, je li sigurno greska u mom kodu ili postoje mozda nesto drugo.
Za ovaj AbstractError mi je cudno zato nemam nijedan apstraktni metod, ali kao sto rekoh nije mnogo ni bitno.
[ sesa @ 07.08.2002. 13:48 ] @
uh! to moze biti bilo sta, ali
pojavljivanje izuzetka Abstract Error
navodi na ideju da pokusavas da instanciras apstraktnu klasu.
[ Ilija Studen @ 08.08.2002. 22:03 ] @
Meni se Abstract Error javljao kada pokusavam da kreiram objekat klase TGraphic... Nakon kompajliranja kompajler ce ti (u vecini slucajeva) javiti koja klasa ima apstraktne metode.
Reci koje komponente imas na formi i kako si postavio forme (primarnu, da li drugu kreiras automatski ili preko konstruktora...).

Mislim, najbolje bi bilo kad bi poslao Source.
[ Rapaic Rajko @ 14.08.2002. 09:18 ] @
Abstract error...

Evo konkretne situacije. Napravio si, recimo, neku svoju graficku klasu TMyGraphic od TGraphic. Klasa TGraphic ima podosta abstract virtual metoda, i sve one treba da se override-uju u klasi TMyGraphic.
Sta se desi ako instanci TMyGraphic pridjes kao instanci TGraphic? Evo konkretno:

var
Graph: TGraphic:
MyGraph: TMyGraphic;
MyStream: TMemoryStream;
begin
MyGraph:=TMyGraphic.Create;
MyStream:=TMemoryStream.Create;

Graph:=MyGraph; // ovde "gledamo" TMyGraphic kao TGraphic
Graph.LoadFromStream(MyStream); // poziv abstract virtual metode
....
....
Graph.Free;
MyStream.Free;
end;

Ako metoda LoadFromStream() nije override-ovana, dobijes cist abstract error. To je sve.

Rajko
[ kingrale @ 08.10.2002. 01:09 ] @
Pokusaj usvojiti da svoje programe zavrsavas naredbom
Application.Terminate;
[ goblin @ 09.10.2002. 23:49 ] @
Ja nikako ne bih savetovao da se program de facto gasi tom komandom.
Cak mislim da je ovo veoma opasno, posto naglo gasenje glavnog threada onemogucava pozivanja OnClose, OnDestroy, OnHide eventova... Ovo je odlicna komanda kada se program mora hitno ugasiti i izbeci svi moguci event-ovi pri gasenju (npr. ako vidi da ne postoji krucijalan fajl za funkcionisanje programa) i to ovako:

procedure TForm1.Button1Click(Sender: TObject);
begin
//...
if TerminatAtOnce then
begin
Application.Terminate;
Exit; // izbegni dalji tok komandi u proceduri...
end;
//...
end;

U normalnim slucajevima treba ga maksimalno izbegavati (bar ja tako mislim).

P.S. Nikako da provalim kako ljudi dobiju onaj tip formatiranja za source code! Pomoc, please
[ broker @ 10.10.2002. 12:26 ] @
Acces violation se desava obicno kada pokusavas dapristupis nekom objektu koji nije kreiran. Ako ti se to desava na izlasku iz programa proveri da nisi ubio neki objekat prerano.

Recimo banalan je slucaj da ljudi u onClose eventu forme stave:

Close;
Free;



[ silverglider @ 11.10.2002. 09:54 ] @
Da, access violation se desava kod pristupa pointeru na objekat koji nije inicijalizovan ili funkciji koja "ne postoji". Banalan primer: imas TTimer objekat i u OnTimer si definisao sta treba periodicno da se radi - medjutim, moze se desiti da u procesu "gasenja" programa, objekat koji se adresira iz startovanog OnTimer eventa vise ne postoji, jer je 'ubiven' (kako atributi, tako i metodi).

Licno najvise volim kod svih programa koji prevazilaze "hello world" nivo da napravim cleanup proceduru, jer ne mogu uvek da se oslonim da ce se sve ocistiti kako treba samo od sebe (mozda se objekti svi ciste ok, ali ne u korektnom redosledu, zbog povezanosti preko event-handlera). Ne mislim samo na korektno gasenje programa, nego i na oslobadjanje zauzete memorije pointerima i slicno. Makar kod nekih klasa nilovati 'skakljive' eventove - kod pomenutog TTimera event OnTimer, kod socket klasa OnReceive, kod threadova prvo suspend, itd.

[ -zombie- @ 16.10.2002. 02:18 ] @
bash danas mi se kolega pozalio na nesto slicno (bar mi se cini) sa temom..

elem, ima formu, koji kreira i prikazuje runtime, znaci klasika kod:

Code:

var
....f: tNekaForma;
begin
....f:=tNekaForma.Create(nil);
....f.ShowModal;
....FreeAndNil(f);
end;


e sad. problem nastaje kada na formi postoji dugme koje jednostavno poziva Close() metodu, ili ako se u eventu za to isto dugme postavi ModalResult na bilo sta, i time zatvori forma (posto je prikazana sa ShowModal())..

e sad, ako se forma zatvori na bilo koji od dva opisana nacina (close() i modalresult) ponekad delphi javi nesto vrlo cudno, (valjda) Abstract Error, ili neki Ilegal Instruction ili nesto slicno prilicno nedefinisano...

i to ne bi bilo toliko cudno (rekao bih prosto, covek ima bug negde..) da sve ne radi savrseno ako se forma zatvara klikom na ono X dugmence u gornjem desnom uglu...

ima li neko neko objasnjene za ovakvo ponasanje?


btw, jel zna neko precizno da objasni razliku u kreiranju forme runtime na nacin koji sam ja opisao, i koristeci Application.CreateForm(...)?

pretpostavljam da je u drugom slucaju objekat Application vlasnik novokreirane forme, i da je on odgovoran da je oslobodi.. da ili ne? a ako jeste, kako da ja oslobodim kada mi vise ne treba (da ustedim memoriju) a da to ne pravi probleme sa application objektom? (pitanje cisto teoretski, nije mi pravilo probleme do sada, cisto me ovo podsetilo da pitam nesto sto ne razumem bas skroz..)
[ overflow @ 21.10.2002. 17:31 ] @
-------------
pretpostavljam da je u drugom slucaju objekat Application vlasnik novokreirane forme, i da je on odgovoran da je oslobodi.. da ili ne?
-------------

Da, u tom slucaju potpunu kontrolu ima Application i ti ne baratas sa kreiranim objektima. Mislim, da je to i razlog pojavljivanja exception-a (probao si da pristupis adresi na kojoj vise objekat ne postoji jer ju je application promenio/obrisao).

-------------
a ako jeste, kako da ja oslobodim kada mi vise ne treba (da ustedim memoriju) a da to ne pravi probleme sa application objektom? (pitanje cisto teoretski, nije mi pravilo probleme do sada, cisto me ovo podsetilo da pitam nesto sto ne razumem bas skroz..)
-------------

Uz predpostavku da si obrisao formu iz liste Project/Forms/"Auto-create forms" ( odnosno red: Application.CreateForm(TfrmTest, frmTest); u .dfm) :

begin
frmTest := TfrmTest.create(Self);
try
frmTest.ShowModal;
finally
frmTest.free;
end;
end;

[ -zombie- @ 22.10.2002. 00:33 ] @

ne, nisi dobro procitao. isti exception se javlja i kada se forma kreira sa tForm.Create()...


a inace, tvoj kod je (bar teoriski) netacan.

kada kazes f:=tForm.Create(self) taj self iz koga pozivash ovaj kod (ta forma) postaje vlasnik novokreirane forme! ovo ne bi trebalo da valja iz istog razloga koji si opisao u prvom delu tvog posta.

znam i sam da to (najcesce) ne dize greske, a zasto, to vec ne znam...
[ Riste Pejov @ 22.10.2002. 14:22 ] @
Code:

begin
frmTest := TfrmTest.create(Self);
try
frmTest.ShowModal;
finally
frmTest.free;
end;
end;


ovaj self u drugom redu nije uopste potreban jes se forma ubija po modalnog prikazivanja.

A kad smo kad Application.CreateForm(..) da ne zaboravite ova procedura uvek u memoriji ostavlja globalnu referencu ka kreiranog objekta na heap-u

Mozes se od te iste forme osloboditi bez problema ukoliko pre nego sto tvoje procedure pristupaju iste ne provere dali postoji objekt za te reference.
[ silverglider @ 23.10.2002. 01:40 ] @
Citat:
zombie / DDG:
...
a inace, tvoj kod je (bar teoriski) netacan.

kada kazes f:=tForm.Create(self) taj self iz koga pozivash ovaj kod (ta forma) postaje vlasnik novokreirane forme! ovo ne bi trebalo da valja iz istog razloga koji si opisao u prvom delu tvog posta.
...


Ne, ovaj 'self' ne predstavlja obavezno pointer na objekat TForm klase, vec pointer na objekat klase u cijem si skoupu trenutno.

[ -zombie- @ 23.10.2002. 23:11 ] @
dobro de. ne cepidlaci! malo sam samo generalizovao.. nisam pretpostavio da pisesh svoje komponente!

ovo se ipak najcesce pise u kodu forme, zar ne?