![]() |
SetOf typecasten in LongInt
Hallo!
Wie kann ich folgenden (auszugsweisen) Lazarus-Code nach Delphi übersetzen?
Delphi-Quellcode:
SetOf ist ja eigentlich kein Ordinaltyp und kann daher in Delphi so auch nicht gecastet werden. Bei Lazarus (FPC) scheints ja zu gehen. Die Frage ist nun, wie kann man das übersetzen?
type
TSynEditMarkChangeReason = ( smcrAdded, smcrRemoved, smcrLine, smcrColumn, smcrVisible, smcrChanged ); TSynEditMarkChangeReasons = set of TSynEditMarkChangeReason; var I: LongInt; R: TSynEditMarkChangeReasons; begin I:= LongInt(R); // <-- Hier kommt "ungültige Typumwandlung" end; Grüße Cody |
AW: SetOf typecasten in LongInt
Und welcher wert im Set soll dann gecastet werden?
|
AW: SetOf typecasten in LongInt
Casten kann nicht gehen, aber Du kannst Dir was basteln
Delphi-Quellcode:
Function SynEditMarkChangeReasons2Int(r:TSynEditMarkChangeReasons):LongInt; begin Result := 0; Move(r,Result,SizeOf(r)); end; Function Int2SynEditMarkChangeReasons(i:LongInt):TSynEditMarkChangeReasons; begin Result := []; Move(i,Result,SizeOf(TSynEditMarkChangeReasons)); end; procedure TForm3.Button1Click(Sender: TObject); var r,r2:TSynEditMarkChangeReasons; i:LongInt; begin r := [smcrAdded,smcrChanged]; r2 := []; Caption := IntToStr(SizeOf(r)); i := SynEditMarkChangeReasons2Int(r); r2 := Int2SynEditMarkChangeReasons(i); if r2= [smcrAdded,smcrChanged] then Showmessage('Passt'); end; |
AW: SetOf typecasten in LongInt
Ja ne, genau das hab ich mich auch gefragt. :wiejetzt:
Ich habe den Source stark vereinfacht hier gepostet da das sehr komplex ist. Konkret versuche ich, die Lazarus-Version von SynEdit nach Delphi zu backporten und da stößt man schon auf sehr viele FPC-eigene Konstrukte. Konkret einsehbar wäre das ![]() ![]() |
AW: SetOf typecasten in LongInt
Dein TSynEditMarkChangeReasons ist ein Byte und kein LongWord/LongInt also ist es vollkommen korrekt, daß es sich nicht casten läßt. :warn:
Set: 1-8 Werte = Byte 9-16 Werte = Word 17-32 Werte = LongWord (eigentlich gibt es keine Vorzeichen im SET, aber notfalls ginge auch LongInt) Enum: 1-256 Werte = Byte 257-65536 Werte = Word 65537-4294967296 Werte = LongWord Beim ENUM kann man aber über {$MINENUMSIZE} die minimale Byte-Größe festlegen, was es beim SET leider nicht gibt. [edit] Nein, das Casten geht schon. Besser das Casten benutzen, als wilde Speicheroperationen, aber wenigstens nutzt du noch SetOf und nicht irgendwelche "Konstanten". Aber, wenn man nicht weiß wie groß der Cast sein muß, dann kann man das
Delphi-Quellcode:
benutzen, um nachzusehn.
Caption := IntToStr(SizeOf(r));
|
AW: SetOf typecasten in LongInt
Eine Byte kann man problemlos in einen LognInt casten ( 8 Bit unsinged geht problemlos in eine 32Bit signed). aber Ein Set von Bytewerten lässt sich imho nicht sinnvoll in einen Wert wandeln.
|
AW: SetOf typecasten in LongInt
Zitat:
|
AW: SetOf typecasten in LongInt
Es sind wirklich nur Bitmasken.
Ich glaub das ging bis 256 Werte, also weiter mit UInt64 und Größeres dann als Record mit vielen LongWords, bzw. als statisches Array of LongWord (maximal 8 LongWord). Es ginge zwar theoretisch mehr, aber die verwendeten Assembler-Befehle (BT, BTS, BTR, und BTC) verwenden vom Indexregister nur das unterste Byte. |
AW: SetOf typecasten in LongInt
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 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