![]() |
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; |
AW: Record zu Class umschreiben
TMyData = class
gruss |
AW: Record zu Class umschreiben
Ich möchte wirklich nicht unfreundlich sein, aber das weiß ich schon und das war nicht die Frage.
|
AW: Record zu Class umschreiben
Zitat:
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. |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
|
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; |
AW: Record zu Class umschreiben
Zitat:
|
AW: Record zu Class umschreiben (Getter/Setter)
Im Endeffekt möchtest du folgendes automatisiert haben:
Von
Delphi-Quellcode:
zu
TMyRecord = record
someField: Integer; end;
Delphi-Quellcode:
Und das für eine beliebige Anzahl an Feldern im Record. Ich kenne keinen in der IDE eingebauten Automatismus dafür, der
TMyObject = class
private var FSomeField: Integer; public function getSomeField(): Integer; procedure setSomeField(const value: Integer); end; ![]() 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... |
AW: Record zu Class umschreiben (Getter/Setter)
Delphi-Quellcode:
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 !.
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; |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Ich möchte solche Stellen, die ich mehrfach habe, durch einen Setter einmalig erledigt haben
Delphi-Quellcode:
=> TMultiReadExclusiveWriteSynchronizer.BeginWrite;
aMyRec.a := '123'; => TMultiReadExclusiveWriteSynchronizer.EndWrite; |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Er möchte so wenig ändern wie möglich, darum geht es ihm. Zitat:
gruss |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
|
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) |
AW: Record zu Class umschreiben (Getter/Setter)
Im Prinzip kann man records ja fast wie Klassen verwenden (mit ein paar Einschränkungen):
![]() 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... |
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; |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
|
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. |
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). |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
|
AW: Record zu Class umschreiben (Getter/Setter)
Ja, die Korrektur ist doch auch schon lange erledigt... :-D
|
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.
|
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Property sind dort einfach nur "Views" auf je ein Paar Getter und Setter. |
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.
|
AW: Record zu Class umschreiben (Getter/Setter)
Ja .......
|
AW: Record zu Class umschreiben (Getter/Setter)
Darf ich fragen wie die Syntax aussieht? :P
|
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Delphi-Quellcode:
?
Inst := TMyClass.Create
Warum soll es an dieser Stelle anders aussehen, als überall sonst? |
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. |
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? |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Delphi-Quellcode:
Auch wenn du es schon selber weist.
var
Inst : TTest_; Inst := TTest_.Create; gruss |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Nach dem Klassennamen fehlte noch das Create das ist mir beim kopieren wohl verloren gegangen. => Zitat:
Den Beitrag hatte ich vorher nicht gesehen sorry. |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
grúss |
AW: Record zu Class umschreiben (Getter/Setter)
Und was genau funktioniert nicht?
Gibt es eine Warnung/Fehlermeldung? |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
Was für eine schwierige Geburt. War aber auch selber daran Schuld. |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
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 |
AW: Record zu Class umschreiben (Getter/Setter)
Zitat:
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 21:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz