Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variantes Record mit 2x Case (https://www.delphipraxis.net/16097-variantes-record-mit-2x-case.html)

Steffen 10. Feb 2004 11:36


Variantes Record mit 2x Case
 
Hallo!

Ich habe gerade folgenden Code zusammen "gefuscht":

Delphi-Quellcode:
type

  // Aufzählungstyp enthält alle Felder in denen gesucht werden kann
  TSearchFields = (sfTrackingID, sfSender, sfRecipient, sfSubject, sfMsgText);

  TSearchDetails = record
                     SearchText : String;
                     MaxResults : Word; // 0 = alle Ergebnisse liefern

                     case SearchOverAllFields : Boolean of // Suche über alle Felder?
                       True : (); // Keine Angabe von Suchfeldern, da Suche über alle Felder
                       False : (SearchFields : TSearchFields);

                     case DatePeriodIndicated : Boolean of // Datumszeitraum angegeben?
                       True : ( DateFrom : String[10]; // DD.MM.YYYY
                                 DateTo  : String[10]);
                       False : ();
                   end;
Nun stoße ich gerade auf das Problem, dass es eigentlich nur einen case-Teil in einem Record geben kann...
Hat jemand einen Vorschlag, wie ich's lösen kann?

Gruß,
Steffen

Brüggendiek 10. Feb 2004 12:02

Re: Variantes Record mit 2x Case
 
Hallo Steffen!

Wie ich an Deinem Record sehe, sind die Varianten so gestaltet, daß sie entweder etwas enthalten oder leer sind. Das ist keine echte Variante, denn die Variablen werden auf jeden Fall im Record angelegt.

Lasse einfach die Varianten weg und das Problem ist gelöst. Bei der Benutzung der Daten muß ja auf jeden Fall das Flag abgefragt werden.

Ein varianter Record ist dann angebracht, wenn es unterschiedliche Daten in den Varianten gibt, z.B. bei
Delphi-Quellcode:
type
  tGeschlecht = (maennlich, weiblich);

  tPerson = record
    namen, vornamen, telefonnummer : string;
    case geschlecht : tGeschlecht of
      maennlich : (barttraeger : Boolean);
      weiblich : (silikonmonster : Integer); {Gewicht der Silikon-Einlagen in Gramm}
  end;
(Es ist mir bekannt, daß der Datentyp bei Katie Price wegen zu geringen Datenbereichs nicht anwendbar ist :mrgreen: - dann Int64 benutzen)

Gruß

Dietmar Brüggendiek

Steffen 10. Feb 2004 12:10

Re: Variantes Record mit 2x Case
 
Hallo Brüggendiek!
Zitat:

Wie ich an Deinem Record sehe, sind die Varianten so gestaltet, daß sie entweder etwas enthalten oder leer sind. Das ist keine echte Variante, denn die Variablen werden auf jeden Fall im Record angelegt.
Das ist nicht ganz richtig. Für mich ist zum Beispiel bei dieser Variante:
Delphi-Quellcode:
                     case SearchOverAllFields : Boolean of // Suche über alle Felder?
                       True : (); // Keine Angabe von Suchfeldern, da Suche über alle Felder
                       False : (SearchFields : TSearchFields);
von Bedeutung, ob "SearchOverAllFields" gesetzt ist, oder nicht.

Die Logik ist die:
Wenn eine Suche über alle Felder gemacht wird, brauche ich nicht explizit anzugeben welche Felder ich nutzen möchte.
Wenn aber nicht über alle Felder gesucht werden soll, muss ich die einzelnen Felder speichern.
Somit ist das Flag "SearchOverAllFields" nicht nur als "Umschalter" gedacht...

Außerdem ist der Code, so wie ich ihn mit den Varianten gestaltet habe übersichtlicher und leicher zu verstehen.
Ich würde also schon gerne des Konstrukt nahezu unverändert lassen...

Brüggendiek 10. Feb 2004 12:35

Re: Variantes Record mit 2x Case
 
Hallo Steffen!

Ich fürchte, bei Dir fehlen die Grundlagen über Variante Records.

Wenn Du das hast:
Delphi-Quellcode:
                     case SearchOverAllFields : Boolean of // Suche über alle Felder?
                       True : (); // Keine Angabe von Suchfeldern, da Suche über alle Felder
                       False : (SearchFields : TSearchFields);
kannst Du unabhängig vom Wert der Variablen "SearchOverAllFields" auf die Variable "Searchfields" zugreifen. In diesem Fall könnte noch helfen, daß Du den Typ anders definierst:
Delphi-Quellcode:
TSearchFields = (sfNone, sfTrackingID, sfSender, sfRecipient, sfSubject, sfMsgText);
und bei "SearchOverAllFields = True" dann "SearchFields:=sfNone" setzt.
Sonst bekommst Du beim Zugriff auf das Element den Wert, der da zufällig im RAM rumlungert - dürfte selten passend sein und bei den Strings auch zu einer niedlichen kleinen AV führen!

Die Varianten sind nur alternative Zugriffsverfahren auf denselben Speicherbereich. Bei meinem Beispiel belegt die Variante 4 Byte, weil die größte Variable ein Integer (4 Bxyte) ist. Der Boolean ist identisch mit einem dieser 4 Bytes.

Bitte packe jetzt das Deutschsein (ich will, daß dsa klappt, also hat das auch zu klappen) weg - einen Gasherd kann man an einer Stromleitung nunmal nicht benutzen!

Es bliebe natürlich noch die Methode, statt der Varianten im Record zwei Recordtypen einzuführen und im Hauptrecord je eine Variable dieser Typen.

Gruß

Dietmar Brüggendiek

Steffen 10. Feb 2004 12:52

Re: Variantes Record mit 2x Case
 
Hallo Dietmar!

Zitat:

kannst Du unabhängig vom Wert der Variablen "SearchOverAllFields" auf die Variable "Searchfields" zugreifen.
Das ist mir schon bewusst.

Zitat:

In diesem Fall könnte noch helfen, daß Du den Typ anders definierst:
Source:
Delphi-Quellcode:
TSearchFields = (sfNone, sfTrackingID, sfSender, sfRecipient, sfSubject, sfMsgText);

Ich denke ich werde einfach den Code:
Delphi-Quellcode:
                     case DatePeriodIndicated : Boolean of // Datumszeitraum angegeben?
                       True : ( DateFrom : String[10]; // DD.MM.YYYY
                                 DateTo  : String[10]);
                       False : ();
ändern. Das ist am schnellsten gemacht.

Vielen Dank erstmal!

Gruß,
Steffen


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