Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Case Abfrage in Recorddeklaration ??? (https://www.delphipraxis.net/118862-case-abfrage-recorddeklaration.html)

mr_emre_d 16. Aug 2008 17:12


Case Abfrage in Recorddeklaration ???
 
Code:
  TBefehl=record
    Case Typ:TBefehlsTyp of
      BT_STAND:();
      BT_MOVE:(X,Y:Word);
  end;
Wie ist das zu verstehen ? Ich möchte nur wissen, was das Case bei einer Typendeklaration ( record ) zu verloren hat !

Gegoogelt hab ich auch schon nach "delphi case in record" aber bin nicht fündig geworden !

Danke im vorraus :D

MfG

grenzgaenger 16. Aug 2008 17:15

Re: Case Abfrage in Recorddeklaration ???
 
Delphi-Referenz durchsuchenvariante records

taaktaak 16. Aug 2008 17:16

Re: Case Abfrage in Recorddeklaration ???
 
z.B. hier steht etwas zur Fragestellung

mr_emre_d 16. Aug 2008 17:45

Re: Case Abfrage in Recorddeklaration ???
 
ich verstehe es einfach nicht !

Code:
_TRIGGER_TYPE_UNION = packed record
    case Integer of
      0: (Daily: DAILY);
      1: (Weekly: WEEKLY);
      2: (MonthlyDate: MONTHLYDATE);
      3: (MonthlyDOW: MONTHLYDOW);
    end; // das hier fehlte
  end;
...
  blubb := rec.Daily // Hat hier blubb anschließend den Wert 0 ??? bzw Weekly den Wert 1 usw. ?

Neutral General 16. Aug 2008 17:52

Re: Case Abfrage in Recorddeklaration ???
 
Hi,

Delphi-Quellcode:
TColorRec = record
  case Integer of
    1: (r,g,b: Byte);
    2: (ColorArray: Array[0..2] of Byte);
    3: (Color: TColor);
  end;
Das ist denke ich mal ein gutes Beispiel.

(r,g,b,a), (ColorArray) und (Color) belegen hier den gleichen Speicher. Die Art wie auf diesen Speicher zugegriffen dieser Speicher interpretiert wird unterscheidet sich nur.

Delphi-Quellcode:
var
  Color: TColorRec;

begin
  Color.r := 255;
  Color.g := 0;
  Color.b := 255;

  Panel1.Color := RGB(Color.r,Color.g,Color.b);
  Panel2.Color := RGB(Col.ColorArray[0],Col.ColorArray[1],Col.ColorArray[2]);
  Panel3.Color := Color.Color;
end;
Damit kann man sich das verdeutlichen ;)

Edit: Zum 543 mal geändert -.-^^

Christian Seehase 16. Aug 2008 17:58

Re: Case Abfrage in Recorddeklaration ???
 
Moin Michael,

Zitat:

Zitat von Neutral General
Die Art wie auf diesen Speicher zugegriffen wird unterscheidet sich nur.

Ich würde sagen:
Die Unterscheidung besteht darin, wie der Speicherinhalt zu interpretieren ist.

Neutral General 16. Aug 2008 18:02

Re: Case Abfrage in Recorddeklaration ???
 
Hi,

Ok du hast Recht. Ist ein bisschen schlecht ausgedrückt. Habe aber das richtige gemeint :mrgreen:

*Obigen beitrag editiere*

mr_emre_d 16. Aug 2008 18:25

Re: Case Abfrage in Recorddeklaration ???
 
OK, wie man darauf zugreift habe ich schon verstanden ( gibts eh nichts zu verstehen, ist logisch )

aber erkär mir mal das hier
Code:
TColorRec = record
  case Integer of
    1: ... // was macht das Case Integer of und 1, 2, 3 ...

EDIT:
Zitat:

(r,g,b,a), (ColorArray) und (Color) belegen hier den gleichen Speicher
Den gleichen Speicher ? heißt das dann, dass r denselben wert hat wie Coloarray[0] und g = Colorarray[1] usw ?
Oder meinst du vlt., dass sie die gleiche Größe haben ? Wenn nicht, dann ist das ja ziemlich interessant :D

Neutral General 16. Aug 2008 18:28

Re: Case Abfrage in Recorddeklaration ???
 
Compilier mal meinen Code und probiers aus.

mr_emre_d 16. Aug 2008 18:30

Re: Case Abfrage in Recorddeklaration ???
 
Code:
  ColRec.r := 255;
  ColRec.g := 0;
  ColRec.b := 0;
  Form1.Color := ColRec.Color;
das ist mal geil :D und könntest du mir schnell erklären was das case integer of macht ?

DeddyH 16. Aug 2008 18:35

Re: Case Abfrage in Recorddeklaration ???
 
Zitat:

Zitat von Online-Hilfe
Ein Record-Typ kann einen varianten Teil enthalten, der einer case-Anweisung ähnelt. Dieser variante Teil muss in der Typdeklaration nach den Feldern angegeben werden.

Mit der folgenden Syntax deklarieren Sie einen Record-Typ mit einem varianten Teil:

Delphi-Quellcode:
type RecordTypName = record
   Felderliste1: Typ1;
     ...
   Felderlisten: Typn;
   case Tag: Ordinaltyp of
   Konstantenliste1: (Variante1);
     ...
   Konstantenlisten: (Varianten);
   end;
Der erste Teil der Deklaration (bis zum reservierten Wort case) ist identisch mit der Deklaration eines Standard-Records. Der Rest der Deklaration (von case bis zum abschließenden optionalen Strichpunkt) stellt den varianten Teil mit folgenden Komponenten dar:

