AGB  ·  Datenschutz  ·  Impressum  







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

SetOf typecasten in LongInt

Ein Thema von Codehunter · begonnen am 1. Okt 2012 · letzter Beitrag vom 1. Okt 2012
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

SetOf typecasten in LongInt

  Alt 1. Okt 2012, 11:30
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 11:34
Und welcher wert im Set soll dann gecastet werden?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 12:00
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 12:03
Ja ne, genau das hab ich mich auch gefragt.

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#5

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 12:06
Dein TSynEditMarkChangeReasons ist ein Byte und kein LongWord/LongInt also ist es vollkommen korrekt, daß es sich nicht casten läßt.

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 Caption := IntToStr(SizeOf(r)); benutzen, um nachzusehn.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 1. Okt 2012 um 12:10 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 12:08
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 13:51
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 14:02
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: SetOf typecasten in LongInt

  Alt 1. Okt 2012, 14:56
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 18:29 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