![]() |
Re: schreibender Zugriff auf private Variablen ?
Mit einem Zeiger auf den alten Propertywert ginge es.
Delphi-Quellcode:
Edit: Wtf? Ich bin noch nicht wach... Hatte eben noch keine Antworten gesehen :lol:
type
TTest = class private fValue: String; function GetValue: String; public property Value : String read GetValue; constructor Create(const aValue : String); end; { TTest } constructor TTest.Create(const aValue: String); begin fValue := aValue; end; function TTest.GetValue: String; begin result := fValue; end; var instance : TTest; begin instance := TTest.Create('A'); try PChar(instance.Value)^ := 'B'; Writeln(instance.Value); finally instance.Free(); end; end. |
Re: schreibender Zugriff auf private Variablen ?
Das kann eigentlich nicht gehen. Die Property ist vollkommen gekapselt durch Zugriffsmethode. Dh. es muß garkein private feld geben auf das sich die Property bezieht, sondern die Zugriffmethoden könnten auch einen String dynamsich zusammenbauen erst beim Zugriff auf diese property. Das was Elvis vorschlägt kann und darf nicht funktionieren.
Besser so:
Delphi-Quellcode:
Ansonsten gehts auch noch enfacher
type
TTestCracker = class(TObject) private FValue: String; end; procedure Test; var T: TTest; begin T := TTest.Create; try TTestCracker(T).FValue := 'Test'; finally T.Free; end; end;
Delphi-Quellcode:
Gruß Hagen
procedure Test;
type PTestCracker = ^TTestCracker; TTestCracker = packed record ClassVMT: Pointer; // hier alle Felder eintragen die in allen Vorgängerklassen von TTest implementiert wurde, // oder alternativ einmalig den +Offset aus gehend von TTest.Self auf FValue per Debugger ermitteln und exakt soviele // Bytes als Dummy[] Array hier einfügen, zb. Offset->FValue ist 32, dann hier Dummy[0..32-4-1] of Byte; FValue: String; end; var T: TTest; begin T := TTest.Create; try PTestCracker(T).FValue := 'Test'; finally T.Free; end; end; |
Re: schreibender Zugriff auf private Variablen ?
Zitat:
Mein Vorschlag hat den gravierenden Nachteil, dass auch andere Strings, die diesen Wert hatten mit geändert werden (bin gerade im Prozess des Aufwachens mit der einhergehenden graduellen Erleuchtung :mrgreen: ). Wenn ich einen PChar eines String hole, wird ja nicht ein Zeiger auf den ersten Char einer Kopie des Strings zurückgegeben, sondern auf den originalen String, der durch den Getter der Eigenschaft zurückgegeben wurde. |
Re: schreibender Zugriff auf private Variablen ?
Fie Frage war wie man auf ein privates Feld eines Objectes modifizierend zugreifen kann. Mit deiner Methode veränderst du nur irgendeine Kopie eines Strings die durch den Getter der Property zurückgebene wird, es besteht keinerlei zwingender Zusammenhang zu irgendeinem privaten Feld des Objekts.
Gruß Hagen |
Re: schreibender Zugriff auf private Variablen ?
Zitat:
Btw, Sirus hatte letzlich fast die ![]() |
Re: schreibender Zugriff auf private Variablen ?
Zitat:
Ich bin heute leider nicht zum testen gekommen, das werde ich aber morgen nachholen ;-) Danke noch mal an alle. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 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