Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Endlosschleife bei Property (https://www.delphipraxis.net/96139-endlosschleife-bei-property.html)

GroHae 19. Jul 2007 11:24


Endlosschleife bei Property
 
Hallo zusammen,

ich versuche gerade mit Propertys zu arbeiten. Irgendwas mach ich aber falsch:

Delphi-Quellcode:

  TTest = class(TObject)
  strict private
    procedure SetProperty1(val : Integer);
    function GetProperty1 : Integer;

  public
    property Property1 : Integer read GetProperty1 write SetProperty1;
  end;


...


function TTest.GetProperty1: Integer;
begin
  result := Property1;
end;

procedure TTest.SetProperty1(val : Integer);
begin
  Property1 := val; // SetPropery wird wieder aufgerufen --> Endlosschleife
  Property1 := Property1 + 1;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  t : TTest;
begin
  t := TTest.Create;

  T.Property1 := 5;;
  ShowMessage(IntToStr(T.Property1));

  t.Free;

end;

Wenn ich an statt "strict private" nur privat verwende und dann

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  t : TTest;
begin
  t := TTest.Create;

  T.SetProperty1(5);
  ShowMessage(IntToStr(T.Property1));

  t.Free;

end;
sage, passiert genau das selbe.

Was mach ich falsch?

Elvis 19. Jul 2007 11:28

Re: Endlosschleife bei Property
 
Wo speicherst du denn den Wert für Property1, hmm?
Momentan sieht das bei dir so aus:
Um Property1 auszulesen, muss er GetProperty1 ausführen, welches Property1 ausliest, was GetProperty1 ausführt, welches...
Du musst die Werte schon irgendwo abspeichern. Im Normalfall würde man dafür ein Feld benutzen:
Delphi-Quellcode:
private
  fProperty : Mööp;
public
  property Property1 : Mööp read fProperty1 write SetPropert1;
...
procedure TSomeType.SetProperty1(const aValue : Mööp);
begin
  fProperty1 := aValue;
end;

Tormentor32 19. Jul 2007 11:29

Re: Endlosschleife bei Property
 
Deine Property verweist auf sich selber! Du solltest eine Private Variable FProperty1 einführen! In dieser Variable steht der Wert, und über den Getter und Setter erreichst du diesen Wert und kannst ihn nach außen mit Property1 zeigen.

Helmi 19. Jul 2007 11:30

Re: Endlosschleife bei Property
 
Hallo,

probiers mal so:

Delphi-Quellcode:
TTest = class(TObject)
  private
    myproperty: Integer;  
    procedure SetProperty1(val : Integer);
    function GetProperty1 : Integer;

  public
    property Property1 : Integer read GetProperty1 write SetProperty1;
  end;


...


function TTest.GetProperty1: Integer;
begin
  result := myproperty;
end;

procedure TTest.SetProperty1(val : Integer);
begin
  myproperty := val;
  myproperty := myproperty + 1;
end;
Du willst ja eine interene Variable setzen (setproperty) bzw. abfragen (getproperty) nicht die Property selbst.

Wenn du in deiner komponente weiterarbeiten willst, dann verwende myproperty.

mkinzler 19. Jul 2007 11:31

Re: Endlosschleife bei Property
 
Es fehlt auch das private Feld.
Ist ja klar, das du dir so ne Endlos-Rekursion bastelst.

Delphi-Quellcode:
TTest = class(TObject)
  strict private
    FProperty1: Integer;
    procedure SetProperty1(val : Integer);
    function GetProperty1 : Integer;

  public
    property Property1 : Integer read GetProperty1 write SetProperty1;
  end;


...


function TTest.GetProperty1: Integer;
begin
  result := FProperty1;
end;

procedure TTest.SetProperty1(val : Integer);
begin
  FProperty1 := val; // SetPropery wird wieder aufgerufen --> Endlosschleife
  FProperty1 := FProperty1 + 1;
end;

GroHae 19. Jul 2007 12:19

Danke an Alle
 
so schnell so viele Antworten.

Danke an alle, jetzt hab ich's Verstanden. :-D


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