![]() |
Objekt als published property
Hallo,
ich hab folgendes problem: ich habe bei meiner eigenen Komponente ein Objekt als property im published Teil, also sollte ich im Ojektinspektor eigentlich drauf zugreifen können. Allerdings kommt immer die Meldung "Zugriffsverletzung bei Adresse 00000000" wenn ich das mache, also ich vermute das ich das noch irgendwo erzeugen muss, weis jetzt allerdings nicht wo. Im constructor cer Kompo bringt das irgendwie nichts... Kann mir da jemand helfen? MfG :angel: |
Re: Objekt als published property
Code?! :angel:
MfG freak |
Re: Objekt als published property
Zitat:
Eine AV an 0 bedeutet schlicht dass deine Variable auf nüschts (in Delphi nil genannt) zeigt. Du hast also eine Property:
Delphi-Quellcode:
Natürlich musst du erst etwas in fSomeValue reinwerfen.
fSomeValue : TSomeType
property SomeValue : TSomeType read fSomeValue; Der Constructor der Klasse wäre eine Möglichkeit dafür, aber besser wäre es AfterConstruction zu überschreiben: Dann klappt es mit jedem Constructor:
Delphi-Quellcode:
procedure DeineKlasse.AfterConstruction;
begin inherited; fSomeValue := TSomeType.Create(); end; |
Re: Objekt als published property
Delphi-Quellcode:
iss jetz nur en simples beispiel un ausm Kopf raus...TMyObject = class(TObject) private FTest : integer; published property Test : integer read FTest write FTest; end; TMyComp = class(TComponent) private FObjekt : TMyObject; protected public constructor Create(AOwner : TComponent);override; published property Objekt : TMyObject read FObject write FObject; end; constructor TMyComp.Create(AOwner : TComponent); begin inherited Create(AOwner); FObjekt:=TMyObject.Create; end; |
Re: Objekt als published property
Zitat:
|
Re: Objekt als published property
Wenn es eine ReadOnly währe, dann müßte write verschwinden.
Möglich ist auch folgendes:
Delphi-Quellcode:
Create auf FObject im Constructor obligatorisch, sonst alter Fehler.
TMyComp = class(TComponent)
private FObject: TMyObject; procedure setObject(const Value: TMyObject); protected public constructor Create(AOwner : TComponent);override; published property Objekt : TMyObject read FObject write setObject; end; procedure TMyComp.setObject(const Value: TMyObject); begin FObject.assign(Value); end; Gruß oki |
Re: Objekt als published property
OK hier das Original:
Delphi-Quellcode:
BTW @ Elvis:
unit AnLeUser;
interface uses SysUtils, Classes; type TUserData = class(TObject) private FID : Integer; FNick : string; FICQ : string; FAIM : string; FMSN : string; FYAHOO : string; FSKYPE : string; FEMAIL : string; FHP : string; FProfil : string; FBDay : TDateTime; function GetBDay: TDateTime; published property ID : Integer read FID write FID; property Nick : string read FNick write FNick; property ICQ : string read FICQ write FICQ; property AIM : string read FAIM write FAIM; property MSN : string read FMSN write FMSN; property YAHOO : string read FYAHOO write FYAHOO; property SKYPE : string read FSKYPE write FSKYPE; property EMAIL : string read FEMAIL write FEMAIL; property HP : string read FHP write FHP; property BirthDay : TDateTime read GetBDay write FBDay; property Profil : string read FProfil write FProfil; end; TAnLeUser = class(TComponent) private FUserData : TUserData; function GetUserdata: TUserdata; procedure SetUserData(const Value: TUserdata); { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } constructor Create(AOwner : TComponent);override; property Userdata : TUserdata read GetUserdata write SetUserData; property Name; end; procedure Register; implementation procedure Register; begin RegisterComponents('MaWe', [TAnLeUser]); end; { TAnLeUser } constructor TAnLeUser.Create(AOwner: TComponent); begin inherited Create(AOwner); FUserData := TUserData.Create; end; function TUserData.GetBDay: TDateTime; begin if FBDay > 1 then Result := Round(FBDay) else Result:=StrToDateTime('01.01.2000 00:00:00'); end; function TAnLeUser.GetUserdata: TUserdata; begin if not Assigned(FUserData) then FUserData:=TUserData.Create; Result:=FUserData end; procedure TAnLeUser.SetUserData(const Value: TUserdata); begin if not (Value = nil) then FUserData:=Value else if (Value = nil)and(not Assigned(FUserData)) then FUserData:=TUserData.Create; end; end. Das geht au net:
Delphi-Quellcode:
gleicher Fehler(Und ich habe natürlich meine Klassennamen eingesetzt)
procedure DeineKlasse.AfterConstruction;
begin inherited; fSomeValue := TSomeType.Create(); end; |
Re: Objekt als published property
Hi,
ich glaub du willst in eine ganz andere Richtung. Kann es sein, dass du nur die Eigenschaften deines eingebundenen Objectes zum Ändern im Objektinspektor anzeigen willst? Dann mußt du eine "Wrapper-Klasse" schreiben! Ich hab dir einen ansatz mal zusammengeschrieben (getestet)
Delphi-Quellcode:
gruß oki
unit Test;
interface uses SysUtils, Classes; type TAnLeUser = class; TUserData = class(TPersistent) private FOwner : TAnLeUser; function GetID: Integer; procedure SetID(const Value: Integer); public constructor create(AOwner : TAnLeUser); reintroduce; published property ID : Integer read GetID write SetID; end; TAnLeUser = class(TComponent) private FUserData : TUserData; FID: Integer; { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } property ID : Integer read FID write FID; published { Published-Deklarationen } constructor Create(AOwner : TComponent);override; property Userdata : TUserdata read FUserdata write FUserData; property Name; end; procedure Register; implementation procedure Register; begin RegisterComponents('oki', [TAnLeUser]); end; { TAnLeUser } constructor TAnLeUser.Create(AOwner: TComponent); begin inherited Create(AOwner); FUserData := TUserData.Create(self); end; constructor TUserData.create(AOwner: TAnLeUser); begin FOwner := AOwner; end; function TUserData.GetID: Integer; begin IF not assigned(FOwner) then Exit; Result := FOwner.ID; end; procedure TUserData.SetID(const Value: Integer); begin IF not assigned(FOwner) then Exit; FOwner.ID := Value; end; end. |
Re: Objekt als published property
Zitat:
Was passiert hier?
Delphi-Quellcode:
Und wie willst du jetzt die Instanz freigeben, die du im Constructor angelegt hast?
v := TDeineKlasse.Create();
v.DeineProperty := andererWert; Der Code mit dem du TAnblabla instanzierst um danna uf die property zuzugreifen wäre interessanter. Im Form Designer kannst du TUserData nicht benutzen (Er kann es nicht in die DFM schreiben und auslesen), dafür sollte es von TPersistent ableiten und, wie oki schrieb, AssignTo überschreiben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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