AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Record-Member kann nichts zugewiesen werden?
Thema durchsuchen
Ansicht
Themen-Optionen

Record-Member kann nichts zugewiesen werden?

Ein Thema von mh166 · begonnen am 5. Apr 2013 · letzter Beitrag vom 5. Apr 2013
Antwort Antwort
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Record-Member kann nichts zugewiesen werden?

  Alt 5. Apr 2013, 11:32
Hallo Leute,

ich steh ein wenig auf dem Schlauch: ich habe einen Record definiert und diesen einer Klasse inkl. zugehöriger Eigenschaft (r/w!) zugewiesen. Wenn ich in meinem Code jetzt über diese Eigenschaft die Member des Records beschreiben will, geht das schief.

Lange Rede, kurzer Code:
Delphi-Quellcode:
  TVanitySettings = record
    Number: String;
    PIN: String;
    Password: String;
  end;

  TSettings = class
    // ...
    procedure loadSettings;
  private
    FVanity: TVanitySettings;
  public
    property Vanity: TVanitySettings read FVanity write FVanity;
  end;

// ...

procedure TSettings.loadSettings;
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(FSettingsPath);

  Vanity.Number := Ini.ReadString('0700', 'Nummer', '');
  // ..
end;
Jetzt bringt mir der Compiler nun bei der Zuweisung des gelesenen Strings die Fehlermeldung:
Zitat von Compiler:
[DCC Fehler] uVanityManagerCommon.pas(67): E2064 Der linken Seite kann nichts zugewiesen werden
In der Hilfe hab ich schon geschaut, und die war der Meinung, dass die Meldung sich auch auf Member von Records bezieht, sofern diese als read-only Eigenschaft deklariert sind. Ist aber ja bei mir nicht der Fall.

An sich kein großes Thema: greife ich direkt auf das Feld, statt auf die Eigenschaft zu, dann kann ichs natürlich problemlos befüllen. Aber das Ganze interessiert mich nun doch: wieso mag der Compiler den Code nicht?

Vielleicht hat ja einer eine Erleuchtung für mich und ich lern wieder mal was spannendes dazu. Oder ich hab mich einfach zu doof angestellt. Wäre auch möglich.

Grüße,
mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Record-Member kann nichts zugewiesen werden?

  Alt 5. Apr 2013, 11:38
Das ist bei Records halt so, denn beim Zuweisen einer Record-Eigenschaft (oder einem Feld) wird automatisch eine neuer Record erzeugt.

Das hier würde funktionieren
Delphi-Quellcode:
procedure TSettings.loadSettings;
var
  Ini: TIniFile;
  LVanity : TVanitySettings;
begin
  Ini := TIniFile.Create(FSettingsPath);

  LVanity.Number := Ini.ReadString('0700', 'Nummer', '');

  Vanity := LVanity;
  // ..
end;
Am wenigsten Stress hast du, wenn du anstatt eines Records eine Klasse nimmst
Delphi-Quellcode:
TVanitySettings = class
private
  FNumber: String;
  FPIN: String;
  FPassword: String;
public
  property Number : string read FNumber write FNumber;
  property PIN : string read FPIN write FPIN;
  property Password : string read FPassword write FPassword;
end;

  TSettings = class
    // ...
    procedure loadSettings;
  private
    FVanity: TVanitySettings;
  public
    constructor Create;
    destructor Destroy; override;
    property Vanity: TVanitySettings read FVanity;
  end;

// ...

constructor TSettings.Create;
begin
  inherited;
  FVanity := TVanitySettings.Create;
end;

destructor TSettings.Destroy;
begin
  FVanity.Free;
  inherited;
end;

procedure TSettings.loadSettings;
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create(FSettingsPath);

  Vanity.Number := Ini.ReadString('0700', 'Nummer', '');
  // ..
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 5. Apr 2013 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Record-Member kann nichts zugewiesen werden?

  Alt 5. Apr 2013, 11:40
Nachdem Sir Rufo den korrekten Zugriff bereits erklärt hat, bleibt mir noch eine gegf. denkbare Alternative anzubieten

Delphi-Quellcode:
  public
    Vanity: TVanitySettings; // statt einer property
  end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Record-Member kann nichts zugewiesen werden?

  Alt 5. Apr 2013, 11:51
Auf die DP ist eben Verlass. Danke euch beiden!

In der Tat wieder was gelernt. Wusste nicht, dass jedes mal ein neuer Record erzeugt wird. In diesem Fall werde ich wohl der Einfachheit halber den Record als Public definieren. Ist ja meines Erachtens nach vom Speicherverbrauch doch um einiges genügsamer als eine Klasseninstanz. Oder täusch ich mich mal wieder? Zumindest spar ich mir aber Tipperei mit dem Create der Klassen.

Oder gibt es gravierende Nachteile, an die ich mal wieder nicht denke, wenn ich hier weiter bei meinen Records bleibe?

Grüße,
mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Record-Member kann nichts zugewiesen werden?

  Alt 5. Apr 2013, 12:14
Ja, du hast die Eigenschaften der Klasse nicht so unter Kontrolle.
(Du machst aus der Eigenschaft ja auch jetzt ein public Field und das ist dann völlig unkontrolliert und hat dir spätestens beim MultiThreading um die Ohren).

Bei einer Eigenschaft kann man über die Getter/Setter so einiges veranstalten und den Zugriff sehr schön regeln.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Record-Member kann nichts zugewiesen werden?

  Alt 5. Apr 2013, 12:29
Okay, also gehts wirklich nur um die Getter/Setter. Na gut, das is mir bewusst. In dem konkreten Fall stellt das aber kein Problem dar: weder muss irgendwas verifiziert werden noch ist hier Thread-Sicherheit notwendig.

Aber ich werde das auf jeden Fall für die Zukunft im Sinn behalten.

Nochmals: Danke!
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  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 12:31 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