Tag ist optional und kann ein beliebiger, gültiger Bezeichner sein. Wenn Sie Tag weglassen, entfällt auch der Doppelpunkt (:).
Ordinaltyp bezeichnet einen ordinalen Typ.
Jede Konstantenliste ist eine Konstante (oder eine Liste von Konstanten, die durch Kommas voneinander getrennt sind), die einen Wert des Typs Ordinaltyp bezeichnet. In allen Konstantenlisten darf jeder Wert nur einmal vorkommen.

Variante ist eine Liste mit Deklarationen, die durch Semikolons voneinander getrennt sind. Die Liste ähnelt in etwa den Felderliste: Typ-Konstruktionen im Hauptteil des Record-Typs. Variante hat demnach folgende Form:
Felderliste1: Typ1;
...
Felderlisten: Typn;
Dabei ist Felderliste ein gültiger Bezeichner oder eine Liste von Bezeichnern, die durch Kommas voneinander getrennt sind. Typ ist ein Typ. Der letzte Strichpunkt ist optional. Bei Typ darf es sich nicht um einen langen String, ein dynamisches Array, eine Variante (Typ Variant) oder eine Schnittstelle handeln. Strukturierte Typen, die lange Strings, dynamische Arrays, Varianten oder Schnittstellen enthalten, sind ebenfalls nicht zulässig.

Zeiger auf diese Typen dürfen jedoch verwendet werden. Die Syntax für Records mit varianten Teilen ist kompliziert, ihre Semantik ist jedoch einfach. Der variante Teil eines Records enthält mehrere Varianten, die sich denselben Speicherplatz teilen. Auf die Felder einer Variante kann jederzeit ein Lese- oder Schreibzugriff ausgeführt werden. Wenn Sie allerdings zunächst in ein Feld einer Variante schreiben und anschließend in ein Feld einer anderen Variante, kann das zum Überschreiben der eigenen Daten führen. Falls vorhanden, agiert Tag als gesondertes Feld (des Typs Ordinal) im nichtvarianten Teil des Records.

Variante Teile erfüllen zwei Funktionen, die sich am besten anhand eines Beispiels verdeutlichen lassen. Angenommen, Sie möchten einen Record-Typ erstellen, der Felder für unterschiedliche Daten enthält. Sie wissen, dass Sie nie alle Felder einer einzelnen Record-Instanz benötigen werden. Ein Beispiel:

Delphi-Quellcode:
type
  TEmployee = record
  FirstName, LastName: string[40];
  BirthDate: TDate;
  case Salaried: Boolean of
    True: (AnnualSalary: Currency);
    False: (HourlyWage: Currency);
end;
Diesem Beispiel liegt die Überlegung zugrunde, dass ein Angestellter entweder ein jährliches Festgehalt (AnnualSalary) oder einen Stundenlohn (HourlyWage) erhält, und dass für einen Angestellten immer nur eine der Zahlungsarten in Frage kommt. Wenn Sie eine Instanz von TEmployee anlegen, braucht also nicht für beide Felder Speicherplatz reserviert zu werden. In diesem Beispiel unterscheiden sich die Varianten nur durch die Feldnamen. Die Felder könnten aber auch unterschiedliche Typen haben. Hier einige komplexere Beispiele:

Delphi-Quellcode:
type
  TPerson = record
  FirstName, LastName: string[40];
  BirthDate: TDate;
  case Citizen: Boolean of
    True: (Birthplace: string[40]);
    False: (Country: string[20];
            EntryPort: string[20];
            EntryDate, ExitDate: TDate);
  end;
type
  TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
  TFigure = record
    case TShapeList of
      Rectangle: (Height, Width: Real);

      Triangle: (Side1, Side2, Angle: Real);
      Circle: (Radius: Real);
      Ellipse, Other: ();
  end;
Der Compiler weist jeder Record-Instanz so viel Speicherplatz zu, wie die Felder in der größten Variante benötigen. Die optionalen Komponenten Tag und Konstantenliste (wie Rectangle, Triangle usw. im letzten Beispiel) spielen für die Art und Weise, wie der Compiler die Felder verwaltet, keine Rolle. Sie erleichtern lediglich die Arbeit des Programmierers.

Wie bereits erwähnt, erfüllen variante Teile noch eine zweite Aufgabe. Sie können dieselben Daten so behandeln, als würden sie zu unterschiedlichen Typen gehören. Dies gilt auch in den Fällen, in denen der Compiler eine Typumwandlung nicht zulässt. Wenn beispielsweise das erste Feld einer Variante einen 64-Bit-Real-Typ und das erste Feld einer anderen Variante einen 32-Bit-Integer-Wert enthält, können Sie dem Real-Feld einen Wert zuweisen und anschließend die ersten 32 Bits als Integer-Wert verwenden (indem Sie sie beispielsweise an eine Funktion übergeben, die einen Integer-Parameter erwartet).


Neutral General 16. Aug 2008 18:37

Re: Case Abfrage in Recorddeklaration ???
 
Hi,

Das

Delphi-Quellcode:
case Integer of
Dient einfach nur dem Compiler mitzuteilen welche Variablen sich zusammen einen Speicher teilen.

Ich kanns grad nicht besser erklären. Es hat keinen richtigen Sinn. So ist eben halt die Syntax :mrgreen:

mr_emre_d 16. Aug 2008 18:53

Re: Case Abfrage in Recorddeklaration ???
 
Ok, ich glaube ich habe es verstanden ! Danke für die schnellen Antworten Neutral General und DeddH !

MfG


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