Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eigenschaft wird gesetzt ohne Wirkung (https://www.delphipraxis.net/128168-eigenschaft-wird-gesetzt-ohne-wirkung.html)

xZise 25. Jan 2009 17:08


Eigenschaft wird gesetzt ohne Wirkung
 
Hallo ihr,

ich möchte standardmäßig eine Eigenschaft auf einen bestimmten Wert gesetzt haben. Eigentlich sollte das doch so gehen:
Delphi-Quellcode:
type
  TReserveManagment = (rmOwner, rmProgressive, rmExact);
[...]
    property ReserveManagment : TReserveManagment read FReserveManagment write SetReserveManagment default rmExact;
Nun reicht das nicht, also wollte ich vorübergehend das einfach ins Create packen:
Delphi-Quellcode:
constructor TIntegerList.Create;
begin
  inherited;
  FCount := 0;
  SetReserveManagment(rmExact);
  ReserveManagment := rmExact;
end;
Aber beide Varianten haben keine Auswirkungen auf den Wert von FReserveManagment. Er ist weiterhin rmOwner, was im Nachinein Probleme bringt. Aber wenn man es nach dem Create von außen sozusagen setzt, funktioniert es wunderbar.

Zur Information: Er springt in beiden Aufrufen (einmal direkt, einmal indirekt @ property) nicht in die Methode SetReserveManagment.

Delphi-Quellcode:
procedure TIntegerList.SetReserveManagment(const Value: TReserveManagment);
begin
  FReserveManagment := Value;
  case Value of
    rmProgressive: SetLength(FIntegers, (FCount div RESERVE_DELTA + 1) * RESERVE_DELTA);
    rmExact: SetLength(FIntegers, FCount);
  end;
  FReservedLength := Length(FIntegers);
end;
Wie kann ich nun die Klasse dazu bringen, standardmäßig "rmExact" in FReserveManagment stehen zu haben (abgesehen davon oben die Werte der Enumeration zu tauschen, weil das kann es ja nicht sein... Das behebt nur die Symptome nicht das Problem). Selbst ein tauschen der Werte in der Enumeration hilft nicht.

MfG
xZise

Apollonius 25. Jan 2009 17:13

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Das default ist nur von Belang, wenn eine als Published deklarierte Eigenschaft mit einem TWriter in einen Stream geschrieben wird.
Kannst du mal im Konstruktor die CPU-Ansicht aufrufen und uns zeigen, was passiert?

DeddyH 25. Jan 2009 17:14

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Und wenn Du den Konstruktor dahingehend änderst, dass Du das private Feld belegst statt der Property?
Delphi-Quellcode:
constructor TIntegerList.Create;
begin
  inherited;
  FCount := 0;
  FReserveManagment := rmExact;
end;

xZise 25. Jan 2009 17:27

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Zitat:

Zitat von Apollonius
Das default ist nur von Belang, wenn eine als Published deklarierte Eigenschaft mit einem TWriter in einen Stream geschrieben wird.

Ah okay ;) Auch wenn mir das ab "mit einem ..." nicht so viel sagt, danke für die Information.

Zitat:

Zitat von Apollonius
Kannst du mal im Konstruktor die CPU-Ansicht aufrufen und uns zeigen, was passiert?

Was hättest du den da gerne? Also ich weiß jetzt nicht ob dir das was nützt:
Code:
uIntegerList.pas.163: inherited;
0046DDF6 33D2             xor edx,edx
0046DDF8 8BC6             mov eax,esi
0046DDFA E88D5CF9FF      call TObject.Create
uIntegerList.pas.164: FCount := 0;
0046DDFF 33C0             xor eax,eax
0046DE01 894608           mov [esi+$08],eax
uIntegerList.pas.165: FReserveManagment := rmExact;
0046DE04 6A00             push $00
0046DE06 8D4604           lea eax,[esi+$04]
0046DE09 B901000000       mov ecx,$00000001
0046DE0E 8B1520DD4600     mov edx,[$0046dd20]
0046DE14 E8FB85F9FF      call @DynArraySetLength
0046DE19 83C404           add esp,$04
uIntegerList.pas.166: SetReserveManagment(rmExact);
0046DE1C 8BC6             mov eax,esi
0046DE1E 84DB            test bl,bl
0046DE20 740F            jz $0046de31
0046DE22 E82561F9FF      call @AfterConstruction
0046DE27 648F0500000000   pop dword ptr fs:[$00000000]
0046DE2E 83C40C          add esp,$0c
0046DE31 8BC6             mov eax,esi
0046DE33 5E              pop esi
0046DE34 5B              pop ebx
0046DE35 C3               ret
0046DE36 8BC0             mov eax,eax

Zitat:

Zitat von DeddyH
Und wenn Du den Konstruktor dahingehend änderst, dass Du das private Feld belegst statt der Property?
Delphi-Quellcode:
constructor TIntegerList.Create;
begin
  inherited;
  FCount := 0;
  FReserveManagment := rmExact;
end;

Das hat keine Auswirkungen.

MfG
xZise

Apollonius 25. Jan 2009 17:30

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Hast du Inlining angeschaltet?

xZise 25. Jan 2009 17:32

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Kann sein. Wo kann ich das unter Delphi 2009 überprüfen?

MfG
xZise

Apollonius 25. Jan 2009 17:38

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Das sollte irgendwo in den Projektoptionen verzeichnet sein. Du kannst aber auch einfach mal {$INLINE OFF} vor die Klassendeklaration setzen und nachschauen, ob sich etwas verändert.

xZise 25. Jan 2009 17:40

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Also an den Werten ändert das nichts.

MfG
xZise

Apollonius 25. Jan 2009 17:44

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Schalte mal mit {$O-} die Optimierungen ganz aus. Die CPU-Ansicht sollte sich dann verändern.

xZise 25. Jan 2009 17:50

Re: Eigenschaft wird gesetzt ohne Wirkung
 
Okay... Ich weiß nicht wie ich es hingekriegt habe, aber er war in der falschen Unit. Und in der die er genommen hat, gab es die Zuweisung noch nicht. Dennoch Danke für eure Mühe.

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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