Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Record zu Class umschreiben (Getter/Setter) (https://www.delphipraxis.net/193291-record-zu-class-umschreiben-getter-setter.html)

Glados 12. Jul 2017 16:14


Record zu Class umschreiben (Getter/Setter)
 
Ich habe in meinem Code ein etwas größeres Record. Manche Variablen umrande ich im Code mit einer TMultiReadExclusiveWriteSynchronizer Begin/End Read/Write. Das leider mehrmals.

Ich dachte nun daran das Record in eine Class umzuschreiben mit Gettern und Settern.
Bei den Gettern würde ich Begin/EndRead und bei den Settern Begin/EndWrite nutzen.

Aber wie schreibe ich ein Record in eine Klasse um, OHNE 1000 Stellen im Code ändern zu müssen?

Beispiel:
Delphi-Quellcode:
type
 TMyData = record
  a,b,c,d,e,f: string;
  aa,bb,c,dd,ee,ff: Integer;
end;

// global verfügbar
var
 aMyData: TMyData;

EWeiss 12. Jul 2017 16:16

AW: Record zu Class umschreiben
 
TMyData = class

gruss

Glados 12. Jul 2017 16:20

AW: Record zu Class umschreiben
 
Ich möchte wirklich nicht unfreundlich sein, aber das weiß ich schon und das war nicht die Frage.

Neutral General 12. Jul 2017 16:25

AW: Record zu Class umschreiben
 
Zitat:

Zitat von EWeiss (Beitrag 1376556)
TMyData = class

Und du musst überall wo du die Klasse benutzt die Objekte erstellen und freigeben.
Da wirst du nicht drum rum kommen.

Schöner wäre es auch die Felder in der Klasse in Properies umzuwandeln.
Aber das musst du nicht unbedingt tun, wenn du so wenig Arbeit haben möchtest wie nur möglich.

Uwe Raabe 12. Jul 2017 16:28

AW: Record zu Class umschreiben (Getter/Setter)
 
Zitat:

Zitat von Glados (Beitrag 1376555)
Aber wie schreibe ich ein Record in eine Klasse um, OHNE 1000 Stellen im Code ändern zu müssen?

Das kommt darauf an, wie du die einzelnen Record-Felder in deinem Code verwendest. Solange du schreibend nur per Zuweisung darauf zugreifst, sollten gleichnamige Properties einer Klasse weiterhin funktionieren. Wenn du die Felder aber als Variablen verwendest, wird das mit Properties nicht funktionieren.

Fritzew 12. Jul 2017 16:29

AW: Record zu Class umschreiben (Getter/Setter)
 
Du kannst auf properties in records verwenden.
Alle Felder nach privat und dann
so in etwa (habe jetzt nicht alle setter getter reingenommen....

Delphi-Quellcode:
type
 TMyData = record
 private
  fa,fb,fc,fd,fe,ff: string;
  faa,fbb,fcc,fdd,fee,fff: Integer;
    function geta: string;
    procedure seta(const Value: string);
 public
   property a : string read geta write seta;
end;

implementation

{ TMyData }

function TMyData.geta: string;
begin
 result := fa;
end;

procedure TMyData.seta(const Value: string);
begin
  fa := value;
end;

Uwe Raabe 12. Jul 2017 16:30

AW: Record zu Class umschreiben
 
Zitat:

Zitat von Neutral General (Beitrag 1376559)
Schöner wäre es auch die Felder in der Klasse in Properies umzuwandeln.
Aber das musst du nicht unbedingt tun, wenn du so wenig Arbeit haben möchtest wie nur möglich.

Laut Eingangspost ist aber genau das der Zweck.

Der schöne Günther 12. Jul 2017 16:30

AW: Record zu Class umschreiben (Getter/Setter)
 
Im Endeffekt möchtest du folgendes automatisiert haben:

Von
Delphi-Quellcode:
   TMyRecord = record
      someField: Integer;
   end;
zu
Delphi-Quellcode:
   TMyObject = class
      private var
         FSomeField: Integer;
      public
         function getSomeField(): Integer;
         procedure setSomeField(const value: Integer);
   end;
Und das für eine beliebige Anzahl an Feldern im Record. Ich kenne keinen in der IDE eingebauten Automatismus dafür, der Model Maker Code Explorer ist aber EXTREM EMPFEHLENSWERT und scheint das zu können.

Ich würde es an deiner Stelle aber trotzdem nicht tun. Erstens versteckst du das ganze Gelocke und Entsperren nur vor dem Aufrufer und zweitens fällt der Code auf die Nase falls du die Felder irgendwo z.B. in eine Methode mit var/out-Parameter gesteckt hast, das geht mit Properties in Delphi ja auch nicht.



PS: Ich möchte auch nicht unfreundlich sein, aber wenn du irgendein globales Gott-Objekt mit "tausend" Variablen hast und jetzt auch noch aus mehreren Threads anfängst die Werte zu manipulieren hast du im Kern wahrscheinlich ganz andere Probleme...

Ghostwalker 12. Jul 2017 16:31

AW: Record zu Class umschreiben (Getter/Setter)
 
Delphi-Quellcode:
type
 TMyData = record
  a,b,c,d,e,f: string;
  aa,bb,c,dd,ee,ff: Integer;
end;

 TMyDataClass = Class
 private
    fdata : TMyData;  
 protected
    function GetA:String;
    procedure SetA(value:string);
          :
    function GetAA:Integer;
    procedure SetAA(Value:integer);
         :
 published
  property a : string read GetA write SetA;
    :
  property aa: integer read GetAA write SetAA;

end;
Um die Erzeugung der Instanzen an den betreffenden Stellen wirst du aber nicht drum rum kommen. Wenn du mit globalen Variablen deines Records arbeitest, reichts aber auch, wenn du dir entsprechend globalen Instanzen erzeugst (z.B. im Initialization-Teil einer Unit). Nicht vergessen die Instanzen auch wieder freigeben !.

Glados 12. Jul 2017 16:34

AW: Record zu Class umschreiben (Getter/Setter)
 
Zitat:

Im Endeffekt möchtest du folgendes automatisiert haben:
Nein.

Ich möchte solche Stellen, die ich mehrfach habe, durch einen Setter einmalig erledigt haben
Delphi-Quellcode:
=> TMultiReadExclusiveWriteSynchronizer.BeginWrite;
aMyRec.a := '123';
=> TMultiReadExclusiveWriteSynchronizer.EndWrite;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 Uhr.
Seite 1 von 4  1 23     Letzte »    

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