![]() |
TObject kein ordinaler Typ?
Moin,
ich mach's mal kurz und schmerzlos. Dieses geht,
Delphi-Quellcode:
komischer Weise auch Jenes,
If Integer(Components[i]) in [Integer(Panel1), Integer(Panel2), Integer(Panel3)] Then Begin
Delphi-Quellcode:
aber das nicht,
If Components[i] in [Integer(Panel1), Integer(Panel2), Integer(Panel3)] Then Begin
Delphi-Quellcode:
jedenfalls meckert da der Compiler, vonwegen "ordinaler Typ erforderlich". :gruebel:
If Components[i] in [Panel1, Panel2, Panel3] Then Begin
Warum? |
Re: TObject kein ordinaler Typ?
Weil Sets nur mit ordinalen Typen funktionieren und ein Objekt kein ordinaler Typ ist.
|
Re: TObject kein ordinaler Typ?
Aus dem gleichen Grund, weshalb du nicht Panel2 := Panel1+1 schreiben kannst, würde ich mal vermuten. :roteyes:
|
Re: TObject kein ordinaler Typ?
Zitat:
ein Pointer ist eine Zahl (Cardinal) und eine Zahl ist ein ordinaler Typ. Zitat:
aber intern ist es dennoch ein ordinaler Typ. |
Re: TObject kein ordinaler Typ?
Zitat:
Richtig, weil Objekt-Referenzen nicht implizit zuweisungskompatibel zu diesem Datentyp sind (Stichwort Typensicherheit). Daher gehen auch deine beiden oberen Beispiele, in denen du die Objekt-Referenzen explizit in Integer umcastest, aber im unteren Beispiel versucht der Compiler ein Set zu bauen, geht aber nicht, weils sich ebend nicht in nen ordinalen Typen handelt. |
Re: TObject kein ordinaler Typ?
Kann man das mit den Sets überhaupt so machen?
Gabs da nicht sone "Regel" die besagte, dass Sets nicht mit Datentypen > 1 Byte verwendet werden soll(t)en ? Oder verwechsel ich da (wieder) was? |
Re: TObject kein ordinaler Typ?
Zitat:
|
Re: TObject kein ordinaler Typ?
Zitat:
Integer sind 4 Bytes und die kann er nicht weiter kürzen, weil dann signifikante Stellen verloren gehen. Da würde er warnen und man müsste einen expliziten Cast machen. Implizite Casts macht er nur, wenn keine signifikante Stellen verloren gehen (wie in allen Programmiersprachen). Aber 1 Byte? Wie kommst du auf den Wert? |
Re: TObject kein ordinaler Typ?
Zitat:
|
Re: TObject kein ordinaler Typ?
Zitat:
|
Re: TObject kein ordinaler Typ?
Zitat:
Delphi-Quellcode:
procedure Test;
var i, k: Integer; begin i := MaxInt; k := MaxInt; if k in [Integer(i)] then begin ShowMessage('Integer'); end; k := 255; if k in [Integer(i)] then begin ShowMessage('Byte'); end; end; |
Re: TObject kein ordinaler Typ?
Zitat:
|
Re: TObject kein ordinaler Typ?
Zitat:
|
Re: TObject kein ordinaler Typ?
Mit anderen Worten: Meine Aussagen ist die Theorie, nur CodeGear hat mal wieder Mist gebaut (beim Umsetzen in die Praxis) und gibt keine Warnung aus. Wieder was gelernt - und ein neues Manko einer doch so typensicheren Sprache...
|
Re: TObject kein ordinaler Typ?
Zitat:
|
Re: TObject kein ordinaler Typ?
Es ist aber doch schwachsinnig hier eine compile-time only Meldung einzubauen anstatt auch den runtime Fall mit abzuprüfen.
|
Re: TObject kein ordinaler Typ?
Aktiviert man in den Compileroptionen die Bereichsüberprüfung, bekommt man die Meldung:
Code:
---------------------------
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Project1.exe ist eine Exception der Klasse ERangeError mit der Meldung 'Fehler bei Bereichsprüfung' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- |
Re: TObject kein ordinaler Typ?
Hi himitsu,
ich möchte mal auf deinen Eingangspost eingehen. Dazu ersetze ich die Variablen durch ihre Typbezeichnungen. Dadurch wird der Code zwar syntaktisch falsch, aber vielleicht fällt unseren Spezialisten dann auf, das sie mit ihrer Diskussion über Mengen nicht gerade zur Aufhellung dieses Delphi-Fehlers(?) beigetragen haben:
Delphi-Quellcode:
Beide Seiten des 'IN'-Operators sind vom Typ her identisch. Klar geht das.
If Integer in [Integer, Integer, Integer] Then ...
Delphi-Quellcode:
Äh. Beide Seiten des 'IN'-Operators sind nicht typkompatibel. Ich komme darauf zurück.
If TObject in [Integer, Integer, Integer] Then ...
Delphi-Quellcode:
Gottseidank meckert wenigstens da der Compiler, vonwegen "ordinaler Typ erforderlich". :gruebel:
If TObject in [TObject , TObject , TObject ] Then ...
Wieso geht das Konstrukt '<ObjectRef> IN <OrdinalSet>' durch den Compiler? Hmm. Mal sehen, was die Delphi-OH dazu sagt: In der Tabelle der Mengenoperatoren steht bei 'IN', das die Operatorn "Ordinalwert, Menge" sein müssen. :gruebel: Hupsa. Eine <ObjectRef> ist doch aber kein Ordinalwert. Oder? :shock: Um also himitsus Frage aufzugreifen Zitat:
:wall: Zitat:
|
Re: TObject kein ordinaler Typ?
Ich weiß ja nicht, ob du es ausprobiert hast, oder es einfach geglaubt hast.
Eventuell ist es auch einfach nur zu früh für mich, aber
Delphi-Quellcode:
gibt bei mir einen "E2010 Inkompatible Typen: 'TComponent' und 'Integer'" compiler error.
if Components[i] in [Integer(Panel1), Integer(Panel2), Integer(Panel3)] then ...
Somit dürfte meine Aussage nach wie vor stehen. Schau dir außerdem einmal den asm an, der für ein in-Statement erzeugt wird, dann siehst du, warum ein Hardcast eines 32-Bit Pointers auf ein Integer nix bringt (und warum in der OH das von mir zitierte steht) |
Re: TObject kein ordinaler Typ?
Hatte es ausprobiert, aber wegen eines Fehlers im Set war ich da nicht bis Then gekommen, so daß diese Fehlermeldung noch nicht angezeigt wurde.
|
Re: TObject kein ordinaler Typ?
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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