AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

record mit dynamischem objekt

Ein Thema von Pixel · begonnen am 19. Feb 2017 · letzter Beitrag vom 19. Feb 2017
Antwort Antwort
Pixel

Registriert seit: 23. Aug 2016
26 Beiträge
 
#1

record mit dynamischem objekt

  Alt 19. Feb 2017, 10:19
Delphi-Version: 5
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:
  
  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;
Im Prinzip geht es um das letzte record THitObject . Man sieht am Ende die Deklaration HitObject : Pointer . Hier würde ich gerne in Abhgängikeit von HitObjectType (TDot , TSlider oder TSpinner ), was während der Laufzeit bekannt wird, das zugehörige Objekt in HitObject stehen haben.

Also angenommen HitObjectType wäre TSpinner , dann sollte HitObject ein TSpinner sein.

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:
private
  var Sliders : array of TSlider;
Und dann in zur Laufzeit mit SetLength(Sliders, X) und HitObject := @Sliders[X] .

Mir kommt das unsauber vor.


Wie würdet ihr sowas machen?

Geändert von Pixel (19. Feb 2017 um 10:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: record mit dynamischem objekt

  Alt 19. Feb 2017, 10:34
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:
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;
Das Feld in THitobject ist dann vom Typ TMyObject statt Pointer.
Delphi-Quellcode:
if HitObject.HitObject is TSpinner then
  TSpinner(HitObject.HitObject).Length := 42;
Noch eleganter wären zwar Interfaces, ich weiß aber nicht, ob Du damit klarkommst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: record mit dynamischem objekt

  Alt 19. Feb 2017, 10:37
In etwa so:
Als Variante records
Delphi-Quellcode:
THitObject = record
    Coordinates: array [0 .. 0] of Integer;
    Offset: Integer;
    case HitObjectType: THitObjectType of
      hDot: (Dot: TDot);
      hSlider: (Slider: TSlider);
      hSpinner: (Spinner: TSpinner);
  end;
Warum verwendest Du packed records? Die sind im Zugriff eher langsamer;
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: record mit dynamischem objekt

  Alt 19. Feb 2017, 10:39
Wie würdet ihr sowas machen?
Ich würde den Kram als Klassen deklarieren (TDot, TSlider und TSpinner haben eine gemeinsame Basisklasse) und dann abfragen: if myObj.HitObject is TSpinner then ... Oder gleich den Codeschnipsel in die Klassen verlagern und sort aufrufen.


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.
  Mit Zitat antworten Zitat
Pixel

Registriert seit: 23. Aug 2016
26 Beiträge
 
#5

AW: record mit dynamischem objekt

  Alt 19. Feb 2017, 10:53
In etwa so:
Als Variante records
Delphi-Quellcode:
THitObject = record
    Coordinates: array [0 .. 0] of Integer;
    Offset: Integer;
    case HitObjectType: THitObjectType of
      hDot: (Dot: TDot);
      hSlider: (Slider: TSlider);
      hSpinner: (Spinner: TSpinner);
  end;
Warum verwendest Du packed records? Die sind im Zugriff eher langsamer;
Das war genau das was ich gesucht hatte! Vielen Dank! Ich hatte sogar irgendetwas mit case im Kopf, aber dachte dann dass ich das nur aus c++ gekannt habe oder so. Naja.

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!

Geändert von Pixel (19. Feb 2017 um 11:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz