Moin,
Vorhin zum ersten mal mit Delphi und Operator Overloading beschäftigt.
Von C++ kenn ich es schon.
Das Delphi das seit Delphi2006 schon kann war mir neu.
Bin vorhin erstmal auf die Nase gefallen.
Ich dachte mir schön, dann leg ich jetzt mal nen eigenen Typ an
und hinterlege da einen Wert + Verknüpfung auf ein Objekt.
Hab dann die Variable lokal angelegt, und einfach mit
v.object := irgendwas;
und
v:=100;
initialisiert.
Das klappt auch.
ABER! wenn v ein feld einer klasse ist oder im globalen Teil steht,
wird bei v:=100 das record neu initialisiert. Also der Pointer auf das Objekt ist dann nil.
Interessanter weise bei lokalen variablen nicht. Auch nicht bei Release...
Gut man kann das verhalten schnell korrigieren indem man alle Felder vom Record im class operator implict
initialisiert...
Aber ich hätte das Verhalten gerne.
Also ich möchte am liebsten dem Record beim Anfang ein Objekt oder zweiten wert mitgeben, den
es bei einer Operator Zuweisung behält (v:=100)
Ist denke ich aber nicht möglich oder?
Hier das Beispiel:
Delphi-Quellcode:
unit Unit2;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls;
type
TVarX =
record
Value: integer;
FormMaster: TForm;
Name:
string;
class operator implicit(
const z: integer): TVarX;
// bei TvarX:=int
end;
TForm2 =
class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
FormVar1: TVarX;
{ Private-Deklarationen }
procedure TestX;
public
{ Public-Deklarationen }
end;
var
Form2: TForm2;
globalVar1: TVarX;
implementation
{$R *.dfm}
{ TVarX }
class operator TVarX.implicit(
const z: integer): TVarX;
begin
result.Value := z;
end;
{ TForm2 }
procedure TForm2.TestX;
var
localVar1: TVarX;
begin
localVar1 := 100;
localVar1.
Name := '
blubblub';
localVar1.FormMaster := self;
localVar1 := 200;
{ value = 200, name = 'blubblub', formMaster=form2 }
FormVar1 := 100;
FormVar1.
Name := '
blubblub';
FormVar1.FormMaster := self;
FormVar1 := 200;
{ value = 200, name = '', formMaster=nil }
globalVar1 := 100;
globalVar1.
Name := '
blubblub';
globalVar1.FormMaster := self;
globalVar1 := 200;
{ value = 200, name = '', formMaster=nil }
//zum testn bei build release...
Memo1.Lines.Add('
localVar1.Name' + '
: ' + localVar1.
Name);
//out blubblub
Memo1.Lines.Add('
FormVar1.Name' + '
: ' + FormVar1.
Name);
//out = ''
Memo1.Lines.Add('
globalVar1.Name' + '
: ' + globalVar1.
Name);
//out = ''
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
TestX;
end;
end.