Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi property...read..write (https://www.delphipraxis.net/3064-property-read-write.html)

Haegar 20. Feb 2003 20:28


property...read..write
 
also irgendwie hab ich hier nen beispiel aus nem buch, aber ich komm noch nicht ganz dahinter!
hier der wichtige Teil des quelltextes
Delphi-Quellcode:
interface
 type TAuto=class(TObject)
  private
   bj:integer;              
   function liesAlter: integer;
   procedure schreibAlter(a:integer);
  public
   constructor erzeugen(xpos,ypos:integer; color:longint, baujahr:integer);
   property Alter:integer read liesAlter write schreibAlter;
 end;

implementation

function TAuto.liesAlter:integer;
begin
 result:=StrToInt(FormatDateTime('yyyy',Date))-bj;
end;

procedure TAuto.schreibAlter(a:integer);
begin
 bj:=StrToInt(FormatDateTime('yyyy',Date))-a;
end;

constructor tAuto.erzeugen(xpos,ypos:integer;color:longint; baujahr:integer);
begin
 x:=xpos;
 y:=ypos;
 farbe:=color;
 bj:=baujahr;
end;
also unklar ist mir nur das mit der Variablen "bj" (Baujahr)!
mein gedanke dazu!
-baujahr wird duchr constructor übergeben!
-danach mit function liesAlter das Alter
ermittelt (differenz: aktuell-bj)


und was hat das jetzt mit der Prozedur auf sich?
warum wird da nochmal bj bestimmt, bzw. was hat es mit der variable a auf sich???
kann mir wer helfen(ohne verbesserungsvorschläge, nur was da passiert)


danke haegar

Touchdown 20. Feb 2003 21:14

Das passt alles!

Beim Erzeugen eines Objektes TAuto muss man Übergabeparameter mitgeben, da dies der Constructor so vorsieht. Damit ist bj (nicht über eine Property) in jedem Fall gesetzt.

'Liesalter' wird hier nie aufgerufen. Nur wenn sie es wird(ein Button 'Alter anzeigen' z.b könnte dies anstossen), wird über diese Funktion anhand des Baujahrs das richtige Alter berechnet.

Bei 'schreibAlter' ist a ein Übergabeparameter der wohl das Alter des Autos meint. Diese Procedure setzt anhand des neuen Alters auch ein neues Baujahr!


PS: Ein sehr schönes Beispiel muss ich sagen!

Haegar 20. Feb 2003 21:28

ja da fällt mir noch was ein, mal gucken ob ich das dann verstanden hab!
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender:TObject);
 begin
  Label1.caption:='Alter: '+IntToStr(Alter);
 end;
so ist der zugriff auf alter in dem beispiel gesteuert!
heisst das, das procedure schreibAlter(a:integer); gar nicht aufgerufen/benutzt wird!? ist die dazu da, das ich per altersangabe (entspricht dann a?) das baujahr ermittle?
dann wär das ja in dem programm qausi überflüssig, aber warum greifen sie es dann mit auf? naja wenn das nu stimmen sollte wie ich mir das denke, soll mir das egal sein ;)

ciao haegar

Touchdown 20. Feb 2003 21:46

Du musst es anders sehen.

Wenn man das Alter eines Autos ändert, wird automatisch das Baujahr angepasst(was absolut sinnig ist!). Das ist im wesentlichen Sinn und Zweck des Codes!

Kleine Anmerkung noch: bj ist privat deklariert, du kannst also innerhalb dieser Unit darauf zugreifen. Von anderen Units muss man es über die Property machen! Da stecken ne Menge Möglichkeiten drin. Z.B lässt man eine Write-Property weg und man hat einen Read only Parameter.

Haegar 20. Feb 2003 21:50

aber in meinem beispiel ist die write-geschichte auch nicht von nöten, oder? denn es wird nirgends eine ALTERSANGABE gemacht! es wird lediglich bei FormCreate das Baujahr angegeben! und da tritt ja die function in kraft


wenn ich beispielsweise die write-property nutzen wollen würde, dann müsste ich das folgendermaßen machen!?

Auto.Alter:=10; würde dann ein durch eine Jahresangabe bei Formcreate erzeugter alterswert überschrieben werden, wenn ich das so später aufrufe??

Touchdown 20. Feb 2003 21:57

Beim Create füllst du 'bj' direkt nicht über die Porperty!

Innerhalb dieser Unit wird keine eigene Funktion oder Prozedure aufgerufen, dies könnten andere Units übernehmen z.B.

Ich würde es aber eher als Beispiel sehen.

Haegar 20. Feb 2003 22:00

ääähh....aha...naja ich mach mich erstml ins bett, hab ja schließlich schule. und dann kann ich mir das morgen in aller ruhe nochmal alles duchdenken.

danke ciao haegar

Touchdown 20. Feb 2003 22:01

Innerhalb dieser Unit ist alles möglich, auch die direkte Änderung von Baujahr.

Mach dir ne 2. Unit und versuch mal da direkt Baujahr zu ändern ohne Propertys :spin:

Haegar 20. Feb 2003 22:05

gut dann hatte ich halt nochwas verheimlicht :roll:
diese ganze TAuto=class(TObject)-Geschichte ist eine eigene unit
mit all den private und public prozeduren und funktionen!
die unit1 (Form1) die macht dann die ganze ansteurerung!
und dann nochmal die frage wegen

auto.alter:=10; (in unit1 enthalten)
würde das dann die write-property benutzen, oder wie mache ich das?

