AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ungewöhliches record

Offene Frage von "moin339"
Ein Thema von moin339 · begonnen am 31. Jan 2004 · letzter Beitrag vom 31. Jan 2004
Antwort Antwort
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#1

ungewöhliches record

  Alt 31. Jan 2004, 22:41
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: ungewöhliches record

  Alt 31. Jan 2004, 22:48
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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#3

Re: ungewöhliches record

  Alt 31. Jan 2004, 22:54
@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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: ungewöhliches record

  Alt 31. Jan 2004, 23:00
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#5

Re: ungewöhliches record

  Alt 31. Jan 2004, 23:02
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: ungewöhliches record

  Alt 31. Jan 2004, 23:09
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#7

Re: ungewöhliches record

  Alt 31. Jan 2004, 23:11
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: ungewöhliches record

  Alt 31. Jan 2004, 23:17
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#9

Re: ungewöhliches record

  Alt 31. Jan 2004, 23:43
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ß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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