Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Enumval in Delphi darstellen (https://www.delphipraxis.net/59193-enumval-delphi-darstellen.html)

HariboHunter 19. Dez 2005 10:10


Enumval in Delphi darstellen
 
Hiho,

ich hab hier nen C## Code.

Code:
ENUMDEF(KS_ACCESS)
#define KS_AC_NONE         ENUMVAL(KS_ACCESS, 0) /* no access at all     */
#define KS_AC_READ         ENUMVAL(KS_ACCESS, 1) /* read access          */
#define KS_AC_WRITE        ENUMVAL(KS_ACCESS, 2) /* write access         */
#define KS_AC_READWRITE    (KS_AC_READ | KS_AC_WRITE)

#define KS_AC_DELETEABLE   ENUMVAL(KS_ACCESS, 0x10000000)
#define KS_AC_RENAMEABLE   ENUMVAL(KS_ACCESS, 0x08000000)
#define KS_AC_LINKABLE     ENUMVAL(KS_ACCESS, 0x04000000)
#define KS_AC_UNLINKABLE   ENUMVAL(KS_ACCESS, 0x02000000)

    /* object can act as a factory */
#define KS_AC_INSTANTIABLE ENUMVAL(KS_ACCESS, 0x20000000)
    /* object is part of another object */
#define KS_AC_PART         ENUMVAL(KS_ACCESS, 0x80000000)
hier werden in einer Cardinal Bits gesetzt.
Kombinationen wie z.B: 0xBE000002 können auftreten.
Ich bin nun am Rätseln, wie ich nun aus der Zahl die entsteht, herauslesen kann, ob nun Das KS_AC_PART gesetzt ist, oder eben nicht. Oder das KS_AC_READ ... etc. Sitze aufm Schlauch.

marabu 19. Dez 2005 10:20

Re: Enumval in Delphi darstellen
 
Könnte so aussehen:

Delphi-Quellcode:
function Test(bits, mask: cardinal): boolean;
begin
  // Result := bits and mask <> 0; // funktioniert nur mit Ein-Bit-Test
  Result := bits and mask = mask; // testet auch Bit-Felder
end;

begin
  if Test(KS_ACCESS, KS_AC_PART)
    then ShowMessage('Stimmt')
    else ShowMessage('Falsch');
end;
Grüße vom marabu

chaosben 19. Dez 2005 10:25

Re: Enumval in Delphi darstellen
 
Du solltest mit den AND-Befehl zum Ziel kommen.

Hier mal ein wenig Theorie:
Du hast ein 8-Bit-Zahl (aka Byte :) ) 123 und du willst testen, ob das 6. Bit (=2^5=32) gesetzt ist. Da ergibt sich folgende Darstellung
Code:
____1111011B
AND 0010000B
------------
=  0010000B
In Delphi würde das Ganze so aussehen:
Delphi-Quellcode:
Zahl:=123;
TestZahl:=32;
if (Zahl and Testzahl)=Testzahl then
  //Oleee
Auf diese Weise kannst du testen, ob ein Flag gesetzt ist oder nicht

//btw: Beim Schreiben ist mir aufgefallen, das in der Delphi-Hilfe ein Beispiel dafür drin ist, dort aber die Bedingung anders lautet: if (Zahl and Testzahl)=Zahl .... Irgendwie bin ich nun ein wenig verwirrt. Aber das was ich oben geschrieben habe, ist das was ich in der Ausbildung gelernt habe.

HariboHunter 19. Dez 2005 10:48

Re: Enumval in Delphi darstellen
 
Hmm unter welchen Stichworten hast Du denn in der Hilfe geschaut?

Aber zunächst einmal Danke für die Antworten.
/me hat noch große Wissenslücken :stupid: .

generic 19. Dez 2005 15:41

Re: Enumval in Delphi darstellen
 
enum mit definierten werten gibt es im delphi sprachumfang nicht.

enum's fangen immer bei null in delphi an.

z.b.:
Delphi-Quellcode:
type
  einEnum = (eE_Wert1, eE_Wert2, eE_Wert3);
  einSetEnum = set of einEnum;

dizzy 19. Dez 2005 15:45

Re: Enumval in Delphi darstellen
 
Zitat:

Zitat von generic
enum mit definierten werten gibt es im delphi sprachumfang nicht.

enum's fangen immer bei null in delphi an.

Nope, folgendes ist ebenso möglich:
Delphi-Quellcode:
  TBla = (bLoop = 1, bJupp = 2, bHolla = 4);


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