![]() |
Delphi-Version: 5
record mit dynamischem objekt
Hallo,
ich wusste nicht wie ich den Titel vergeben sollte, ist wahrscheinlich falsch, naja ich beschreibe mal mein Vorhaben. Ich habe diese 4 records:
Delphi-Quellcode:
Im Prinzip geht es um das letzte record TDot = packed record Coordinates : TPoint; Offset : Integer; end; TSlider = packed record Coordinates : array of TPoint; Offset : Integer; Length : Single; SliderType : TSliderType; Repetitions : Integer; end; TSpinner = packed record Offset : Integer; Length : Integer; end; THitObject = packed record Coordinates : array[0..0] of Integer; Offset : Integer; HitObjectType : THitObjectType; HitObject : Pointer; end;
Delphi-Quellcode:
. Man sieht am Ende die Deklaration
THitObject
Delphi-Quellcode:
. Hier würde ich gerne in Abhgängikeit von
HitObject : Pointer
Delphi-Quellcode:
(
HitObjectType
Delphi-Quellcode:
,
TDot
Delphi-Quellcode:
oder
TSlider
Delphi-Quellcode:
), was während der Laufzeit bekannt wird, das zugehörige Objekt in
TSpinner
Delphi-Quellcode:
stehen haben.
HitObject
Also angenommen
Delphi-Quellcode:
wäre
HitObjectType
Delphi-Quellcode:
, dann sollte
TSpinner
Delphi-Quellcode:
ein
HitObject
Delphi-Quellcode:
sein.
TSpinner
Mein Ansatz: Ich glaube man müsste die Objekte global deklarieren, also z.B. in private, weil sie sonst nicht mehr gültig sein würden, bei Beendigung der Prozdeur wo das alles ermittelt wird oder? Also:
Delphi-Quellcode:
Und dann in zur Laufzeit mit
private
var Sliders : array of TSlider;
Delphi-Quellcode:
und
SetLength(Sliders, X)
Delphi-Quellcode:
.
HitObject := @Sliders[X]
Mir kommt das unsauber vor. Wie würdet ihr sowas machen? |
AW: record mit dynamischem objekt
Ich habe zwar den Zusammenhang überhaupt nicht verstanden, aber wenn es darum geht, zu ermitteln, was konkret in Deinem HitObject-Feld steht, könntest Du doch statt der Records gleich Klassen verwenden. Zur Laufzeit ermittelst Du dann mit is, welche konkrete Klasse das ist.
Delphi-Quellcode:
Das Feld in THitobject ist dann vom Typ TMyObject statt Pointer.
type
TMyObject = class private FOffset: integer; public property Offset: integer read FOffset write FOffset; end; TSpinner = class(TMyObject) private FLength : Integer; public property Length: integer read FLength write FLength; end;
Delphi-Quellcode:
Noch eleganter wären zwar Interfaces, ich weiß aber nicht, ob Du damit klarkommst.
if HitObject.HitObject is TSpinner then
TSpinner(HitObject.HitObject).Length := 42; |
AW: record mit dynamischem objekt
In etwa so:
Als Variante records
Delphi-Quellcode:
Warum verwendest Du packed records? Die sind im Zugriff eher langsamer;
THitObject = record
Coordinates: array [0 .. 0] of Integer; Offset: Integer; case HitObjectType: THitObjectType of hDot: (Dot: TDot); hSlider: (Slider: TSlider); hSpinner: (Spinner: TSpinner); end; |
AW: record mit dynamischem objekt
Zitat:
Delphi-Quellcode:
Oder gleich den Codeschnipsel in die Klassen verlagern und sort aufrufen.
if myObj.HitObject is TSpinner then ...
Falls es unbedingt records sein müssen: Du kannst als erstes Feld ein "Typfeld" implementieren und dort immer den richtigen Typ reinschreiben. Beim auslesen kannst du dann den pointer weitersetzrn, das Feld auslesen und entsprechend reagieren. |
AW: record mit dynamischem objekt
Zitat:
Und warum packed records? Naja ich hatte anfangs auf den Speicher direkt zugegriffen und wollte dann kein alignment haben, habs aber wieder zu record geändert jetzt! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 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-2025 by Thomas Breitkreuz