Forum > General

Array of Record as Property

(1/3) > >>

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

Go to full version