Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SetOf typecasten in LongInt (https://www.delphipraxis.net/170732-setof-typecasten-longint.html)

Codehunter 1. Okt 2012 10:30

SetOf typecasten in LongInt
 
Hallo!

Wie kann ich folgenden (auszugsweisen) Lazarus-Code nach Delphi übersetzen?
Delphi-Quellcode:
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;
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?

Grüße
Cody

mkinzler 1. Okt 2012 10:34

AW: SetOf typecasten in LongInt
 
Und welcher wert im Set soll dann gecastet werden?

Bummi 1. Okt 2012 11:00

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;

Codehunter 1. Okt 2012 11:03

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 hier in Zeile 1157 (Variable "Changes"). Die Funktion AddBitFilter findest du hier in Zeile 1687.

himitsu 1. Okt 2012 11:06

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:
Caption := IntToStr(SizeOf(r));
benutzen, um nachzusehn.

mkinzler 1. Okt 2012 11:08

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.

Namenloser 1. Okt 2012 12:51

AW: SetOf typecasten in LongInt
 
Zitat:

Zitat von himitsu (Beitrag 1185228)
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)

Aber war ein Set nicht doch ein bisschen mehr als nur eine einfache Bitmaske? Oder gehen da echt nur 32 mögliche Zustände rein und es ist mir bloß nie aufgefallen?

himitsu 1. Okt 2012 13:02

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.

Uwe Raabe 1. Okt 2012 13:56

AW: SetOf typecasten in LongInt
 
Zitat:

Zitat von NamenLozer (Beitrag 1185246)
Aber war ein Set nicht doch ein bisschen mehr als nur eine einfache Bitmaske? Oder gehen da echt nur 32 mögliche Zustände rein und es ist mir bloß nie aufgefallen?

Siehe auch hier: TIntegerSet


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