Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi unbestimmter Datentyp deklarieren (https://www.delphipraxis.net/147789-unbestimmter-datentyp-deklarieren.html)

vsilverlord 16. Feb 2010 12:48


unbestimmter Datentyp deklarieren
 
Hallo, ich möchte eine Klasse deklarieren, die einen array von unbestimmten Datentypen hat. Später dann möchte ich dann z.b. Integer oder tvector zuweisen können.(Natürlich bevor dem array Werte zugewiesen wurden). Wie kann ich das machen?
Delphi-Quellcode:
tbuffer = class
private
items: array of tunbestimmterdatentyp; //ttrait als unbestimmter Datentyp
...
public
...
procedure setbestimmterdatentyp(bestimmterdatentyp: ???)
so ungefähr soll das aussehen.

himitsu 16. Feb 2010 12:53

Re: unbestimmter Datentyp deklarieren
 
Wenn es unbeding ein Array sein soll, dann garnicht.

Du kannst nur einen Typen nehmen, wo die beiden anderen Wunschtypen reinpassen.

z.B.:
Delphi-Quellcode:
tunbestimmterdatentyp = record
  case integer of
    0: (i: Integer);
    1: (v: tvector);
end;

jfheins 16. Feb 2010 12:56

Re: unbestimmter Datentyp deklarieren
 
Evtl. mit dem Typ Variant ?

Und in neuen Delphi-Versionen auch Generics ...

Jaynder 16. Feb 2010 13:01

Re: unbestimmter Datentyp deklarieren
 
Variant ist gut, aber ungemütlich zu handlen. Generics helfen hier gar nicht. himitsu's Lösung passt.

himitsu 16. Feb 2010 13:07

Re: unbestimmter Datentyp deklarieren
 
@jfheins: Generics helfen, wenn man den Typ erst zur Kompilierungszeit festlegen möchte, aber hier soll es erst zur Laufzeit passieren.

Variants und Records vertragen sich nicht sonderlich.

implementation 16. Feb 2010 14:25

Re: unbestimmter Datentyp deklarieren
 
Wie wärs mit nem unbestimmten Pointer?
Delphi-Quellcode:
type
  TAnyArray = array of Pointer;
  PInteger = ^Integer;
  PVector = ^TVector;
var
  AnyArray: TAnyArray;

...

New(PInteger(AnyArray[i]));
PInteger(AnyArray[i])^ := 89;

New(PVector(AnyArray[i]));
PVector(AnyArray[i])^.IrgendeinFeld := 34;
Und Dispose nicht vergessen, sonst schaffst du 'nen Speicherleck. :angel2:

Jaynder 16. Feb 2010 14:29

Re: unbestimmter Datentyp deklarieren
 
:gruebel: Und wer soll das später noch mal verstehen?
himitsu's record mit varianten sind die sauberste Lösung. :thumb:

implementation 16. Feb 2010 14:33

Re: unbestimmter Datentyp deklarieren
 
Natürlich könnte man auch von allen Datentypen Container-Klassen basteln, und dann einen Array of TObject draus machen... :twisted:

Uwe Raabe 16. Feb 2010 14:39

Re: unbestimmter Datentyp deklarieren
 
Ab Delphi 2010 könnte man es auch mit
Delphi-Quellcode:
array of TValue
versuchen.

vsilverlord 16. Feb 2010 16:14

Re: unbestimmter Datentyp deklarieren
 
hm.
hier mal der Quelltext wie es bisher aussieht, so gefällt es mir halt überhaupt nicht:

Delphi-Quellcode:
unit uBuffer;

interface

uses
uvektor;

Type

// Pointer auf array mit extended
tarrayextended = record
  items:array of extended;
end;
  parrayextended=^tarrayextended;

// Pointer auf array mit tvektor3
tarraytvektor3 = record
  items:array of tvektor3;
end;
  parraytvektor3=^tarraytvektor3;

...

////////// TBuffer ///////////////
TBuffer = class
    public

        constructor create;virtual;
        destructor destroy;virtual;

        procedure SetSlotlength(Slotlength:integer);virtual;abstract;
end;
  pBuffer=^TBuffer;

/////////TBufferextended//////////
TBufferextended = class(TBuffer)
     protected
        fparts:tarrayextended;
        //getter setter methoden
        function getparts:parrayextended;
        procedure setparts(nitems:parrayextended);

     public
        // create / destroy
        constructor create;virtual;
        destructor destroy;virtual;
        //propertys
        property parts:parrayextended read getparts write setparts;
        procedure SetSlotlength(Slotlength:integer);override;
end;
pBufferextended=^TBufferextended;

//////////TBuffertvektor3/////////
TBuffertvektor3 = class(TBuffer)
      protected
        fparts:tarraytvektor3;
        //getter setter methoden
        function getparts:parraytvektor3;
        procedure setparts(nitems:parraytvektor3);

      public
      // create / destroy
        constructor create;virtual;
        destructor destroy;virtual;
        //propertys
        property parts:parraytvektor3 read getparts write setparts;
        procedure SetSlotlength(Slotlength:integer);override;
end;

implementation

...
end.
Ich denke ihr wisst am besten wir man das hier verbessern kann, wenigstens funktioniert es so, auch wenn es hässlich ist.
Das Ziel hier ist, dass ich TBuffer benutzen kann, ohne gleich den Typ angeben zu müssen. Den kann ich nun später angeben.
//edit: gekürzt, um Übersichtlichkeit zu schaffen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.
Seite 1 von 2  1 2      

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