12. november 2004 - 08:17Der er
15 kommentarer og 1 løsning
Returnere en array of integer fra en component?
Hej eksperter,
Jeg har lavt et simpelt eksemple som skal returnere en talrække fra en funktion i en component og det virker ikke for mig.
Component kode:
function TMycomp.transform(tal: array of integer): talrkke; var I:integer; nyetal:talrkke; begin setlength(nyetal.tal,length(tal)); for I:=0 to length(tal)-1 do begin nyetal.tal[I]:=tal[I]+1; end; result:=nyetal; end;
talrkke har jeg defineret som:
type talrkke=record tal:array of integer; end;
Funktionen som kalder componenten
function TMycomp.transform(tal: array of integer): talrkke; var I:integer; nyetal:talrkke; begin setlength(nyetal.tal,length(tal)); for I:=0 to length(tal)-1 do begin nyetal.tal[I]:=tal[I]+1; end; result:=nyetal; end;
Programmet kompillere fint men går i stå når jeg definere den nye længde af nyetal.tal i funktionen transform. Hvordan gør man dette korrekt?
procedure TForm1.Button1Click(Sender: TObject); var I:integer; tal:talrkke; tal2:array of integer; begin setlength(tal2,10); for I:=0 to 10 do begin tal2[I]:=I; end; tal:=Mycomp1.transform(tal2); for I:=0 to 10 do begin memo1.lines.add(floattostr(tal.tal[I])); end; end;
hvor erkærer du din comp. og creater den ???, det tror jeg du mangler, det giver typisk en access violation hvis du tilgår et object/comp uden den er createt
Det er nok mere her at der er et problem. Jeg skal bruge den i form1.
type TForm1 = class(TForm) Mycomp1: TMycomp; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
Jeg kan godt hente en string og en integer fra componenten når de er defineret i public eller published i componenten. Jeg kan også bruge proceduren execute.
Jeg har dog ikke brugt create. Jeg har prøvet Mycomp1.create men det virker ikke.
type TMycomp = class(TComponent) private FMyStr: string; FMyInt: Integer; procedure SetMyStr(const Value: string); { Private declarations } protected { Protected declarations } public constructor create(AOwner : TComponent); override; property MyInt : Integer read FMyInt write FmyInt; procedure Execute; function transform(tal:array of integer):talrkke; { Public declarations } published property MyStr : string read FMyStr write SetMyStr; { Published declarations } end;
procedure Register;
implementation
procedure Register; begin RegisterComponents('Samples', [TMycomp]); end;
{ TMycomp }
constructor TMycomp.create(AOwner: TComponent); begin inherited create(Aowner);
FMyInt := 5; end;
procedure TMycomp.Execute; begin ShowMessage('This is the execute method'); end;
procedure TMycomp.SetMyStr(const Value: string); begin FMyStr := Value; end;
function TMycomp.transform(tal: array of integer): talrkke; var I:integer; nyetal:talrkke; begin setlength(nyetal.tal,11); for I:=0 to length(tal)-1 do begin nyetal.tal[I]:=tal[I]+1; end; result:=nyetal; end;
type TForm1 = class(TForm) Mycomp1: TMycomp; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var I:integer; tal:talrkke; tal2:array of integer; begin //mycomp1.create(); setlength(tal2,10); for I:=0 to 10 do begin tal2[I]:=I; end; tal:=Mycomp1.transform(tal2); for I:=0 to 10 do begin memo1.lines.add(floattostr(tal.tal[I])); end; end;
Jeg trækker den ned fra tabben så den skal forblive udkommenteret. Componenten virker bortset fra returneringen af nyetal.tal som er et array af integer
Tror du bliver snyt mht. til stedet hvor din AV opstår.
setlength(tal2,10); <<--- Skal være 11 for I:=0 to 10 do << -- eller og skal den rettes til 0 to 9 begin tal2[I]:=I; end; tal:=Mycomp1.transform(tal2); for I:=0 to 10 do <<------ gal begin memo1.lines.add(floattostr(tal.tal[I])); end; end;
Du kører en for langt... Brug altid 0 to High(Array) - også selvom du bare tester
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.