![]() |
Record Zugriff umleiten...
Moin Zusammen...
Ich stehe heute Morgen etwas auf dem Schlauch, daher brauche ich Eure Hilfe. Folgendes Problem:
Delphi-Quellcode:
Ich möchte jetzt aus dem Record eine classe machen um bei jedem Zugriff auf die Variable eine Procedure aufrufen zu können. Habe mir schon die Überladenen Operatoren angesehen. Eine Property hilft leider auch nicht oder doch?
type
TMyData = Record A : Shortstring B : Integer // usw... end; var V1,V2 : TMyData; begin // Beispielbenutzungen V1 := V2; Move(V1,V2,sizeof(V1)); Blockwrite(f,V1,Sizeof(F)); // usw. end. Hat jemand ne Idee? Mavarik |
AW: Record Zugriff umleiten...
Beim direkten Zugriff auf den Speicher, helfen Properties nicht. Mir wäre auch keine Funktionalität bekannt, welche das so unterstützen würde.
|
AW: Record Zugriff umleiten...
Klasse: Operatoren gibt es aber derzeit nur für Records. (wobei es für Interfaces technisch auch möglich sein sollte, falls Emba mal irgendwann auf mich hört)
Das Move/BlockWrite/BlockRead kannst du dir höchstens selber implementieren, als Read-/Write-Methode, was man notfalls über die RTTI etwas automatisieren könnte. |
AW: Record Zugriff umleiten...
das
Delphi-Quellcode:
ist so ja nicht zugebrauchen, aber warum sollte das mit den Gettern/Settern nicht funktionieren?
blockwrite
Ggf. benutzt man halt Pointer oder hab ich da etwas falsch verstanden? Gruß K-H |
AW: Record Zugriff umleiten...
Wenn im Programm der Spicherbereich direkt überschrieben wird, wird der Setter ja nicht aufgerufen.
|
AW: Record Zugriff umleiten...
Ich versteh das Problem nicht ganz, denn ich würde eine Assign- btw. AssignTo-Methode implementieren und damit das Problem umgehen.
Oder möchtest Du es kodekompatibel gestalten, um wenig Arbeit bei der Umwandlung von Record->Klasse zu haben? Das würde ich nicht machen, denn dein Code wäre nur sehr schwer zu verstehen. Per definitionem ist eine Zuweisung bei Objekten eine Zeigerzuweisung und keine Kopieroperation. Oder meinst Du, das Du jeden Lesezugriff auf die Instanz kontrollieren möchtest, quasi einen Getter für 'Self'? Dann verwende vielleicht einen kleinen Wrapper:
Delphi-Quellcode:
Du erstellst dann den Wrapper und arbeitest nicht direkt mit (z.B.) V1, sondern mit dem Wrapper.
Type
TObjectAccessSentinel = Class private Function GetObject : TMyObject; // <<--- hier deine Kontrollroutine für den Zugriff Public Constructor Create (aObject : TMyObject) Property Object : TMyObject Read GetObject; End; |
AW: Record Zugriff umleiten...
Ich verstehe glaube ich nicht so 100%ig was du genau willst.
Und ich glaube die anderen die bisher geantwortet haben auch nicht so richtig.
Delphi-Quellcode:
In dem Getter/Setter kannst du dann jeweils irgendetwas tun wenn die Property gelesen oder geschrieben wird.
TMyData = Record
private FText: String; function GetText: String; procedure SetText(const AValue: String); public property Text: String read GetText write SetText; end; // ODER als Klasse: TMyData = class private FText: String; function GetText: String; procedure SetText(const AValue: String); public property Text: String read GetText write SetText; end; Die Getter/Setter können allerdings nicht auf soetwas wie
Delphi-Quellcode:
reagieren. Da funktioniert es nicht und da gibt es auch keine Lösung das zu realisieren.
V1 := V2;
Move(V1,V2,sizeof(V1)); Blockwrite(f,V1,Sizeof(F)); Bei Klassen sind die 3 oberen Möglichkeiten des Kopierens ja gar nicht möglich, also erübrigt sich die Frage dafür. Wenn direkt auf FText zugegriffen wird und quasi dadurch die Property inkl. Getter/Setter umgangen wird, dann bekommen Getter und Setter natürlich auch nichts davon mit. |
AW: Record Zugriff umleiten...
Vielleicht erklärst Du noch, was Du eigentlich erreichen willst. Mir scheint, Du denkst in diesem Fall vielleicht einen Tick zu kompliziert.
|
AW: Record Zugriff umleiten...
Danke erstmal für eure Antworten...
Halten wir mal fest, es gibt keine Lösung! Grüsse Mavarik |
AW: Record Zugriff umleiten...
Zitat:
Du klammerst dich an einen Record obwohl es auch wesentlich flexiblere Datenstrukturen gibt. Nehmen wir z.B. ein Diktionary:
Delphi-Quellcode:
Indem du dich von einem Record löst und Datenstrukturen auf einer höhere Abstraktionsebene verwendest kannst du mehr erreichen.
var
dict, dict2 : TMyDictionary; begin dict := TMyDictionary.Create; dict['A'] := 42; dict['B'] := 'Teststring'; dict['Visible'] := True; // Beispiel für einen Copy-Konstruktor dict2 := TMyDictionary.Create(dict); // dict2 enthält jetzt alle Daten von dict dict2.SaveToFile('data.txt'); dict2.Free; dict.Free; end; Natürlich ist dies immer auch mit einem gewissen Verlust an Geschwindigkeit verbunden, aber das ist meist kaum zu spüren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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 by Thomas Breitkreuz