AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi schreibender Zugriff auf private Variablen ?
Thema durchsuchen
Ansicht
Themen-Optionen

schreibender Zugriff auf private Variablen ?

Ein Thema von MaBuSE · begonnen am 6. Nov 2007 · letzter Beitrag vom 7. Nov 2007
Antwort Antwort
Seite 2 von 2     12   
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#11

Re: schreibender Zugriff auf private Variablen ?

  Alt 7. Nov 2007, 06:53
Mit einem Zeiger auf den alten Propertywert ginge es.
Delphi-Quellcode:
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.
Edit: Wtf? Ich bin noch nicht wach... Hatte eben noch keine Antworten gesehen
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#12

Re: schreibender Zugriff auf private Variablen ?

  Alt 7. Nov 2007, 07:29
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:
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;
Ansonsten gehts auch noch enfacher

Delphi-Quellcode:
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;
Gruß Hagen
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#13

Re: schreibender Zugriff auf private Variablen ?

  Alt 7. Nov 2007, 07:38
Zitat von negaH:
Das was Elvis vorschlägt kann und darf nicht funktionieren.
Hö?
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 ).
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: schreibender Zugriff auf private Variablen ?

  Alt 7. Nov 2007, 13:11
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
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#15

Re: schreibender Zugriff auf private Variablen ?

  Alt 7. Nov 2007, 13:19
Zitat von negaH:
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.
Ja, wenn man strikt bei dem Threadtitel bleibt. Aber nicht wenn es um das Ändern des Textes hinter der Eigenschaft geht.
Btw, Sirus hatte letzlich fast die gleiche Frage, ich wollte nur diesmal eine weitere Möglichkeit zeigen. Auch wenn sie ziemlich böse enden kann, wenn plötzlich 3 Texte den neuen Wert haben...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

Re: schreibender Zugriff auf private Variablen ?

  Alt 7. Nov 2007, 17:13
Zitat von negaH:
Hast du den Source der Klasse?
Ja, ich habe den kompletten Quelltext.

Ich bin heute leider nicht zum testen gekommen, das werde ich aber morgen nachholen

Danke noch mal an alle.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 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