AGB  ·  Datenschutz  ·  Impressum  







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

Property mit Record als Typ in Klasse verwenden

Ein Thema von DieDolly · begonnen am 19. Jul 2018 · letzter Beitrag vom 19. Jul 2018
Antwort Antwort
Seite 1 von 2  1 2      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 00:55
Ich baue gerade eine Klasse mit Properties, Gettern und Settern auf.
Ein Property soll als Typ ein Record haben

Dummy
Delphi-Quellcode:
  TMyRecord = Record
    Changed : Boolean;
    TotalWidth : Integer;
    WidthCol1 : Integer;
    WidthCol2 : Integer;
    WidthCol3 : Integer;
   end;

type
 TMyClass = record
 private
  FMyRecord: TMyRecord;
 public
  property MyRecord: TMyRecord read FMyRecord write FMyRecord;
 end;
An einer Stelle weiter unten versuche ich dann MyRecord.TotalWidth etwas zuzuweisen.
Es wird mit der Meldung abgebrochen "E2064 Der linken Seite kann nichts zugewiesen werden".
Wie bekomme ich dieses Problem behoben?

Mit Enums und Sets funktioniert das problemlos, nur mit einem Record als Typ nicht.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 06:43
Zitat:
Ich baue gerade eine Klasse mit Properties
Was denn nu?
Classe oder Record.. auch wenn du es als TMyClass benennst ist es trotzdem ein Record und zwar beide.
Du solltest dich also schon festlegen!

https://stackoverflow.com/questions/...y-of-an-object
Was spricht dagegen deinen Record als Class auszulegen?

Zum besseren Verständnis mal umbenannt.
property MyRecord: TMyRecord read GetMyRecord write FMyRecord;

Da MyRecord ein property ist behandelt der Compiler das etwas anders, es wird zuerst read (GetMyRecord) ausgewertet.
GetMyRecord erstellt eine lokale temporäre Copy von TMyRecord und diese ist nun mal nur lesbar.

Du kannst das mit Getter/Setter im Rekord umgehen, nur dann kann man auch direkt ne Class verwenden.
Und ja man kann auch in Records Setter und Getter verwenden D2010 und höher.

gruss

Geändert von EWeiss (19. Jul 2018 um 09:37 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 08:18
Code:
TMyRecord = Record
   Changed : boolean;
   TotalWidth : Integer;
   ColWidth : array[1..3] of Integer;
end;

TMyClass = record
 private
  FMyRecord: TMyRecord;
 
  function GetMyColWidth(const idx:integer):integer;
  procedure SetMyColWidth(const idx:integer;value:integer);

 public
  property MyRecord: TMyRecord read FMyRecord write FMyRecord;
  Property TotalWidth: integer read fMyRecord.TotalWidth write FMyRecord.TotalWidth;
  Property ColWidth1 : integer index 1 read GetMyColWidth write SetMyColWidth;
  Property ColWidth2 : integer index 2 read GetMyColWidth write SetMyColWidth;
  Property ColWidth3 : integer index 3 read GetMyColWidth write SetMyColWidth;
 end;

So würde ich das ganze angehen

die Property MyRecord schreibt und ließt den kompletten Record.
die Property TotalWidth schreibt und ließt ein einzelnes Feld eines Records.

die Properties ColWidth als Array angelegt und schon kannst du mit einem Getter/Setter und
der zusätzlichen definition des Index bei der Property auf die einzelnen Werte zugreifen.

Evtl. kannst du auch das Array weglassen und anhand des index bei der Property im Getter/Setter auf
die einzelnen Felder verweisen (müsste das ausprobieren...aber momentant installiert er).
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 08:20
Du kannst genau so gut das alles..
Delphi-Quellcode:
  Property TotalWidth: integer read fMyRecord.TotalWidth write FMyRecord.TotalWidth;
   Property ColWidth1 : integer index 1 read GetMyColWidth write SetMyColWidth;
   Property ColWidth2 : integer index 2 read GetMyColWidth write SetMyColWidth;
   Property ColWidth3 : integer index 3 read GetMyColWidth write SetMyColWidth;
in den Record kopieren.

Wie gesagt in diesen Fall würde ich auf den Record verzichten macht keinen Sinn.

gruss
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 08:30
Das kann man so global nicht sagen. Es hängt auch davon ab, was noch damit gemacht wird. Rein auf das Beispiel bezogen, hast du natürlich recht.

Gibts aber z.B. eine zweite Klasse:

Code:
Type
  TMyClassList = Class
  private
    flist : TList<TMyRecord>
  public
    :
sieht es schon anders aus.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 08:44
Zitat:
Gibts aber z.B. eine zweite Klasse:
Nun das wäre dann eine
Denn bei ihr sind es zwei records.

simple sample..
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyRecord = record
  private
    FTotalWidth : integer;
    procedure SetTotalWidth(const Value: Integer);
  public
    property TotalWidth : Integer read FTotalWidth write SetTotalWidth;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FMyRecord : TMyRecord;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
    FMyRecord.TotalWidth := 21;
    Label1.Caption := IntToStr(FMyRecord.TotalWidth);
end;

{ TMyRecord }

procedure TMyRecord.SetTotalWidth(const Value: Integer);
begin

  FTotalWidth := Value;
end;

end.
Egal.. sie\er soll sich aussuchen was er will.

gruss

Geändert von EWeiss (19. Jul 2018 um 09:49 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 12:04
Ich habe das jetzt so gemacht

Delphi-Quellcode:
  TMyRecord = Record
    Changed : Boolean;
    TotalWidth : Integer;
    WidthCol1 : Integer;
    WidthCol2 : Integer;
    WidthCol3 : Integer;
   end;

type
 TMyWasAuchImmer = record // ja ich weiß es ist keine Class und sollte es auch nicht so nennen. Daher nun "WasAuchImmer"
 private
 public
  MyRecord: TMyRecord;

  procedure Bla;
 end;

procedure TMyWasAuchImmer.Blub;
begin
 MyRecord.TotalWidth := 42;
end;


// von außen aufrufen
showmessage(TMyWasAuchImmer.MyRecord.TotalWidth.ToString);
Für alle anderen einfachen Datentypen verwende ich weiterhin getter, setter, read, write, property und all das.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 12:17
Zitat:
Ich habe das jetzt so gemacht
Für alle anderen einfachen Datentypen verwende ich weiterhin getter, setter, read, write, property und all das.
Entspricht zwar nicht deiner Anfrage aber gut wenn es dir reicht.
Die Lösung mit Getter und Setter hast du ja nun falls du dich entschließen solltest es doch noch einmal zu versuchen.

gruss

Geändert von EWeiss (19. Jul 2018 um 12:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 16:58
Beitrag entfernt da Offtopic
Gruß vom KodeZwerg

Geändert von KodeZwerg (19. Jul 2018 um 17:34 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Property mit Record als Typ in Klasse verwenden

  Alt 19. Jul 2018, 17:23
Zitat:
wenn Du doch vor hast Dezimal-Werte von Form über Ini-Datei laden/speichern.
Ich weis jetzt nicht wo du die Erkenntnis her hast und passt nicht zu dem Thema.
Eigentlich war das Thema für sie schon erledigt was nicht heißen soll das du hier nichts schreiben darfst.

Trotzdem unverständlich.

gruss

Geändert von EWeiss (19. Jul 2018 um 17:30 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22: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