Array of Record über Property ansprechen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Array of Record über Property ansprechen

Beitrag von LazProgger »

Ich habe eine Klasse, die einige Daten in einem Record abspeichert und würde jetzt gerne die Werte des Records über eine property ändern.

Ohne alles unwichtige sieht meine Klasse so aus:

Code: Alles auswählen

  TMyClass = class
  private
    FItems: array of TMyRecord;
  protected
    function GetItem(Index: Integer): TMyRecord;    
  public
    property Items[Index: integer]: TMyRecord read FItems[Index] write FItems[Index];  // kompiliert nicht
    property Items[Index: integer]: TMyRecord read GetItem write SetItem;  // geht nicht - erzeugt nur Kopie
  end;
Das Problem: Ich kann nicht auf den Record zugreifen. Ich habe es erst mit normalen Setter und Getter Funktionen probiert. Da Records aber nicht so wie eine Klasse als Referenz übergeben werden, erzeugt dies beim Set nur eine Kopie in der ich zwar die Werte ändern kann, die aber keinen Einfluss auf die Items in meiner Klasse haben.

Ich weiß dass man dem ganzen ausweichen kann, in dem man eine Klasse statt einem Record benutzt. Das würde ich aber gerne lassen, da eine Klasse bei sehr vielen Daten sehr viel langsamer im Befüllen ist (hatte vorher eine Lösung mit einer Klasse und habe Tests gemacht).
Desweiteren wäre es natürlich auch denkbar die FItems pubic zu machen und direkt zu bearbeiten, aber das möchte ich auch nicht.

Gibt es eine Möglichkeit den Array of Record irgendwie über eine Property anzusprechen? Gerne auch über eine Setter oder Getter Methode die das hinbekommt ohne das Problem dass ich hatte (Record wird nur kopiert, ich erhalte keine Referenz um die Daten direkt zu ändern).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Array of Record über Property ansprechen

Beitrag von mse »

Code: Alles auswählen

 
type
 myrecordty = record
  a: integer;
  b: integer;
 end;
 pmyrecordty = ^myrecordty;
 
 myrecordarty = array of myrecordty;
 
 tmainfo = class(tmainform)
  private
   fitems: myrecordarty;  
   function getitems2(const aindex: integer): pmyrecordty;
  public
   constructor create(aowner: tcomponent); override;
   procedure test;
   property items1: myrecordarty read fitems;
   property items2[const aindex: integer]: pmyrecordty read getitems2;
 end;
...
constructor tmainfo.create(aowner: tcomponent);
begin
 setlength(fitems,10);
 inherited;
 test();
end;
 
function tmainfo.getitems2(const aindex: integer): pmyrecordty;
begin
 if (aindex < 0) or (aindex > high(fitems)) then begin
  raise exception.create('Invalid item index');
 end;
 result:= @fitems[aindex];
end;
 
procedure tmainfo.test();
begin
 items1[1].a:= 123;
 items2[1]^.b:= 456;
 writeln(fitems[1].a,' ',fitems[1].b);
end;
 
 
Zuletzt geändert von mse am Mi 14. Mai 2014, 14:07, insgesamt 2-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Array of Record über Property ansprechen

Beitrag von Socke »

LazProgger hat geschrieben:Ich weiß dass man dem ganzen ausweichen kann, in dem man eine Klasse statt einem Record benutzt. Das würde ich aber gerne lassen, da eine Klasse bei sehr vielen Daten sehr viel langsamer im Befüllen ist (hatte vorher eine Lösung mit einer Klasse und habe Tests gemacht).
Desweiteren wäre es natürlich auch denkbar die FItems pubic zu machen und direkt zu bearbeiten, aber das möchte ich auch nicht.
Ob du die einzelnen Felder in einem Record oder in einer Klasse als öffentlich deklarierst sollte auf die Programmentwurfslogik keine Auswirkung haben?! Vielleicht willst du die Gründe für deine Abneigung hier veröffentlichen, sodass wir sie dir wegargumentieren können? :lol:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: Array of Record über Property ansprechen

Beitrag von LazProgger »

Vielen Dank!

Die Antwort von mse hat mir sehr geholfen, genau das habe ich gesucht und jetzt funktioniert es.

@Socke: Die Gründe für die Abneigung liegen vor allem in der Lesbarkeit des Codes. Da die Klassen/Records verschachtelt sein können, kann ich mir durch die property Geschichte die auf tiefere Strukturen zugreift ersparen hinterher alles via Items.Items.Items ansprechen zu müssen. Aber das Problem ist ja jetzt sowieso gelöst :)

Antworten