![]() |
Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Hallo,
ich glaube ich habe ein ganz einfaches Problem aber mir fällt keine vernünftige Lösung ein. Das Feld fJobs meiner Klasse TJoblist ist ein dynamisches Record-Array. Wie kann ich von außen auf die Felder des Records lesend und schreiben zugreifen?
Code:
Idealerweise würde ich gern wie folgt darauf zugreifen:
TStrArray = array of string;
TJobData = record Name: string; uid: integer; sources: TStrArray; end; TJobList = class(TObject) private fJobs: array of TJobData; procedure SetJob(jobIndex: integer; const job:TJobData); function GetJob(jobIndex: integer):TJobData; public property Jobs[jobIndex: integer]: TJobData read GetJob write SetJob; //???? die eigenschaften des jobs können dennoch beschrieben werden! (soll auch so sein) end;
Code:
Beim Lesen und insbesondere beim Schreiben möchte ich aber in der Klasse über Set- und Get-Methoden die Kontrolle darüber behalten, was gelesen und geschrieben wird.
joblist.Jobs[1].Name := joblist.Jobs[1].Name + ' TEST';
Eine Idee war statt des Records einen Pointer auf den Record zurückzugeben. Aber dann bekomme ich ja vom Schreiben nichts mehr mit, oder? So wie es aktuell implementiert ist, benötige ich mehrere Zeilen um eine Job.Eigenschaft zu verändern:
Code:
Gibts einen besseren Weg?
job := joblist.Jobs[1];
job.Name := job.Name + ' TEST'; joblist.Jobs[1] := job; Viele Grüße Stefan |
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Dein Record ist ein Werttyp- kein Referenztyp. Wenn du etwas hier nach außen gibst, dann eine Kopie des Records, wie du ja schon bemerkt hast.
Entweder du lässt die Properties weg und gibst das reine Array nach außen oder du kommst um Methoden wie
Delphi-Quellcode:
nicht herum.
setJobName(jobIndex, jobName)
|
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Ich würde an deiner Stelle eher eine generische TObjectList nehmen statt eines Arrays.
|
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
In eine TObjectList Records reinstecken klingt interessant.
|
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Ist doch vollkommen egal. Jeder sollte verstehen was ich meine und auch sehen, dass das Beispiel aus Beitrag 1 nicht gut ist.
Außerdem habe ich nicht geschrieben, dass ich Records in eine TObjectList stecken würde. |
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Warum nicht gleich aus dem record eine Klasse machen?
|
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Mal eben so aus einem Wertetyp einen Referenztyp machen ist meist nicht mal eben so getan. Wenn sich jemand bislang über die öffentliche Property ein paar
Delphi-Quellcode:
geholt hat, dann hatte er eine Kopie.
TJobData
Stellt man das jetzt um, hat er nur noch eine Referenz. Und angenommen diese Jobs sollen wirklich der TJobList gehören, muss man auch sicherstellen dass niemand mehr auf die abgeholten Referenzen zugreift sobald die Liste abgeräumt wird. Ich finde das nicht so trivial wie es klingt. |
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Zitat:
Ich habe das ganze Projekt jetzt etwas kleiner aufgesetzt und es soll so einfach wie möglich gehalten werden. Zitat:
Zitat:
Danke! |
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Zitat:
Wenn du das Record komplett weglässt und eine ordentliche Klasse mit Properties baust und dann noch irgendwas mit einem Modified-Property dann solltest du haben was du suchst. Zitat:
|
AW: Record-Array als Property einer Klasse: einfacher Zugriff auf die Record-Felder
Die Umstellung auf einen Referenztyp ist für dieses Problem oft die einfachste und schnellste Lösung, aber nicht unbedingt die Beste.
Delphi-Quellcode:
type
TStrArray = array of string; PJobData = ^TJobData; TJobData = record Name: string; uid: integer; sources: TStrArray; procedure Assign(const AItem: TJobData); end; TJobList = class(TObject) private fJobs: array of TJobData; procedure SetJob(jobIndex: integer; job: PJobData); function GetJob(jobIndex: integer): PJobData; public property Jobs[jobIndex: integer]: PJobData read GetJob write SetJob; end; implementation procedure TJobData.Assign(const AItem: TJobData); begin Name := AItem.Name; uid := AItem.uid; // damit sources und AItem.sources nicht auf das selbe Array verweisen // und nachfolgende Änderungen von AItem.sources keine Auswirkungen auf sources haben sources := Copy(AItem.sources); end; procedure TJobList.SetJob(jobIndex: integer; job: PJobData); begin {...} // fJobs[i] := job^; fJobs[i].Assign(job^); end; function TJobList.GetJob(jobIndex: integer): PJobData; begin {...} Result := @(fJobs[i]); end; joblist.Jobs[1]^.Name := joblist.Jobs[1]^.Name + ' TEST'; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz