![]() |
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:
also unklar ist mir nur das mit der Variablen "bj" (Baujahr)!
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; 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 |
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! |
ja da fällt mir noch was ein, mal gucken ob ich das dann verstanden hab!
Delphi-Quellcode:
so ist der zugriff auf alter in dem beispiel gesteuert!
procedure TForm1.FormCreate(Sender:TObject);
begin Label1.caption:='Alter: '+IntToStr(Alter); end; 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 |
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. |
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?? |
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. |
äää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 |
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: |
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? |
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: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:02 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