Touchdown 20. Feb 2003 22:18

auto.alter:=10;

würde die write property ansprechen und die dahinter liegende Funktion oder Procedure ausführen.

Allerdings hab ich jetzt bedenken wegen der Syntax, ich denke mal eben eher so (hab zur Zeit zuhause kein Delphi installiert):

auto.alter(10);

Der Compiler wird es dir schon sagen :wink:

sakura 21. Feb 2003 08:01

Delphi-Quellcode:
auto.alter := 10;
ist schon richtig. Intern ruft Delphi dann die Methode schreibAlter auf und übergibt den Wert 10 im AX Register des Prozessors.

Nach aussen sieht das Ganze wie eine Variable aus und intern kann Dein Objekt/Deine Klasse angemessen darauf reagieren.

...:cat:...

P.S.: In Delphi ist es üblich anstatt von liesAlter und schreibAlter die Namen GetAlter und SetAlter zu nutzen, sowie auch den ersten Buchstaben des Namens groß zu schreiben (die Kleinschreibung ist z.B. in Java üblich).

R.Meyrat 21. Feb 2003 08:37

Hallo Zusammen

Das beispiel kommt mir sehr bekannt vor "Kochbuch Borland Delphi 5" von Walter Dobrez und Thomas Kowalski Rezept 262.

da haben die den constructor "Erzeugen(..)" genannt un den destructor " Entfernen"...


roger

Haegar 21. Feb 2003 09:54

ja da beispiel, is aus dem buch "Delphi 6 grundlagen und Profiwissen".
da haben sie das beispiel schrittweise ein wenig optimiert, so das dann die destructor-prozedur wegfiel! is aber ansonsten ganz gut, und kapiert hab ichs nu auch.

danke leutz
ciao haegar

oki 21. Feb 2003 10:19

Noch mal kurz zum Sinn des Beispiels.
Dem Autor geht es sicher darum die Möglichkeiten der Verwendung von Propertys zu zeigen.

Propertys werden in der Regel immer im Privatteil deklariert, damit nicht jemand ohne tiefere Kenntnis des Objektes etwas tun was er nicht soll.

Ist ein Property (Eigenschaft) eines Objektes nur für den Lesezugriff bestimmt, so kann man das am Besten im Public-Teil über die Deklaration Read definieren.

Was müßte man nicht alles tun um das Schreiben von außen zu verhindern. Ein imenser Aufwand. Es muß auch keiner in der Doku nachlesen ob er auf die Eigenschaft schreiben darf (wer liest schon Dokus?). Es wird einfach verhindert.

Somit ist schon mal klar, dass die Deklaration von Variablen in Objekten generell im private-Teil erfolgen sollte und die Art des Zugriffes im Public-Teil mit read und write bestimmt wird.

Warum nun Proceduren und F
unktionen?

Sicher kann mann auch folgendes machen:

Delphi-Quellcode:
interface
type TAuto=class(TObject)
  private
   bj:integer;              
  public
   constructor erzeugen(xpos,ypos:integer; color:longint, baujahr:integer);
   property Alter:integer read bj write bj;
end;

oki 21. Feb 2003 10:31

Irgentwie hat mein Browser gesponnen und ich muß neu weitermachen!

Die von mir gezeigte Form macht in Bezug auf die Variable bj das gleiche wie das Urbeispiel mit einem feinen Unterschied. Was ist, wenn in meinem Objekt bei der Veränderung einer Variablen noch weitere Aktionen ausgeführt werden müssen? Genau dann ist es prima mittels read oder Write Proceduren und Funktionen nutzen zu können. Man übergibt den Parameter und tun dann auch alles nötige in einem Abwasch. Und das schöne, von außen sieht alles gleich aus.

sowohl bei Deinem wie bei meinem Beispiel wird der Wert in Deiner Form1 mit
Delphi-Quellcode:
Auto.Alter := 10;
geändert. Mit der Procedure kann dann aber automatisch noch mehr getan werden.

kleines Bsp.

Du möchtest einen Klartext ändern. Zum Bsp. wie folgt:

Delphi-Quellcode:
procedure SetAlter(Alter : Integer);
begin
bj := Alter;
If bj < 2 then FAlterText := 'neu';
IF (bj > 1) and (bj < 5) then FAlterText := 'noch nicht Schrott';
.
.
.
und so weiter. (die Art der Umsetzung ist jetzt egal, es geht ums Prinzip)

FAlterText währe in deinem Objekt TAuto genauso ein Property auf das man dann vielleicht nur lesend zugreift.

o.k. das wars von mir,

Gruß oki

R.Meyrat 21. Feb 2003 10:31

Bei der Verwendung von Funktionen und Proceduren können die Werte zusätzlich geprüft werden (Eingabe), damit zum Beispiel nur Werte zwischen 1900 und 2099 als Baujahr gültig sind.
Bei der Ausgabe könnte man den Wert zum Beispiel umwandeln in einen andern Typ.

Beispiel:
Geschwindigkeit wird intern als Integer gebraucht aber für die Ausgabe würde String reichen (nicht gerade ein gutes Beispiel :wink: ich weiss). aber Zweck ist deutlich.


gruss roger
:coder:

@OKI binwohl zwischen deinen Postings gelandet, du hast ja das gleiche erklärt wie ich :D

Haegar 21. Feb 2003 11:15

danke, hat mir echt weitergeholfen, bin mal wieder ein stück schlauer! :hello:

dann werd ich mich mal ransetzen und probieren
ciao haegar


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