![]() |
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:
Nun reicht das nicht, also wollte ich vorübergehend das einfach ins Create packen:
type
TReserveManagment = (rmOwner, rmProgressive, rmExact); [...] property ReserveManagment : TReserveManagment read FReserveManagment write SetReserveManagment default rmExact;
Delphi-Quellcode:
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.
constructor TIntegerList.Create;
begin inherited; FCount := 0; SetReserveManagment(rmExact); ReserveManagment := rmExact; end; Zur Information: Er springt in beiden Aufrufen (einmal direkt, einmal indirekt @ property) nicht in die Methode SetReserveManagment.
Delphi-Quellcode:
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.
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; MfG xZise |
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? |
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; |
Re: Eigenschaft wird gesetzt ohne Wirkung
Zitat:
Zitat:
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:
MfG xZise |
Re: Eigenschaft wird gesetzt ohne Wirkung
Hast du Inlining angeschaltet?
|
Re: Eigenschaft wird gesetzt ohne Wirkung
Kann sein. Wo kann ich das unter Delphi 2009 überprüfen?
MfG xZise |
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.
|
Re: Eigenschaft wird gesetzt ohne Wirkung
Also an den Werten ändert das nichts.
MfG xZise |
Re: Eigenschaft wird gesetzt ohne Wirkung
Schalte mal mit {$O-} die Optimierungen ganz aus. Die CPU-Ansicht sollte sich dann verändern.
|
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 04:26 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-2025 by Thomas Breitkreuz