AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Objekt als published property

Ein Thema von Angel4585 · begonnen am 7. Sep 2006 · letzter Beitrag vom 7. Sep 2006
Antwort Antwort
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

Objekt als published property

  Alt 7. Sep 2006, 09:49
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
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: Objekt als published property

  Alt 7. Sep 2006, 09:52
Code?!

MfG
freak
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Objekt als published property

  Alt 7. Sep 2006, 09:57
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;
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Objekt als published property

  Alt 7. Sep 2006, 09:59
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...
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Objekt als published property

  Alt 7. Sep 2006, 10:03
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...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Objekt als published property

  Alt 7. Sep 2006, 10:12
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
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Objekt als published property

  Alt 7. Sep 2006, 10:13
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)
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Objekt als published property

  Alt 7. Sep 2006, 10:44
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
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Objekt als published property

  Alt 7. Sep 2006, 10:46
Zitat von Elvis:
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 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