Delphi-PRAXiS

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;

EWeiss 12. Jul 2017 16:35

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

Du kannst auf properties in records verwenden.
Ich denke so wie herausgelesen weis er das alles.. ;)
Er möchte so wenig ändern wie möglich, darum geht es ihm.
Zitat:

OHNE 1000 Stellen im Code ändern zu müssen
Nur wie soll das gehen :)

gruss

Fritzew 12. Jul 2017 16:38

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

Nur wie soll das gehen
genau deshalb..... Properties in den Record, dann muss er nur die Record Definition anpassen.....

Glados 12. Jul 2017 16:40

AW: Record zu Class umschreiben (Getter/Setter)
 
Ist es irgendwie auch möglich den TMultiReadExclusiveWriteSynchronizer den ich nutze in diese Unit, welche dann mein Record enthält, einzubinden?
Ich möchte in diese Unit nämlich nur ungern andere Units per uses einbinden.

Frage: wenn ich dennoch eine Class daraus mache mit Propertys und allem drum und dran - dann könnte ich den TMultiReadExclusiveWriteSynchronizer doch im überschriebenen Create() erstellen und meine Klasseninstanz im FormCreate meiner Hauptform, sehe ich das richtig? Und ändern müsste ich auch nicht viel da wo ich meine Variablen abrufe.
(bzw im Initialization meiner Globals-Unit)

bra 12. Jul 2017 17:12

AW: Record zu Class umschreiben (Getter/Setter)
 
Im Prinzip kann man records ja fast wie Klassen verwenden (mit ein paar Einschränkungen):
http://docwiki.embarcadero.com/RADSt...8erweiterte.29

Da könntest du deine Variablen einfach in Setter/Getter verpacken, mit den jeweiligen Aufrufen drin. Ob das dann wirklich schön ist, sei mal dahin gestellt...

Glados 12. Jul 2017 17:14

AW: Record zu Class umschreiben (Getter/Setter)
 
Edit
Ok ich habs. Habe Fi: Integer in Private vergessen.
Ich denke ich werde Class verwenden und dann doch hier und da ein wenig umschreiben.
Ich mache es lieber einmal richtig, als dass ich später 100 Fehler drin habe.


Das hier funktioniert jedenfalls nicht

Delphi-Quellcode:
unit classTest_;

interface

uses System.SysUtils;

type
 TTest_ = class
 private
  Fi: Integer; // VERGESSEN!
  Test: TMultiReadExclusiveWriteSynchronizer;
  function Geti: Integer;
  procedure Seti(const Value: Integer);
 public
  constructor Create; overload;
  destructor Destroy; override;

  property i: Integer read Geti write Seti;
 end;

implementation

constructor TTest_.Create;
begin
 Test := TMultiReadExclusiveWriteSynchronizer.Create;
end;

destructor TTest_.Destroy;
begin
 Test.Free;

 inherited;
end;

function TTest_.Geti: Integer;
begin
 Test.BeginRead;
 Result := Fi; // Fi, nicht i
 Test.EndRead;
end;

procedure TTest_.Seti(const Value: Integer);
begin
 Test.BeginWrite;
 Fi := Value; // Fi, nicht i
 Test.EndWrite;
end;

end.
Delphi-Quellcode:
var
 TestInstance: TTest_;
begin
 TestInstance := TTest_.Create;

 TestInstance.i := 123;
 ShowMessage(TestInstance.i.ToString);

 TestInstance.Free;

himitsu 12. Jul 2017 18:18

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

Zitat von EWeiss (Beitrag 1376566)
Zitat:

Du kannst auf properties in records verwenden.
Ich denke so wie herausgelesen weis er das alles.. ;)
Er möchte so wenig ändern wie möglich, darum geht es ihm.
Zitat:

OHNE 1000 Stellen im Code ändern zu müssen
Nur wie soll das gehen :)

gruss

Bei Record belassen, die Felder umbenennen und die Property so wie das Feld nennen.

Glados 12. Jul 2017 18:22

AW: Record zu Class umschreiben (Getter/Setter)
 
Hat ein Record hier denn vernünftige Vorteile gegenüber einer Klasse?
Dass ich eine Klasseninstanz erstellen und wiederfreigeben muss, damit habe ich kein Problem.

stahli 12. Jul 2017 18:23

AW: Record zu Class umschreiben (Getter/Setter)
 
Du musst ein privates Feld fI als Datenspeicher nutzen.
Sorry, ich habe die Änderung übersehen...

Eine Klasse finde ich übersichtlicher, da die Speicherverwaltung m.E. einfacher ist.
Aber das ist vermutlich einfach Geschmacksache (sofern man keine Vererbung oder Interfaces benötigt).

Glados 12. Jul 2017 18:26

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

Du musst ein privates Feld fI als Datenspeicher nutzen.
Das ist doch schon lange erledigt :P Habe sogar noch Edit an meinen Beitrag geschrieben :P

stahli 12. Jul 2017 18:29

AW: Record zu Class umschreiben (Getter/Setter)
 
Ja, die Korrektur ist doch auch schon lange erledigt... :-D

Glados 12. Jul 2017 18:30

AW: Record zu Class umschreiben (Getter/Setter)
 
Dann bleibe ich denke ich bei der Klasse. Denn Records wurden ja per-se nicht dafür erfunden properties reinzuschmeißen.

