"David Konrad" <david_konrad_FJERN_@hotmail.com> wrote in message
news:c3f594$7cc$1@sunsite.dk...
> "Per Rønne" <per.ronne@doesnt.work.spam.filter.invalid> wrote in message
> news:1gawkfh.10m0bh41um6d39N%per.ronne@doesnt.work.spam.filter.invalid...
> > Kan nogen forklare hvad der går galt i nedenstående klasse, når
> > programmet går ned grundet udførselsfejl i TTerminDato.Udskriv. Vel at
> > mærke efter at konstuktoren er kaldt.
>
> Hvilken udførselsfejl er der præcist tale om? (Exception-type?)
[Ahem...] Det er slet og ret en stribe voldsomme banale og klassiske fejl.
For det første sættes arrayet Laan "forkert", i hvert fald ift værdien
AntalLaan, som senere bruges i en løkke. Løkken skal hedde
For i:= 0 to AntalLaan do ...I stedet for
For i:= 1 to AntalLaan-1 do
Det glemmes gennemgående, at dynamiske arrays sat med SetLength starter fra
0 og frem. Derfor skal der også ændres i f.eks UIndtast, hvor værdierne
sættes ind
for i:= 1 to AntalLaan do begin skal være
for i:= 0 to AntalLaan-1 do begin
Husk at UIndtast også er baseret på AntalLaan
for i:= 0 to AntalLaan-1 do begin <---
Kreditor := SG.Cells[1,i];
Hovedstol := StrToFloat(SG.Cells[2,i+1]); <--- MEGET vigtigt at
incrementere i her
Og så fremdeles...
Endvidere opstår der en exception i TTerminDato, da der refereres til self,
UDEN at ancestor-klassens create-metode(r) er kaldt, hvorved den er nil.
Ændr' TTerminDato.create til
Constructor TTerminDato.create(AAar: integer; AKvartal: TKvartal);
begin
inherited create; <- indsæt denne linie
Aar:=AAar;
....
Men hvorfor overhovedet referere til self her? Der findes jo ingen variable,
Kvartal og Aar kan forveksles med...? I øvrigt forstår jeg ikke pointen med
Kvartal<=>fKvartal. Kvartal er en public variabel, et object, der tilgåes
via en function fKvartal, der blot returnerer Kvartal? Hvis det skulle give
mening, burde det mindst være en property, hvor fKvartal var en
field-variabel, som kunne tilgåes via propertyen Kvartal...?
Den sidste fejl er den allerværste - der refereres til den globale variabel
TT i Udlaan.udskriv, der dog i det mindste oprettes hver gang i
FMain.BUdskriv - men, TT er erklæret lokalt som global varialbel i BÅDE
ULaan og GridMain. Det er slet og ret for ringe! I øvrigt nedlægges ingen
objekter igen, helt gennemgående.
Nå, men hvis disse fejl rettes fungerer programmet - det går fint her. Jeg
har meget sævrt ved at tro, at det har virket i comsolemode, for det virker
ærlig talt umuligt
) Må jeg i øvrigt anbefale at eleverne får en
indføring i helt almindelig CUA/GUI-programmering?
)) Det grelleste er
dog den totale mangel på errorhandling - lidt try-except ville ikke være af
vejen - f.eks mister man alle data, hvis man skriver ikke-tal på
indtastningsskærmbilledet - såsom 4,76...Som gammel Delphi-underviser ville
jeg personligt i øvrigt ikke give denne opgave nogen særlig god karakter -
på en 13-skala max 03 eller derunder, naturligvis afhængig af tidspunktet i
undervisningsforløbet, og/eller niveauet generelt. Det er ganske enkelt et
uacceptabelt stykke arbejde, der viser, at eleven intet har forstået
overhovedet.