Autor Beitrag
catweasel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Di 04.11.03 22:19 
Hi,

habe mal ne grundsätzliche OOP Frage zum Thema :

ausblenden Quelltext
1:
TObject.create();					


wann genau muss ich beim Erstellen von Objekten zur Laufzeit nun der Create Methode ein (self) , (NIL) , oder mal garnichts () (ist wahrscheinlich mit "nil" identisch?) mitgeben ?

Manchmal sieht man auch z.b. myobject.create(0,5,2,3);
in Quelltexten.. Wird da gleich mit der Createmethode eine Parameterliste übergeben..... :?:

Die Delphi Programmierhilfe sagt das sie als Parameter der Create Methode einen "AOwner" haben will. Also einen Eigentümer....
Das muss aber dann wohl was anderes sein als der Parent, den man ja mit Myobject.parent := Pappa; separat festlegen muss..

Was ist also der Unterschied zwischen einem Parent und einem Owner?

Was ein Parent an sich ist hab ich mir schon so ein bischen zusammenreimen können... (über die Beziehung Form <-> Buttons...)
Aber was ein Owner ist und was man mit Create() so alles machen kann, da raff ich nix...

Könnt ihr mir da mal Erleuchtung bringen ? :wink:

Catweasel
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Mi 05.11.03 11:15 
Hallo!

catweasel hat folgendes geschrieben:
wann genau muss ich beim Erstellen von Objekten zur Laufzeit nun der Create Methode ein (self) , (NIL)[...]

Ein Constructor kann genauso wie alle anderen Methode auch Parameter bekommen. Bei Visuallen Komponenten (von TComponent abgeleitet) hat der Constructor nur einen Parameter: aOwner.

Der Parameter aOwner ist vom Typ TComponent. Das heißt das du hier eine andere Komponente oder nil als Parameter angeben musst.

catweasel hat folgendes geschrieben:
oder mal garnichts () (ist wahrscheinlich mit "nil" identisch?) mitgeben ?

Wenn ein Parameter erwartet wird dann musst du auch einen angeben. Wenn du also nur () angibst wird daraus nicht gleich NIL (eine Ausnahme gibt es allerdings). Das hat vielleicht funktioniert weil kein Paramter erwartet wird.

catweasel hat folgendes geschrieben:
Manchmal sieht man auch z.b. myobject.create(0,5,2,3);
in Quelltexten.. Wird da gleich mit der Createmethode eine Parameterliste übergeben..... :?:

Wie oben schon gesagt können auch Konstruktoren Parameter übergeben werden. Welche Parameter das sind hängt von der Definition des Konstruktors ab.

catweasel hat folgendes geschrieben:
Was ist also der Unterschied zwischen einem Parent und einem Owner?

Der Owner wird ja im Konstruktor festgelegt und gibt an wem die Komponente gehört. Wenn du einen Button erstellst und gibst eine Form als Owner an dann gehört der Button der Form. Wenn du dann z. b. die Form mit Free frei gibst dann kümmert sich die Form darum das auch alle Komponenten die ihr gehören ebenfalls freigegeben werden.

Die Paranet Eigentschaft legt fest auf welcher Komponente die Komponente angezeigt werden soll. Wenn du z. b. eine Form mit einem Panel hast und in diesem Panel den Button anzeigen möchtest dann musst du als Parent das Panel angeben.

Ich hoffe ich konnte dir ein wenig helfen.

Gruß
Tino

Für diesen Beitrag haben gedankt: Nait
catweasel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 487
Erhaltene Danke: 1

Win 7 64bit
Delphi 7 Second Sedition V7.2
BeitragVerfasst: Mi 05.11.03 15:54 
Hi,

danke für deine Antwort...

Nur nochmal um sicherzugehen dass ich auch alles verstanden habe...

Zitat:
Der Owner wird ja im Konstruktor festgelegt und gibt an wem die Komponente gehört. Wenn du einen Button erstellst und gibst eine Form als Owner an dann gehört der Button der Form. Wenn du dann z. b. die Form mit Free frei gibst dann kümmert sich die Form darum das auch alle Komponenten die ihr gehören ebenfalls freigegeben werden.


Soll das bedeuten, wenn auf einer Form ein Panel und ein button (auf dem Panel) ist:

ausblenden Quelltext
1:
2:
3:
4:
var: knopf : TButton; panel : TPanel; form1 : TForm;

knopf := TButton.create(form1);
knopf.parent := panel;


das dann der Knopf auf dem Panel gezeichnet wird, aber der Form gehört. Also bei einem

ausblenden Quelltext
1:
panel.free;					


das Panel verschwindet, mitsamt dem Button, da er ja keinen "Zeichenuntergrund" mehr hat, denn der war ja mit parent das Panel...
...der Button aber immernoch existiert, da der Owner die Form ist ?????


soweit so gut...
Nochmal eine Frage zu den create() Parametern..

Erklär mal bitte (an nem Beispiel wenns geht), was () bzw. NIL , self bedeutet, also was man beabsichtigt wenn man NIL etc, angibt... (Ist nil dasselbe wie VOID in manch anderen Sprachen?), oder wie das mit den Zahlenparametern geht, wofür sind die gut?


Catweasel
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Mi 05.11.03 16:45 
Hi,

Zitat:
Nochmal eine Frage zu den create() Parametern..


Also: in Delphi sind alle Instanzen bzw. Objekte von Klassen Zeiger. D.h. wenn im Parameter ein Objekt übergeben wird, wird nicht wie bei Variablen der Wert übergeben sonder eine Referenz bzw. ein Zeiger auf das Objekt.

Objekte als Zeiger zu übergeben ist Ressourcenschonend. Daher sind Objekte in Delphi automatisch Zeiger. In C++ z.B. muss man Objekte explizit als Zeiger deklarieren.

nil ist ebenfalls ein Zeiger. Allerdings ein Zeiger, der auf nichts zeigt. Self ist auch ein Zeiger. Und zwar zeigt Self immer auf sich selbst. Wenn du z.B. in deiner Klassendeklaration von TMyClass self anwendest, ist self ein Zeiger/Object von TMyClass. Jede Klasse bringt automatisch Self mit sich.

Z.B. in deiner Anwendung in Form1 ist Self = Form1.

Hoffe ich habe mich verständlich ausgedrückt. Schau dich am besten nach guter Lektüre um, in Sachen OOP in Delphi. Das Thema ist relativ Komplex.

MFG

- Ernesto -

P.S. nil ist vergleichbar mit NULL aus C++