Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variant Typ erweitern möglich? (https://www.delphipraxis.net/160240-variant-typ-erweitern-moeglich.html)

Zacherl 4. Mai 2011 07:53

Delphi-Version: 2010

Variant Typ erweitern möglich?
 
Guten Morgen,

ich habe mir eine Funktion geschrieben, welche mehrere Parameter ähnlich wie in der Format() Funktion über ein variantes Array übergeben bekommt.

Hierbei unterscheidet der Standard Variant Typ ja zwischen WideString, AnsiString, Integer, Boolean, und so weiter. Übergebe ich allerdings ein Byte oder ein DWord oder einen Integer, so ist der Typ des Variants immer vtInteger.

:arrow: Jetzt frage ich mich, ob es möglich ist, den Variant Typ so zu erweitern (bzw. besser gleich zu ersetzen), dass zwischen den verschiedenen Ganzzahltypen unterschieden wird?
:arrow: Werden die Typen der Variants vom Compiler schon hardkodiert?
:arrow: Fals nicht wäre eine Unterscheidung von beispielsweise Byte oder Word ja gar nicht möglich oder?

Fragen über Fragen, ich hoffe mir kann da jemand weiterhelfen.

Edit: Grade die Definition des Typs TVarType gefunden. Das sieht schonmal vielversprechend aus:
Delphi-Quellcode:
varSmallInt: (VSmallInt:
varInteger: (VInteger:
varSingle:  (VSingle: Single);
varDouble:  (VDouble: Double);
..
varShortInt: (VShortInt: ShortInt);
varByte:    (VByte: Byte);
varWord:    (VWord: Word);
varLongWord: (VLongWord: LongWord);
varInt64:   (VInt64: Int64);
varUInt64:  (VUInt64: UInt64);
..
:arrow: Kennt sich jemand mit TCustomVariantType aus oder hat ein einfaches Beispiel zur Verwendung? Habe nicht wirklich viel Brauchbares dazu im Netz gefunden.

Mir geht es eigentlich nur darum, dass ich mehrere variante Typen unkompliziert und vor allem "in einem Rutsch" an meine Funktion übergeben kann. Die Funktion konvertiert die Daten für ein Netzwerkprotokoll. Dieses erwartet pro Parameter ein Byte zur Kennzeichung des Typs, weshalb es für mich wichtig wäre da eine genaue Unterscheidung treffen zu können.

Viele Grüße
Zacherl

Hawkeye219 4. Mai 2011 08:56

AW: Variant Typ erweitern möglich?
 
Hallo Zacherl,

ich habe leider keine Erfahrung im Umgang mit Variant-Typen, allerdings bin ich vor einiger Zeit mal über das Video von Alister Christie gestolpert.

Gruß Hawkeye

uligerhardt 4. Mai 2011 09:45

AW: Variant Typ erweitern möglich?
 
Ich weiß nicht, ob's für dich relevant ist, aber das hört sich an, als würdest du
Delphi-Quellcode:
array of Variant
verwenden. Format verwendet aber
Delphi-Quellcode:
array of const
, was intern ein
Delphi-Quellcode:
array of TVarRec
ist - siehe hier.

himitsu 4. Mai 2011 09:54

AW: Variant Typ erweitern möglich?
 
Das Einfachtes, um einen eigenen Variant-Typ zu erstellen, ist vermutlich,
wenn du über Delphi-Referenz durchsuchenTCustomVariantType gehst.

Uwe Raabe 4. Mai 2011 11:57

AW: Variant Typ erweitern möglich?
 
Ich hab sowas mal in meinem Blog beschrieben - dort allerdings bezogen auf TInvokeableCustomVariant.

Zacherl 4. Mai 2011 12:30

AW: Variant Typ erweitern möglich?
 
Danke euch allen. Ich hab mal wieder keine Augen im Kopf gehabt :wall:

Zitat:

Zitat von uligerhardt (Beitrag 1098799)
das hört sich an, als würdest du
Delphi-Quellcode:
array of Variant
verwenden. Format verwendet aber
Delphi-Quellcode:
array of const

Dein Beitrag hat mir die Augen geöffnet. Eigentlich habe ich nämlich sogar
Delphi-Quellcode:
array of const
verwendet. Dort wird leider nicht zwischen Byte, Word, etc. differenziert. Jetzt habe ich das ganze mal in ein
Delphi-Quellcode:
array of Variant
geändert und siehe da, wie durch Magie wählt Delphi automatisch den korrekten Typ.

Der Aufruf mit:
Delphi-Quellcode:
Test([1, Word(1), Byte(1), DWord(1)])
generiert beispielsweise die Typen BYTE, WORD, BYTE, DWORD, also genau das was ich wollte. Da muss ich nichtmal was erweitern.

Viele Grüße
Zacherl

himitsu 4. Mai 2011 13:04

AW: Variant Typ erweitern möglich?
 
Das Problem bei diesem "const" ist, daß es weniger Typen kennt, als Variant.
Siehe TVarRec, welches der eigentliche Typ von diesen "const" ist (nach außen
Delphi-Quellcode:
array of const
und nach innen ein implizites
Delphi-Quellcode:
array of TVarRec
).
(wobei Variant ja auch nicht alles kennt)

Zacherl 4. Mai 2011 13:11

AW: Variant Typ erweitern möglich?
 
Jap genau, ich hatte irgendwie einen Denkfehler drinnen und dachte, dass dieser TVarRec Record, den ich verwendet habe gleichzusetzen mit Variant ist. Ich poste den Encoder/Decoder gleich mal in einem neuen Thread. Bin mir nicht sicher, ob ich da noch irgendwas performanter gestalten könnte.

Die Typen die Variant unterstüzt reichen mir voll und ganz aus.

Neutral General 4. Mai 2011 13:16

AW: Variant Typ erweitern möglich?
 
Hallo,

Hier gibts ein Video-Tutorial wos ganz gut beschrieben wird:

http://www.youtube.com/watch?v=pzvI6yad3iY

Edit: Oh nicht genug gelesen glaube ich...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 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