Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Record zum Teil als Konstante und Variable? (https://www.delphipraxis.net/203885-record-zum-teil-als-konstante-und-variable.html)

NoGAD 3. Apr 2020 09:00

Record zum Teil als Konstante und Variable?
 
Hallo,

ist es möglich, dass man einen Record erstellt und den später zum Teil als Variable und zum Teil als Konstante deklariert?

Delphi-Quellcode:
type
  TmyRecord = record
    String_1: String;
    String_2: String;
    Boolean1: Boolean;
    Boolean2: Boolean;
    Boolean3: Boolean;
  end;

Nun wäre es für mich interessant, ob zum Beispiel die Strings als Variablen und die Boolean ans Konstante festgelegt werden könnten.

LG Mathias

TiGü 3. Apr 2020 09:20

AW: Record zum Teil als Konstante und Variable?
 
Ja.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}


uses
  System.SysUtils;

type
  TmyRecord = record
  var
    String_1: String;
    String_2: String;

  const
    Boolean1: Boolean = True;
    Boolean2: Boolean = False;
    Boolean3: Boolean = True;
  end;

var
  FooBar: TmyRecord;

begin
  try
    FooBar.String_1 := 'Hello';
    FooBar.String_2 := 'World!';
    Writeln(FooBar.String_1, ' ', FooBar.String_2, ' ', FooBar.Boolean1, ' ', FooBar.Boolean2, ' ', FooBar.Boolean3);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

NoGAD 3. Apr 2020 10:16

AW: Record zum Teil als Konstante und Variable?
 
Vielen Dank!

Das ist ja einfacher, als vermutet. :oops:

dummzeuch 3. Apr 2020 10:21

AW: Record zum Teil als Konstante und Variable?
 
Zitat:

Zitat von NoGAD (Beitrag 1461137)

ist es möglich, dass man einen Record erstellt und den später zum Teil als Variable und zum Teil als Konstante deklariert?

Delphi-Quellcode:
type
  TmyRecord = record
    String_1: String;
    String_2: String;
    Boolean1: Boolean;
    Boolean2: Boolean;
    Boolean3: Boolean;
  end;

Kommt drauf an, was Du meinst:

Delphi-Quellcode:
type
  TmyRecord = record
  var
    String_1: String;
    String_2: String;
  const
    Boolean1 = True;
    Boolean2 = False;
    Boolean3 = True;
  end;
Dies ist zwar im Prinzip das, wonach Du fragst, aber ich glaube es ist nicht das, was Du meinst. Denn ich glaube Du meinst, dass Du den Record einmalig zuweist, so dass der konstante Teil danach nicht mehr geändert werden kann.

Delphi-Quellcode:
var
  MyRecord1: TMyRecord;
  MyRecord2: TMyRecord;
begin
  MyRecord1.String_1 := 'bla';
  MyRecord1.String_2 := 'blub';

  MyRecord2.String_1 := 'blub';
  MyRecord2.String_2 := 'bla';
end;
Die Booleans sind aber immer so wie oben deklariert. Es ist also nicht möglich, sie einmalig für jede Instanz auf einen Wert zu setzen und erst danach als Konstante zu betrachten. MyRecord1.Boolean1 und MyRecord2.Boolean1 haben beide immer den Wert, der in der Typdeklaration zugewiesen wurde: True.

Das ließe sich aber mittels eines Konstruktors und ReadOnly-Properties lösen, genauso wie bei Klassen.

NoGAD 3. Apr 2020 10:27

AW: Record zum Teil als Konstante und Variable?
 
Zitat:

Zitat von dummzeuch (Beitrag 1461146)
Dies ist zwar im Prinzip das, wonach Du fragst, aber ich glaube es ist nicht das, was Du meinst. Denn ich glaube Du meinst, dass Du den Record einmalig zuweist, so dass der konstante Teil danach nicht mehr geändert werden kann.

Das ließe sich aber mittels eines Konstruktors und ReadOnly-Properties lösen, genauso wie bei Klassen.

Ja, aber das reicht mir erst einmal so. Dankeschön!

LG Mathias

himitsu 3. Apr 2020 11:45

AW: Record zum Teil als Konstante und Variable?
 
VAR muß man nicht angeben, denn am Anfang einer Section (private/public/...) ist VAR der Standard

um eine Ebene zu sparen lasse ich die einrückung weg und für die Ordnung kommen meistens einzelne Gruppen in eine eigene Section
Delphi-Quellcode:
type
  TmyRecord = record
    String_1: String;
    String_2: String;
    const Boolean1 = True;
    const Boolean2 = False;
    const Boolean3 = True;
  end;

  TmyRecord = record
  public
    const Boolean1 = True;
    const Boolean2 = False;
    Boolean3 = True; // ABER ist auch eine CONST
  public
    String_1: String;
    String_2: String;
  end;

  // ich mach es meistens so
  TmyRecord = record
  private const
    Boolean1 = True;
    Boolean2 = False;
  public const
    Boolean3 = True;
  public
    String_1: String;
    String_2: String;
  end;

  // weil mir das zu blöd ist
  TmyRecord = record
  private
    const
      Boolean1 = True;
      Boolean2 = False;
  public
    const
      Boolean3 = True;
  public
    String_1: String;
    String_2: String;
  end;

NoGAD 3. Apr 2020 12:37

AW: Record zum Teil als Konstante und Variable?
 
Zitat:

Zitat von himitsu (Beitrag 1461165)
VAR muß man nicht angeben, denn am Anfang einer Section (private/public/...) ist VAR der Standard

um eine Ebene zu sparen lasse ich die einrückung weg und für die Ordnung kommen meistens einzelne Gruppen in eine eigene Section
Delphi-Quellcode:
  // ich mach es meistens so
  TmyRecord = record
  private const
    Boolean1 = True;
    Boolean2 = False;
  public const
    Boolean3 = True;
  public
    String_1: String;
    String_2: String;
  end;


Danke!

Wo gilt denn public const überall?

himitsu 3. Apr 2020 17:09

AW: Record zum Teil als Konstante und Variable?
 
Überall. Public und Const ist ja getrennt,
aber der Übersicht halber versuche ich in einem Block nichts zu mischen, also entweder nur variablen und nur Konstanten.
Daher lässt sich das sehr gut in eine Zeile scheiben.

für Records ist die Liste dann auch recht einfach
Delphi-Quellcode:
private type
private const
private
public type
public const
public // das ist bei Records der Standard für die erste Zeile, wenn man nichts angegeben hat

Redeemer 3. Apr 2020 17:47

AW: Record zum Teil als Konstante und Variable?
 
Zitat:

Zitat von himitsu (Beitrag 1461216)
für Records ist die Liste dann auch recht einfach
Delphi-Quellcode:
private type
private const
private
public type
public const
public // das ist bei Records der Standard für die erste Zeile, wenn man nichts angegeben hat

strict private (in den drei Kombinationen) vergessen. Ergibt nur Sinn mit Eigenschaften und mit ausschließlich intern verwendeten Methoden, die durch Properties oder sichtbare Methoden aufgerufen werden.

Zitat:

Zitat von dummzeuch (Beitrag 1461146)
Das ließe sich aber mittels eines Konstruktors und ReadOnly-Properties lösen, genauso wie bei Klassen.

Nur bedingt, da Records keinen Standardkonstruktor haben.


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