Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Objekt als published property (https://www.delphipraxis.net/76632-objekt-als-published-property.html)

Angel4585 7. Sep 2006 09:49


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:

freak4fun 7. Sep 2006 09:52

Re: Objekt als published property
 
Code?! :angel:

MfG
freak

Elvis 7. Sep 2006 09:57

Re: Objekt als published property
 
Zitat:

Zitat von Angel4585
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...

Man, man Angel. Du bist mir ja einer...


Eine AV an 0 bedeutet schlicht dass deine Variable auf nüschts (in Delphi nil genannt) zeigt.
Du hast also eine Property:
Delphi-Quellcode:
fSomeValue : TSomeType
property SomeValue : TSomeType read fSomeValue;
Natürlich musst du erst etwas in fSomeValue reinwerfen.
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;

Angel4585 7. Sep 2006 09:59

Re: Objekt als published property
 
Delphi-Quellcode:

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;
iss jetz nur en simples beispiel un ausm Kopf raus...

Elvis 7. Sep 2006 10:03

Re: Objekt als published property
 
Zitat:

Zitat von Angel4585
iss jetz nur en simples beispiel un ausm Kopf raus...

Hofdentlich ist es in deiner App entweder eine readonly Property oder su legst die Instanz nicht im Constructor an...

oki 7. Sep 2006 10:12

Re: Objekt als published property
 
Wenn es eine ReadOnly währe, dann müßte write verschwinden.

Möglich ist auch folgendes:
Delphi-Quellcode:
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;
Create auf FObject im Constructor obligatorisch, sonst alter Fehler.

Gruß oki

Angel4585 7. Sep 2006 10:13

Re: Objekt als published property
 
OK hier das Original:
Delphi-Quellcode:
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.
BTW @ Elvis:

Das geht au net:
Delphi-Quellcode:
procedure DeineKlasse.AfterConstruction;
begin
  inherited;
  fSomeValue := TSomeType.Create();
end;
gleicher Fehler(Und ich habe natürlich meine Klassennamen eingesetzt)

oki 7. Sep 2006 10:44

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:
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.
gruß oki

Elvis 7. Sep 2006 10:46

Re: Objekt als published property
 
Zitat:

Zitat von Elvis
Zitat:

Zitat von Angel4585
iss jetz nur en simples beispiel un ausm Kopf raus...

Hofdentlich ist es in deiner App entweder eine readonly Property oder su legst die Instanz nicht im Constructor an...

Grübel mal darüber und erkläre mir danach mal folgendes:
Was passiert hier?
Delphi-Quellcode:
v := TDeineKlasse.Create();
v.DeineProperty := andererWert;
Und wie willst du jetzt die Instanz freigeben, die du im Constructor angelegt hast?

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 15:16 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