/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Attributters synlighed i metoder i Delphi
Fra : (Per Røn


Dato : 19-03-04 16:13

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.

Den kaldende rutine er TFMain.BUdskrivClick, som er gengivet som den
anden unit.

Mere konkret kan TTerminDato.Udskriv ikke finde attributtererne Kvartal
og Aar i den klasse, den er en metode i. Programmet kørte godt nok
igennem som konsolprogram [og det er en elevs besvarelse jeg bringer].

unit UTerminDato;

interface

Type
TKvartal= (Januar, April, Juli, Oktober);
(**********************************************************************)
(* *)
(* TTerminDato *)
(* *)
(**********************************************************************)

TTerminDato =
class
public
Aar: integer;
Kvartal: TKvartal;

Constructor Create(AAar: integer;
AKvartal: TKvartal);
Procedure Next;
Procedure Udskriv;
Procedure AarUdskriv;
Function aarsskifte: boolean;
end;


implementation

uses
UUdskriv, SysUtils;

Constructor TTerminDato.create(AAar: integer; AKvartal: TKvartal);
begin
Aar:=AAar;
Kvartal:= AKvartal;
end;

Procedure TTerminDato.Aarudskriv;
begin
with FUdskriv.SG do begin
RowCount:= RowCount + 1;
Cells[0, RowCount-1]:= IntToStr(Aar);
end;
end;

Procedure TTerminDato.Udskriv;
var s: string;
begin
with FUdskriv.SG do begin
RowCount:= RowCount + 1;
Case Kvartal of
Januar : s:= 'Januar ';
April : s:= 'April ';
Juli : s:= 'Juli ';
Oktober: s:= 'Oktober';
end;
s:= s + ' ' + IntToStr(Aar);
Cells[0, RowCount-1] := s;

end;
end;

Procedure TTerminDato.Next;
begin
if Kvartal= Oktober then begin
Kvartal:= Januar;
inc(aar)
end else
kvartal:= Succ(Kvartal);
end;

Function TTerminDato.aarsskifte: boolean;
begin
result:= kvartal = oktober;
end;
end.
********************

unit GridMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, Grids, jpeg, ExtCtrls, StdCtrls, ULaan, UAcc, UTerminDato,
UIalt, UIndtast;

type
TFMain = class(TForm)
GroupBox1: TGroupBox;
BAntalLaan: TButton;
BData: TButton;
BUdskriv: TButton;
procedure BAntalLaanClick(Sender: TObject);
procedure BDataClick(Sender: TObject);
procedure BUdskrivClick(Sender: TObject);
private
public
{ Public declarations }
end;


var
FMain: TFMain;

var
Laan : Array of TLaan;
Termin : TAcc;
AarIAlt : TIalt;
AarLaan : Array of TIalt;
Kvartal : TKvartal;
I,
AntalLaan : Integer;
Saldo : Real;
TT : TTerminDato;

implementation
uses UUdskriv;
{$R *.dfm}

procedure TFMain.BAntalLaanClick(Sender: TObject);
begin
AntalLaan:=0;
AntalLaan:= StrToInt(InputBox('Indtast Data',
'Antal LÂn:',
''));
SetLength(Laan, AntalLaan);
SetLength(AarLaan, AntalLaan);
FData.SG.RowCount:= AntalLaan + 1;
end;

procedure TFMain.BDataClick(Sender: TObject);
begin
FData.ShowModal;
end;

procedure TFMain.BUdskrivClick(Sender: TObject);
var
i: integer;
Begin
TT:= TTerminDato.create(2004, April);
With FUdskriv.SG do begin
Cells[1,0]:= 'Kreditor';
Cells[2,0]:= 'Hovedstol';
Cells[3,0]:= 'Rentesats';
Cells[4,0]:= 'Ydelsessats';
TT.AarUdskriv;
TT.Udskriv;
For i:= 1 to AntalLaan do
Saldo:= Laan[i].Saldo;
while Saldo > 0 do begin
saldo:= 0;
For i:= 1 to AntalLaan do
if Laan[i].Saldo > 0 then begin
Laan[i].Amortiser;
Laan[i].Udskriv;
Saldo:= Saldo + Laan[i].Saldo;
Termin.Add(Laan[i]);
AarLaan[i].Add(Laan[i]);
end;
For i:= 1 to AntalLaan do
AarIAlt.Add(Laan[i]);
Termin.Udskriv;
Termin.Nullifiser;
if tt.aarsskifte then begin
AarLaan[i].IaltUdskriv;
AarLaan[i].IaltUdskriv;
AarIAlt.IaltUdskriv;
AarIAlt.Nullifiser;
end;
TT.Next;
end;
end;
FUdskriv.ShowModal;
end;

end.




--
Per Erik Rønne

 
 
David Konrad (19-03-2004)
Kommentar
Fra : David Konrad


Dato : 19-03-04 16:57

"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?)

> Den kaldende rutine er TFMain.BUdskrivClick, som er gengivet som den
> anden unit.

TT.Udskriv; ?

> Mere konkret kan TTerminDato.Udskriv ikke finde attributtererne Kvartal
> og Aar i den klasse, den er en metode i. Programmet kørte godt nok
> igennem som konsolprogram [og det er en elevs besvarelse jeg bringer].

Hvis du kan kalde metoden har du også adgang til felterne, da de er simple
typer. Jeg ville umiddelbart, da jeg så koden, have gætret på, at problemet
lå i cells[col,row]:= tildelingerne - men hvis du sender hele koden kan jeg
helt sikkert finde fejlen.




David Konrad (22-03-2004)
Kommentar
Fra : David Konrad


Dato : 22-03-04 13:01

"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.



David Konrad (22-03-2004)
Kommentar
Fra : David Konrad


Dato : 22-03-04 14:17

"David Konrad" <david_konrad_FJERN_@hotmail.com> wrote in message
news:c3mkhr$im5$1@sunsite.dk...

> 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

For i:= 0 to AntalLaan-1 do ...I stedet for
For i:= 1 to AntalLaan do





Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408921
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste