Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Rund um die LCL und andere Komponenten
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Beitrag von br_klaus »

Hallo,

bei meinen verschiedenen Versuchen, Programme endlich zum Laufen zu bringen (mal geht es, dann plötzlich wieder nicht mehr), bin ich darauf gestoßen, daß in manchen Programmbeispielen bei OnCreate (bzw FormCreate) als Parameter TheOwner: TComponent, bei anderen Sender: TObject genommen wird. Warum? Hat das seine besondere Bewandtnis? Was ist der Unterschied zwischen beiden, und wann soll man die eine oder die andere Form bevorzugen?

Herzlichen Dank!

P. Nikolaus

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Beitrag von Scotty »

Das ist objektorientierte Programmierung. Du kannst auch eine Methode Create; haben (TBitmap oder Dialoge) oder selbst ein .Create(Sender:TMyParentControl) erstellen. Eine Wahl bleibt dir allerdings bei benutzten Komponenten nicht, es sei denn, du überschreibst die Methode per reintroduce. BTW: die Frage passt nicht zu deinem Problem. Vielleicht gehst du besser ins Detail. 8)

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Beitrag von theo »

Ich verstehe die Frage auch nicht wirklich.
Wenn du keine Komponente selber schreibst, musst du gar nichts "bevorzugen". Es sind Gegebenheiten.
Was das damit zu tun hat, ob ein Programm "läuft" oder nicht, kann ich nicht nachvollziehen.
Ausserdem mischst du Create Parameter (z.B. TheOwner:TComponent) mit Parametern von Ereignisbearbeitungsmethoden (Sender:TObject).
Bitte formuliere die Frage nochmal.

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Beitrag von br_klaus »

Ich glaube, ich habe jetzt eine gewisse Antwort auf meine Frage gefunden.
Bin gerade dabei, ein kleines Kalenderprogramm zu entwerfen (mit Ostern und kirchlichen und eigenen Fest- und Gedenktagen etc.), ähnlich wie das alte Programm BMS-Kalender, nur mit viel mehr Möglichkeiten). Da brauchte ich eine Statusbar. Wenn ich dann (bei einem Onkey-Ereignis der Form) angab Statusbar1.simpletext:= '...', dann gab es einen Fehler.
Ich mußte erst eine Prozedur Statusbar1.create(AOwner:TComponent) einbauen (d.h. in der Form einen constructor TForm1.create(AOwner:TComponent), wo das geschieht, und dann entsprechend einen destructor), zusätzlich zur ProzedurTForm1.FormCreate(Sender:TObject).
Aber warum das so ist, habe ich keine Ahnung.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6837
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Beitrag von af0815 »

br_klaus hat geschrieben:... Wenn ich dann (bei einem Onkey-Ereignis der Form) angab Statusbar1.simpletext:= '...', dann gab es einen Fehler.
Ich mußte erst eine Prozedur Statusbar1.create(AOwner:TComponent) einbauen .....
Ich würde sagen die Fehlermeldung kommt daher, das es ganz einfach keine Statusbar1 gegeben hat. Normalerweise droppt man die im Designer auf die Form. Wenn man will, kann man die natürlich auch per Programm erzeugen.

Das ist kein unerklärliches Verhalten. Ausser man hat jeden Abend Probleme über die plötzlich hereinbrechende Dunkelheit.

Wenn man mit RAD Programmen arbeitet, so wird einem sehr viel durch den Designer abgenommen und verschwindet aus dem normal sichtbaren Bereich. Durch das verwenden von Komponenten werden die mehr oder minder automatisch von Programm erzeugt bzw. zerstört. Macht man es nicht über den Designer, so ist man für das richtige erzeugen und zerstören selbst verantwortlich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Oncreate mit TheOwner: TComponent oder Sender:TOBject?

Beitrag von Socke »

af0815 hat geschrieben:Wenn man mit RAD Programmen arbeitet, so wird einem sehr viel durch den Designer abgenommen und verschwindet aus dem normal sichtbaren Bereich. Durch das verwenden von Komponenten werden die mehr oder minder automatisch von Programm erzeugt bzw. zerstört. Macht man es nicht über den Designer, so ist man für das richtige erzeugen und zerstören selbst verantwortlich.
Streng genommen übernimmt der RAD-Teil nur das automatische Erstellen eines Formulars und aller seiner Komponenten (abgeleitet von TComponent) indem per "Streaming" eine Beschreibungsdatei gelesen und verarbeitet wird.
Das Aufräumen und Freigeben von Speicher wird komplett von TComponent übernommen und das Funktioniert so:
TComponent.Create(TheOwner: TComponent) wird eine andere Instanz (=Objekt) von TComponent übergeben. Durch entsprechende Methoden (Notify, e.a.) wird die neue Komponente in einer Liste aufgenommen. Wird nun das Objekt, welches als TheOwner übergeben wird freigegeben, benachrichtigt es alle Komponenten in seiner Liste und gibt diese hinterher frei. Übergibt man kein Objekt beim Erstellen, muss man sich selbst um das Freigeben kümmern.
Andersherum benachrichtigt jede Komponente seinen Eigentümer (Owner), wenn es selbst freigegeben wird. Man kann also auch manuell aufräumen, wenn es eigentlich gar nicht notwendig ist.

Dieses Verhalten kann man selbstverständlich auch in eigenen Klassen verwenden (einfach von TComponent ableiten), große Magie ist das nicht.
af0815 hat geschrieben:
br_klaus hat geschrieben:... Wenn ich dann (bei einem Onkey-Ereignis der Form) angab Statusbar1.simpletext:= '...', dann gab es einen Fehler.
Ich mußte erst eine Prozedur Statusbar1.create(AOwner:TComponent) einbauen .....
Ich würde sagen die Fehlermeldung kommt daher, das es ganz einfach keine Statusbar1 gegeben hat. Normalerweise droppt man die im Designer auf die Form. Wenn man will, kann man die natürlich auch per Programm erzeugen.
Statusbar1 scheint wohl eine Variable (bzw. ein Feld des Formulars) zu sein. Den Konstruktor sollte man jedoch immer von einer Klasse aufrufen (Statusbar1 := TStatusBar.Create(Form1);). Wenn man es doch tut, erhält man üblicherweise eine Fehlermeldung (da die Variable auf kein gültiges Objekt zeigt).
Ein Sonderfall sind Objekte (Keyword object anstatt class; siehe http://www.freepascal.org/docs-html/ref ... 8-640005.1 in der Sprachreferenz), da diese etwas anders als Klassen (bzw. deren Instanzen) verwaltet werden. In der Praxis wirst du sie aber kaum antreffen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten