Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung (https://www.delphipraxis.net/200888-tmeinset-byte-1-variable-ungueltige-typumwandlung.html)

DieDolly 4. Jun 2019 13:14


TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Seit Jahren mache ich das so aber jetzt funktioniert es nicht mehr. Eine ungültige Typumwandlung. Aber wo?
Was ist daran denn falsch? Das sind so wenige Zeilen das gibts doch nicht.

Weiß jemand weiter?

Delphi-Quellcode:
type
 TGroups = (g1, g2, g3);
 TGroupSet = set of TGroups;

var
 GroupSet: TGroupSet;
begin
 GroupSet := TGroupSet(Byte(2));
Komplettes Konsolenbeispiel
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils;

type
 TGroups = (g1, g2, g3);
 TGroupSet = set of TGroups;


var
 GroupSet: TGroupSet;

begin
 GroupSet := TGroupSet(Byte(2));
end.

Union 4. Jun 2019 13:22

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Spontan so:

Delphi-Quellcode:
var
  GroupSet : TGroupSet;
  TempSet : Byte absolute GroupSet;
begin
  TempSet := 2;
end;

DieDolly 4. Jun 2019 13:24

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Das lässt sich beim Keyword absolute nicht kompilieren.^Die ungültiuge Typumwandlung bleibt dann aber auch.

Die Sache ist, dass der Code da oben mit anderen Variablennamen in einem anderen Projekt seit Jahren funktioniert!
Wieso das da oben nicht?

Union 4. Jun 2019 13:25

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Seltsam. Ich hatte es compiliert und debugged bevor ich es geposted habe.

DieDolly 4. Jun 2019 13:28

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Hier eine Konsolenanwendung die nur das beinhaltet. Da kommt die ungültige Typumwandlung auch

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils;

type
 TGroups = (g1, g2, g3);
 TGroupSet = set of TGroups;


var
 GroupSet: TGroupSet;

begin
 GroupSet := TGroupSet(Byte(2));
end.
Ich verstehe langsam die Welt nicht mehr. In anderen Projekten funktioniert das seit Jahren. Entweder ist Delphi kaputt bei mir oder ich habe einen äußerst schrecklichen Copy paste Fehler drin.

Union 4. Jun 2019 13:31

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Zeig doch mal den compilierfähigen Code aus einem anderen Projekt.

DieDolly 4. Jun 2019 13:32

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Das kann ich nicht, da es sich hier um Firmencode handelt. Der ist 1 zu 1 gleich. Nur die Variablennamen sind anders (Wochentage).

Union 4. Jun 2019 13:36

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Dann bau doch ein Beispiel das man compilieren kann, und welches nur aus Deklaration und Zuweisung besteht. Damit verletzt Du dann auch keine Firmengeheimnisse.

DieDolly 4. Jun 2019 13:36

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Zitat:

Dann bau doch ein Beispiel das man compilieren kann, und welches nur aus Deklaration und Zuweisung besteht.
Wenn ich es schaffen würde irgendwas zum Kompilieren zu bringen, würde ich nicht hier um Hilfe bitten ;)

Hier ist der Code aus dem funktionierenden Projekt. Eins zu eins rauskopiert. Andere Variablennamen aber das ist egal denn die Originalnamen lassen sich auch nicht kompilieren.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils;

type
 TDOF = (d1, d2, d3, d4, d5, d6, d7);
 TDOFSet = set of TDOF;

type
 TGroups = (g1, g2, g3);
 TGroupSet = set of TGroups;

var
 Days: TDOFSet;
 GroupSet: TGroupSet;

begin
 Days := TDOFSet(Byte(2));

 GroupSet := TGroupSet(Byte(2));

end.
Das iwr auf das absolute Minimum reduziert und es funktioniert nicht. Irgendwo ist da doch ein Loch im Köse zuviel!

Fritzew 4. Jun 2019 14:16

AW: TMeinSet(Byte(1)) in Variable speichern funktioniert nicht, ungültige Typumwandlu
 
Compilersettings
MinEnumSize steht da wahrscheinlich falsch Word oder Double Word und nicht auf Byte
im deutschen Delphi "Mindestgrösse für Enum"

