Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ungewöhliches record (https://www.delphipraxis.net/15591-ungewoehliches-record.html)

moin339 31. Jan 2004 22:41


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:
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}
ciao, moin339 :coder:

SirThornberry 31. Jan 2004 22:48

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]

moin339 31. Jan 2004 22:54

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

SirThornberry 31. Jan 2004 23:00

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;

moin339 31. Jan 2004 23:02

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

SirThornberry 31. Jan 2004 23:09

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

moin339 31. Jan 2004 23:11

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

SirThornberry 31. Jan 2004 23:17

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

Leuselator 31. Jan 2004 23:43

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:
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;
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)

Man spart also Speicher und gewinnt unter Umständen ein wenig Komfort.

Gruß


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