![]() |
ungewöhliches record
Moin!
Ich habe diesen Code in der Delphi Fundgrube gefunden. Jetzte frage ich mich allerdings wie dieses record genau funktioniert. Ich habe vorher so etwas noch nie gesehen. Kann mir jemand erklären wie der Integer-Wert damit in die vier Bytes aufgeteilt wird? Was bedeuteten die 0 und die 1?
Delphi-Quellcode:
ciao, moin339 :coder:
function ColorToHTMLColor(Color: TColor): String;
var C: packed record case Integer of 0: (Int: LongInt); 1: (B0, B1, B2, B3: Byte); end; H: Byte; begin // convert negative (SysColor) values like clBtnFace C.Int := ColorToRGB(Color); // red value of TColor is in byte 0, of HTML in byte 2: swap H := C.B0; C.B0 := C.B2; C.B2 := H; // output hex value Result := Format('"#%.6x"', [C.Int]); end; {Michael Winter} |
Re: ungewöhliches record
hab sowas auch noch nicht gesehen aber würd das mal so deuten:
wenn du C, 0 zuweist wird es als 0 gesehen ansonsten als wird einfach der speicher des integers so gestückelt das es jeweils als byte verfügbar ist... naja, eigentlich war die erklärung jetzt auch quatsch da man so und so drauf zugreifen kann. Es sieht für mich so aus als ob es ein Integer ist und um die programmierung einfacher zu gestalten ist es mit dieser variante möglich dann auf die einzelnen bytes zuzugreifen. Ist hilfreich bei Farben. Da gibts ja auch r,g,b aber letztendlich ist es eine große zahl. Und so erspart man sich das typecast zumindest siehts so einfacher aus... schwer zu beschreiben [Edit] Ich glaub ich hab den Record geschnallt Also stell dir vor der Record ist ein Auto Du kannst dann einfach sagen myautorecord.Gesamt := Opel; oder myautorecord.teil1 := motor; myautorecord.teil2 := rest; im prinzip entspricht myautorecord.gesamt dem gleichen wie myautorecord.teil1 + myautorecord.teil2 ist halt nur zum besseren sourceschreiben so gemacht das man das einmal als gesamt ansprechen kann oder über die einzelteile [/Edit] |
Re: ungewöhliches record
@SirThornberry: So ähnlich habe ich mir das auch gedacht, aber ich möchte es gerne genau wissen ;)
edit: zu deinem edit: aber warum wird der ColorWert dann C.int zugewiesen und wie kommt er dann schließlich in die vier eizelnen variablen? gibt es noch eine andere möglichkeit das Integer in die 4 einzelnen Bytes zu zerlegen. Das ist nämlich eigentlich mein Ziel. ciao, moin339 |
Re: ungewöhliches record
ganz einfach
Delphi-Quellcode:
type
Tmyrecord = record bytea: Byte; byteb: Byte; bytec: Byte; byted: Byte; end; [...] var a: Integer; b: TMyRecord; c: ^TMyRecord; begin a := 500; b := TMyRecord(a); //und schon kannst du über b.bytea auf das erste byte zugreifen (kopiezugriff) //weitere möglichkeit c := @a; //und auch jetzt kannst du über c.bytea auf das erste byte zugreifen (direktzugriff) end; |
Re: ungewöhliches record
danke. dann mach ich das lieber so.
Direkter Zugriff müsste doch auch so gehen oder: TMyRecord(a).bytea ? edit: Und wo liegt jetzt der Vorteil bei der oberen Variante? ciao, moin339 |
Re: ungewöhliches record
direktzugriff spart resourcen da du ja einen zeiger aufs orginal hast.
die andere art ist sinnvoll wenn du dein orginal-integer nicht überschreiben willst aber trotzdem mit den bytes rumändern willst. Wenns aber nur ums auslesen geht ist eindeutig direktzugriff günstiger |
Re: ungewöhliches record
sorry habe mich schlecht ausgedrückt. Das mit dem direktzugriff ist klar. Ich meine wo der Vorteil von der Variante aus der Delphi-Fundgrube ist?
ciao, moin339 |
Re: ungewöhliches record
seh da keinen vorteil, sieht einfach nur komplizierter aus und man kann auf die zwischenvariablen und das typecast verzichten weil der recordtype das schon implementiert
|
Re: ungewöhliches record
Ihr redet die ganze zeit über Variante Records - schaut mal in der OH unter "Recordtypen" - und "Variante Teile in Record-Typen"
Der Vorteil ist z.B. folgender:
Delphi-Quellcode:
Die Beispiele mögen an den buchstäblichen Haaren herbeigezogen sein, Hintergrund ist aber, dass man häufig unterschiedliche Werte bei eunterschiedlichen Entitäten vorfindet und nicht in einem Record allzuviel warme Luft durch die Gegend schaukeln möchte, indem man alle eventuell vorkommenden Felder deklariert, wenn sich einige davon gegenseitig ausschließen. (Was für ein Satz)
type
TMyPerson = Record Vorname : String; Name : String; Geburtstag : datetime; case Mann : Boolean of True: (Bankdruecken : Integer; Barttraeger : Boolean; Nassrasierer : Boolean); False:(BH_Groesse : Integer; Blond : Boolean; Nagellackverwenderin : Boolean); end; Man spart also Speicher und gewinnt unter Umständen ein wenig Komfort. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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