himitsu 12. Jul 2017 18:45

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

Zitat von Glados (Beitrag 1376582)
Denn Records wurden ja per-se nicht dafür erfunden properties reinzuschmeißen.

Interfaces sind auch nicht erfunden, um Property rein zu werfen.
Property sind dort einfach nur "Views" auf je ein Paar Getter und Setter.

Glados 12. Jul 2017 18:49

AW: Record zu Class umschreiben (Getter/Setter)
 
Ist es möglich eine Klasseninstanz meiner Klasse innerhalb des Initialization-Teils einer Unit zu erstellen? Bisher bin ich irgendwie zu blöd dafür.

himitsu 12. Jul 2017 18:51

AW: Record zu Class umschreiben (Getter/Setter)
 
Ja .......

Glados 12. Jul 2017 18:55

AW: Record zu Class umschreiben (Getter/Setter)
 
Darf ich fragen wie die Syntax aussieht? :P

Zacherl 12. Jul 2017 19:33

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

Zitat von Glados (Beitrag 1376588)
Darf ich fragen wie die Syntax aussieht? :P

Delphi-Quellcode:
Inst := TMyClass.Create
?

Warum soll es an dieser Stelle anders aussehen, als überall sonst?

Glados 12. Jul 2017 19:55

AW: Record zu Class umschreiben (Getter/Setter)
 
Also das hier funktioniert jedenfalls nicht...
Delphi-Quellcode:
unit MyClass;

interface
 uses ...;

type
 TTest_ = class
...
end;

implementation

... constructor destructor setter getter

initialization

Inst := TTest_;

finalization

end.

himitsu 12. Jul 2017 20:01

AW: Record zu Class umschreiben (Getter/Setter)
 
Wenn du das wo anders machst, was ist da denn das "Inst" bei dir? :stupid:

Außerdem wurde dir gerade ein Beispiel gegeben.
Das sieht sogar so aus, wie in der OH nd in allen Tutorials.
Was also fehlt da nich, nach dem Klassennamen?

EWeiss 12. Jul 2017 20:03

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

Zitat von himitsu (Beitrag 1376591)
Wenn du das wo anders machst, was ist da denn das "Inst" bei dir? :stupid:

Delphi-Quellcode:
var
Inst : TTest_;

Inst := TTest_.Create;
Auch wenn du es schon selber weist.

gruss

Glados 12. Jul 2017 20:05

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

Wenn du das wo anders machst, was ist da denn das "Inst" bei dir?
Ich verstehe die Frage leider nicht.

Nach dem Klassennamen fehlte noch das Create das ist mir beim kopieren wohl verloren gegangen.

=>
Zitat:

Zitat von EWeiss (Beitrag 1376592)
Zitat:

Zitat von himitsu (Beitrag 1376591)
Wenn du das wo anders machst, was ist da denn das "Inst" bei dir? :stupid:

Delphi-Quellcode:
var
Inst : TTest_;

Inst := TTest_.Create;
Auch wenn du es schon selber weist.

gruss


Den Beitrag hatte ich vorher nicht gesehen sorry.

EWeiss 12. Jul 2017 20:06

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

Zitat von Glados (Beitrag 1376593)
Zitat:

Wenn du das wo anders machst, was ist da denn das "Inst" bei dir?
Ich verstehe die Frage leider nicht.

Nach dem Klassennamen fehlte noch das Create das ist mir beim kopieren wohl verloren gegangen.

Er meint als was Inst definiert ist.

grúss

stahli 12. Jul 2017 20:10

AW: Record zu Class umschreiben (Getter/Setter)
 
Und was genau funktioniert nicht?
Gibt es eine Warnung/Fehlermeldung?

Glados 12. Jul 2017 20:12

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

Den Beitrag hatte ich vorher nicht gesehen sorry.
Hab EWeiss' Beitrag gesehen und nun funktioniert es. Man muss natürlich auch eine Instanzenvariable deklarieren bevor man ihr was zuweisen kann :roll:

Was für eine schwierige Geburt. War aber auch selber daran Schuld.

EWeiss 12. Jul 2017 20:29

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

Zitat von Glados (Beitrag 1376596)
Zitat:

Den Beitrag hatte ich vorher nicht gesehen sorry.
Hab EWeiss' Beitrag gesehen und nun funktioniert es. Man muss natürlich auch eine Instanzenvariable deklarieren bevor man ihr was zuweisen kann :roll:

Na ja was soll's so triviale Dinge passieren mir auch schon mal.

Warum ich das mit der Class gepostet hatte.. ganz einfach!
Ich wusste es anfangs nicht das man den Record einfach mit Class ersetzen kann.
Deshalb muss man sich aber nicht schämen niemand ist perfekt.
OK. Scheint ja gelöst zu sein.

gruss

Glados 12. Jul 2017 20:39

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

OK. Scheint ja gelöst zu sein.
Richtig.

Ich säubere gerade ein Projekt und hole alle meine Records aus einer Globals-Unit raus, da ich für manche Variablen hier und dort mal den Speicher schützen muss bevor ich lese oder schreibe.
Und bevor ich das 5x Copy&Paste verlege ich lieber alles in eine eigene Klasse und dort wo ich Speicher schützen muss, mache ich das einmalig in einem Getter und Setter.


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