DieDolly 4. Jun 2019 14:23

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Ich hatte gehofft, das ist es. Aber das steht leider auf Byte :(
Das einzige was anders ist "Optimierung" steht auf False.
Aber mit True gehts auch nicht.

Ich bekomme langsam einen Affen. Wie kann EINE Zeile Code so falsch sein und in einem anderen Projekt seit Jahren korrekt?

Ich habe gerade aber mal den Code vom Eingangsbeitrag in das funktionierende Projekt kopiert. Es funktioniert nicht! :wall:
Liegt das an der Hitze?

Mit anderen Namen gehts nicht.
Delphi-Quellcode:
type
 TABC = (g1, g2, g3);
 TABCSet = set of TABC;

var
 ABCSet: TABCSet;

begin
 ABCSet := TABCSet(Byte(1));

Der schöne Günther 4. Jun 2019 14:31

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Bist du dir sicher dass du nicht in Wirklichkeit
Delphi-Quellcode:
GroupSet := [TGroups(2)];
meintest?

DieDolly 4. Jun 2019 14:36

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Was ich vor habe.

In irgendeiner Datei steht eine Zahl 3. Oder irgendeine andere. Welche ist egal.
Die 3 steht in diesem Fall für g2 und g3 zusammen. Glaube ich jedenfalls. Das ist aber auch alles total egal denn in einem anderen Projekt funktioniert das mit Wochentagen seit Jahren. Ich habe ein Set of TWochenTage beginnend mit Montag und statt eine lange Liste von Wochentagen als string speichere ich die angeklickten Werte als Byte Wert ab.
Einfacher gesagt speichere ich die Byte-Werte der Indexe der Enums ab und prüfe später mit
Delphi-Quellcode:
in
ob Enum 123 in diesem Wertebereich liegt.

Delphi-Quellcode:
GroupSet := [TGroups(2)]
So habe ich es noch nie gemacht und das lässt sich auch nicht kompilieren. So wie es im Eingangspost steht mache ich das seit Jahren aber wieso funktioniert das jetzt nicht mehr? Das ist doch verhext!

Von Stackoverflow habe ich dieses Beispiel rauskopiert und in einer leeren Konsolenanwendung übernommen. Was erhalte ich? Ja, eine ungültige Typumwandlung. Ich habe absolut keine Ahnung mehr woran das liegen soll
Delphi-Quellcode:
type
  TXSamples = set of TXSample;
var
  XSamples: TXSamples;
begin
  ValueToStoreInDB := Integer(XSamples);
  Integer(XSamples) := ValueReadFromDB;
end;
Wer mir nicht glaubt, versucht es selbst. Hier ist die minimale Anwendung
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
 System.SysUtils;

type
 TGroups = (g1, g2, g3);
 TGroupSet = set of TGroups;


var
 GroupSet: TGroupSet;

begin
 GroupSet := TGroupSet(Byte(2));
end.

jottkaerr 4. Jun 2019 14:56

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Bist Du sicher, dass Du auch früher schon Integer-Literale direkt gecastet hast? Wenn ich statt
Delphi-Quellcode:
var
  GroupSet: TGroupSet;
begin
  GroupSet := TGroupSet(Byte(2));
end.
Delphi-Quellcode:
var
  b: Byte;
  GroupSet: TGroupSet;
begin
  b := 2;
  GroupSet := TGroupSet(b);
end.
schreibe, funktioniert's.

DieDolly 4. Jun 2019 14:57

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Ich lese Zahlen aus einer Inidatei aus. Mehr nicht. Alles ganz genau so wie ich es hier mehrfach geschrieben habe. Ich bin mir sicher!

Klaus01 4. Jun 2019 14:57

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
.. mit welcher Delphi Version funktioniert es denn?
Habe es gerade mit Delpi XE getestet - "Invalid typecast"

Grüße
Klaus

DieDolly 4. Jun 2019 14:59

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
10.3 ce.

Klaus01 4. Jun 2019 15:04

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
.. mit 10.3.1 (nicht CE) tritt auch "Invalid typecast" auf.

Grüße
Klaus

jottkaerr 4. Jun 2019 15:06

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Zitat:

Zitat von DieDolly (Beitrag 1433867)
Ich lese Zahlen aus einer Inidatei aus. Mehr nicht. Alles ganz genau so wie ich es hier mehrfach geschrieben habe. Ich bin mir sicher!

Dann stehen Deine Ausgangswerte für den Cast aber in Variablen und nicht als Literale im Quelltext, wie es in Deinen Beispielen bislang der Fall war. Mit Variablen funktioniert der Cast in Delphi 2010 und 10.1.

hoika 4. Jun 2019 15:06

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Hallo,
also bei mir muss "Erweiterte Syntax" (D2007) bei den Compiler-Optionen aus sein,
dann meckert Delphi nicht mehr.

jottkaerr 4. Jun 2019 15:11

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Zitat:

Zitat von hoika (Beitrag 1433874)
Hallo,
also bei mir muss "Erweiterte Syntax" (D2007) bei den Compiler-Optionen aus sein,
dann meckert Delphi nicht mehr.

Der Wert dieser Option macht bei Delphi 10.1 keinen Unterschied -- es funktioniert mit dem Original-Beispiel in beiden Fällen nicht.

DieDolly 4. Jun 2019 15:11

AW: Ungelöst: TMeinSet(Byte(1)) in Variable > ungültige Typumwandlung
 
Zitat:

Dann stehen Deine Ausgangswerte für den Cast aber in Variablen und nicht als Literale im Quelltext,
Ich habe das eben auch durchgetestet.

Es funktioniert besser, wenn die Zahl in einer Variable steht. Danke. Beim Ini-auslesen lese übergebe ich Ini.ReadInteger direkt in derselben Zeile. Das war es wohl.

:wall:
:wall:
:wall:


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