EAccessViolation

Tags:    delphi

Hej,

Når jeg fx skriver Form3.ShowModal og vil køre denne kommande i rumtime ved at trykke på et menupunkt får jeg en "EAccessViolation" fejl. Jeg har fundet ud af, at det er fordi, at jeg prøver at åbne noget, der ikke er mit - eller rettere - mine forms (2 og 3) er ikke "med" i hovedprogrammet...
Fold kodeboks ind/udKode 

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk



10 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Du er bestemt galt på den. Den viste metode streamer formen ind i hukommelsen (.create) når den skal bruges hvorefter hukommelsen frigøres igen med "free".
Et standard projekt opretter formene ved opstart og dermed optager de plads i hukommelsen uanset om de er vist på skrærmen eller ej.
Summa sumarum: Det er altid en fordel at kreere sine forme dynamisk, selvom det kræver en anelse mere kode.

Nu er det jo sjældent at man kan generalisere på den måde.

Det afhænger af, om du vil optimere din kode for plads eller for hastighed. Det er hurtigere at have forms created fra starten, men det fylder til gengæld mere. Dynamiske forms er gode til forms, som man ikke kommer ind i særligt ofte.

Hvis du til gengæld vil have et hurtigere program, og er ligeglad med hvor meget det fylder, så er det bedre at create det hele fra starten.

Man kan ikke sige at det ene er bedre end det andet, det afhænger af situationen

/data

[Redigeret d. 12/06-03 12:52:13 af data]



Hvis du til gengæld vil have et hurtigere program, og er ligeglad med hvor meget det fylder, så er det bedre at create det hele fra starten.

Man kan ikke sige at det ene er bedre end det andet, det afhænger af situationen


Du har til dels ret, og til dels uret. Det afhænger i høj grad af hvor omfattende applikationen er. Hvis det er en applikation med adskillige snese forme og meget andet kode, så opretter man når man skal bruge det og nedlægger når man er færdig. Helt konsekvent.

Helt ideelt er der kun eet objekt oprettet fra start til slut og det er application (og dermed også applikationens mainform). Alt andet oprettes og nedlægges dynamisk. Der er ikke de store problemer på NT platformene, men især under 9x platformene er det vigtigt at man ikke har flere objekter oprettet end man skal bruge på et givent tidspunkt, især når det drejer sig om forme.

Det handler om ressourcer, og hukommelse er faktisk det mindste af det. 9x især (jeg er ikke sikker på NT) har meget begrænsede ressourcer hvad forme angår, og hvis man har alt for mange forme med alt for mange komponenter på så løber man tør for GDI ressourcer. GDI er det der håndterer komponenterne (edit felter, labels m.m). Sker det er der kun at genstarte pc'en.

Eftersom de fleste computere idag har adskillige hundrede mb hukommelse er det ikke så meget pladsen, men de andre ressourcer man skal passe på. Og med den hastighed de fleste computere idag kan præstere så gør det ingen praktisk forskel om hvorvidt formene skabes ved start eller dynamisk efterhånden som man bruger dem.

Min holdning, og den er altså baseret på erfaringer, er at så vidt muligt oprettes forme (på nær mainform) dynamisk, og alt data overførsel imellem forme håndteres af hjælpe objekter, eller globale variabler.

---
Thomas Due
tdue@mail.dk



Jeg har lavet min project-fil om fra:
Fold kodeboks ind/udKode 
Til:
Fold kodeboks ind/udKode 

Kan det passe, at det er derfor?

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk



Jeg har lavet min project-fil om fra:
Fold kodeboks ind/udKode 
Til:
Fold kodeboks ind/udKode 

Kan det passe, at det er derfor?

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk


Jeps. Problemet er, at dine forms ikke er created, når du forsøger at vise dem. Alternativt kan du gøre:

Fold kodeboks ind/udKode 


/data




User
Bruger #635 @ 11.06.03 11:05
with TForm2.create do
try
showmodal;
finally
free;
end;


så meget som jeg hutter så er det en meget dum ide at bruge den der form for opstilling? .. er der ikke noget med at den bruger utroligt mange unødvendige systemresourcer.. i .Net bliver du iværtigfald frarådet til at bruge den så jeg kan da ikke tro at det skulle værer så meget anderledes i delphi... men jeg kan godt værer galt på den ?

Humans are slow, inaccurate, and brilliant. Computers are fast, acurrate, and dumb. Together they are unbeatable



Du er bestemt galt på den. Den viste metode streamer formen ind i hukommelsen (.create) når den skal bruges hvorefter hukommelsen frigøres igen med "free".
Et standard projekt opretter formene ved opstart og dermed optager de plads i hukommelsen uanset om de er vist på skrærmen eller ej.
Summa sumarum: Det er altid en fordel at kreere sine forme dynamisk, selvom det kræver en anelse mere kode.




Nu er jeg temmelig ny og grøn indenfor Delphi... Kan I ikke prøve at lave et eksempel - det kunne jo godt give 100 UP ;)

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk



Nu er jeg temmelig ny og grøn indenfor Delphi... Kan I ikke prøve at lave et eksempel - det kunne jo godt give 100 UP ;)

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk

Et eksempel på hvad?



Af et program af hver type... Da jeg er lidt i tvivl om, hvordan man opsætter hver type program - altså med hvor og hvordan en form bliver created i starten, midt i forløbet etc...

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk



Kan du ikke prøve at give en konkret eksempel på? Altså hvor man fx skal oprette og nedlægge formene?

mikl | mikl@mikl.dk | MSN: mikl@mikl.dk



t