Forum > General
Array of Record as Property
Weitentaaal:
Hello,
how do i get this to work:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---TSomeRecord = record S1: String; S2: String; S3: String;end; { TAClass }TAClass = class private fSomeArr: Array[0..1] of TSomeRecord; private procedure SetSomeArr(index: Integer; AValue: TSomeRecord ); function GetSomeArr(index: Integer): TSomeRecord ; public property SomeArr [index: Integer]: TSomeRecord read GetSomeArr write SetSomeArr; procedure InitData; end;implementation procedure TAClass.InitData;begin SomeArr[0].S1:= 'test'; SomeArr[0].S2:= 'test'; SomeArr[0].S3:= 'test';end; function TAClass.GetSomeArr(index: Integer): TSomeRecord;begin if (index < Length(fSomeArr)) and (index >= 0) then begin Result:= fSomeArr[index]; end;end; procedure TAClass.SetSomeArr(index: Integer; AValue: TSomeRecord);begin if (index < Length(fSomeArr)) and (index >= 0) then begin fSomeArr[index].S1:= AValue.S1; fSomeArr[index].S2:= AValue.S2; fSomeArr[index].S3:= AValue.S3; end; Case index of 0: ShowMessage('Array Field 1 Changed'); 1: ShowMessage('Array Field 2 Changed') end;end;
This Code provides the following Error: "Argument cannot be assigned to"
--- Quote --- SomeArr[0].S1:= 'test';
SomeArr[0].S2:= 'test';
SomeArr[0].S3:= 'test';
--- End quote ---
how do I change the code to make this work ?
Thanks in advance !
Weitentaaal:
I solved it in a dirty way:
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} --- property SomeArrS1 [index: Integer]: String read GetSomeArrS1 write SetSomeArrS1; property SomeArrS2 [index: Integer]: String read GetSomeArrS2 write SetSomeArrS2; property SomeArrS3 [index: Integer]: String read GetSomeArrS3 write SetSomeArrS3;
any other Solution?, because the number of getter and setter would explode
jcmontherock:
Two suggestions:
1) Use dynamic arrays. It works with records.
2) Set the length of your strings (ex: string[255]).
Zvoni:
This works
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program Project1;Uses SysUtils, Classes; Type TSomeRecord=Record s1:String; s2:String; s3:String; end; { TAClass } TAClass = Class Private fSomeArr:Array[0..1] Of TSomeRecord; Protected Procedure SetSomeArr(AIndex:Integer;AValue:TSomeRecord); Function GetSomeArr(AIndex:Integer):TSomeRecord; Public Property SomeArr[AIndex:Integer]:TSomeRecord Read GetSomeArr Write SetSomeArr; Procedure InitData; end; { TAClass } procedure TAClass.SetSomeArr(AIndex: Integer; AValue: TSomeRecord);begin fSomeArr[AIndex].s1:=AValue.s1; fSomeArr[AIndex].s2:=AValue.s2; fSomeArr[AIndex].s3:=AValue.s3;end; function TAClass.GetSomeArr(AIndex: Integer): TSomeRecord;begin Result:=fSomeArr[AIndex];end; procedure TAClass.InitData;begin fSomeArr[0].s1:='Test 1'; fSomeArr[0].s2:='Test 2'; fSomeArr[0].s3:='Test 3'; fSomeArr[1].s1:='empty 1'; fSomeArr[1].s2:='empty 2'; fSomeArr[1].s3:='empty 3';end; Var MyClass:TAClass; MyArr:TSomeRecord; i:Integer; begin MyClass:=TAClass.Create; MyClass.InitData; For i:=0 To 1 Do Begin Writeln(MyClass.SomeArr[i].s1); Writeln(MyClass.SomeArr[i].s2); Writeln(MyClass.SomeArr[i].s3); End; MyArr.s1:='test 11'; MyArr.s2:='test 12'; MyArr.s3:='test 13'; MyClass.SomeArr[1]:=MyArr; For i:=0 To 1 Do Begin Writeln(MyClass.SomeArr[i].s1); Writeln(MyClass.SomeArr[i].s2); Writeln(MyClass.SomeArr[i].s3); End;end.
Returns
Test 1
Test 2
Test 3
empty 1
empty 2
empty 3
Test 1
Test 2
Test 3
test 11
test 12
test 13
Weitentaaal:
--- Quote from: jcmontherock on June 28, 2022, 04:28:36 pm ---Two suggestions:
1) Use dynamic arrays. It works with records.
2) Set the length of your strings (ex: string[255]).
--- End quote ---
tried both, but i couldn't get it to work %)
--- Quote from: Zvoni on June 28, 2022, 04:37:37 pm ---This works
--- Code: Pascal [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program Project1;Uses SysUtils, Classes; Type TSomeRecord=Record s1:String; s2:String; s3:String; end; { TAClass } TAClass = Class Private fSomeArr:Array[0..1] Of TSomeRecord; Protected Procedure SetSomeArr(AIndex:Integer;AValue:TSomeRecord); Function GetSomeArr(AIndex:Integer):TSomeRecord; Public Property SomeArr[AIndex:Integer]:TSomeRecord Read GetSomeArr Write SetSomeArr; Procedure InitData; end; { TAClass } procedure TAClass.SetSomeArr(AIndex: Integer; AValue: TSomeRecord);begin fSomeArr[AIndex].s1:=AValue.s1; fSomeArr[AIndex].s2:=AValue.s2; fSomeArr[AIndex].s3:=AValue.s3;end; function TAClass.GetSomeArr(AIndex: Integer): TSomeRecord;begin Result:=fSomeArr[AIndex];end; procedure TAClass.InitData;begin fSomeArr[0].s1:='Test 1'; fSomeArr[0].s2:='Test 2'; fSomeArr[0].s3:='Test 3'; fSomeArr[1].s1:='empty 1'; fSomeArr[1].s2:='empty 2'; fSomeArr[1].s3:='empty 3';end; Var MyClass:TAClass; MyArr:TSomeRecord; i:Integer; begin MyClass:=TAClass.Create; MyClass.InitData; For i:=0 To 1 Do Begin Writeln(MyClass.SomeArr[i].s1); Writeln(MyClass.SomeArr[i].s2); Writeln(MyClass.SomeArr[i].s3); End; MyArr.s1:='test 11'; MyArr.s2:='test 12'; MyArr.s3:='test 13'; MyClass.SomeArr[1]:=MyArr; For i:=0 To 1 Do Begin Writeln(MyClass.SomeArr[i].s1); Writeln(MyClass.SomeArr[i].s2); Writeln(MyClass.SomeArr[i].s3); End;end.
Returns
Test 1
Test 2
Test 3
empty 1
empty 2
empty 3
Test 1
Test 2
Test 3
test 11
test 12
test 13
--- End quote ---
guess i will have to do it this way, just tried to avoid creating a temporery record. Thanks !
Navigation
[0] Message Index
[#] Next page