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
Oncreate mit TheOwner: TComponent oder Sender:TOBject?
-
- 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?
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. 

Re: Oncreate mit TheOwner: TComponent oder Sender:TOBject?
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.
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.
-
- 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?
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.
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.
- af0815
- Lazarusforum e. V.
- Beiträge: 6835
- 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?
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.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 .....
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).
-
- 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?
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.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.
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.
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).af0815 hat geschrieben: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.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 .....
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein