Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TObject kein ordinaler Typ? (https://www.delphipraxis.net/146461-tobject-kein-ordinaler-typ.html)

himitsu 20. Jan 2010 10:42


TObject kein ordinaler Typ?
 
Moin,

ich mach's mal kurz und schmerzlos.

Dieses geht,
Delphi-Quellcode:
If Integer(Components[i]) in [Integer(Panel1), Integer(Panel2), Integer(Panel3)] Then Begin
komischer Weise auch Jenes,
Delphi-Quellcode:
If Components[i] in [Integer(Panel1), Integer(Panel2), Integer(Panel3)] Then Begin
aber das nicht,
Delphi-Quellcode:
If Components[i] in [Panel1, Panel2, Panel3] Then Begin
jedenfalls meckert da der Compiler, vonwegen "ordinaler Typ erforderlich". :gruebel:


Warum?

Stevie 20. Jan 2010 11:16

Re: TObject kein ordinaler Typ?
 
Weil Sets nur mit ordinalen Typen funktionieren und ein Objekt kein ordinaler Typ ist.

Namenloser 20. Jan 2010 11:18

Re: TObject kein ordinaler Typ?
 
Aus dem gleichen Grund, weshalb du nicht Panel2 := Panel1+1 schreiben kannst, würde ich mal vermuten. :roteyes:

himitsu 20. Jan 2010 11:53

Re: TObject kein ordinaler Typ?
 
Zitat:

Zitat von Stevie
und ein Objekt kein ordinaler Typ ist.

Eine Objektinstanz ist ein Pointer,
ein Pointer ist eine Zahl (Cardinal)
und eine Zahl ist ein ordinaler Typ.

Zitat:

Panel2 := Panel1+1
Das bedeutet nur, daß für diesen Typen keine Arithmetik implementiert ist,
aber intern ist es dennoch ein ordinaler Typ.

Stevie 20. Jan 2010 12:05

Re: TObject kein ordinaler Typ?
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Stevie
und ein Objekt kein ordinaler Typ ist.

Eine Objektinstanz ist ein Pointer,
ein Pointer ist eine Zahl (Cardinal)
und eine Zahl ist ein ordinaler Typ.

Rat mal, warum man eine Object-Referenz explizit casten muss, wenn mans z.B. in der Property Tag speichern möchte?
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.

Neutral General 20. Jan 2010 12:13

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?

Stevie 20. Jan 2010 12:19

Re: TObject kein ordinaler Typ?
 
Zitat:

Zitat von Neutral General
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?

Nein, das stimmt, die Ausdrücke von Himi würden eh nicht hinhauen, weil die auf Integer umgecasteten Objekt-Referenzen auf 1 Byte verkürzt würden.

Muetze1 20. Jan 2010 12:26

Re: TObject kein ordinaler Typ?
 
Zitat:

Zitat von Stevie
Nein, das stimmt, die Ausdrücke von Himi würden eh nicht hinhauen, weil die auf Integer umgecasteten Objekt-Referenzen auf 1 Byte verkürzt würden.

1 Byte? Was? Wo?

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?

Namenloser 20. Jan 2010 12:26

Re: TObject kein ordinaler Typ?
 
Zitat:

Zitat von himitsu
Zitat:

Panel2 := Panel1+1
Das bedeutet nur, daß für diesen Typen keine Arithmetik implementiert ist,
aber intern ist es dennoch ein ordinaler Typ.

Nunja, intern ist so ziemlich alles ein ordinaler Typ. Du kannst auch einen String auf Integer casten und anschließend inkrementieren.

3_of_8 20. Jan 2010 12:35

Re: TObject kein ordinaler Typ?
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von Stevie
Nein, das stimmt, die Ausdrücke von Himi würden eh nicht hinhauen, weil die auf Integer umgecasteten Objekt-Referenzen auf 1 Byte verkürzt würden.

1 Byte? Was? Wo?

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?

Es geht hier aber um Sets, und ein Set über einen 4 Byte großen Zahlentyp kannst du vergessen. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.
Seite 1 von 3  1 23      

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