AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Muss Sender immer TComponent sein?

Ein Thema von Jumpy · begonnen am 21. Jan 2011 · letzter Beitrag vom 24. Jan 2011
Antwort Antwort
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#1

Muss Sender immer TComponent sein?

  Alt 21. Jan 2011, 12:30
Hallo,

ich hab eine Klasse TMSG (ohne Form), die Nachrichten-Strings sammelt und eine Klasse TViewMSG (mit Form), die Nachrichten anzeigt.

z.Zt. wird ein TViewMSG Object in TMSG erzeugt über:
fViewMSG:= TViewMSG.Create(nil);
Die Klasse bzw. das Form TViewMSG hat noch keine eigene OnCreate-Routine.

Nun möchte ich das aber so ändern, dass TViewMSG eine Referenz auf TMSG bekommt, indem sich zunächst der Aufruf in TMSG ändert zu:
fViewMSG:= TViewMSG.Create(self);

Gleichzeitig hab ich dann auch das OnCreate-Ereignis testweise in TViewMSG erzeugt:
Delphi-Quellcode:
procedure TViewMSG.FormCreate(Sender: TObject);
begin
  showmessage(Sender.ClassName);
  inherited Create(nil);
end;
Der Kompiler meckert aber schon bei fViewMSG:= TViewMSG.Create(self);
[Fehler] uMSG.pas(200): Inkompatible Typen: 'TComponent' und 'TMSG'

Daher die Frage, muss der Sender immer eine Komponente sein, oder was versteh ich da nicht?

Jumpy
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#2

AW: Muss Sender immer TComponent sein?

  Alt 21. Jan 2011, 12:40
Der Sender muss TObject sein (also eine beliebige Klasse), der Owner aber TComponent.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Muss Sender immer TComponent sein?

  Alt 21. Jan 2011, 12:49
Muss ich dann beides übergeben? Wie?

fViewMSG:= TViewMSG.Create(self,nil);

Oder übergebe ich nur den Owner, der Sender wird dann automatischmitgeliefert?

-----
Edit:

Habs mal ausprobiert mit:
in TMSG: fViewMSG:= TViewMSG.Create(nil);

und in TViewMSG
Delphi-Quellcode:
procedure TViewMSG.FormCreate(Sender: TObject);
begin
  showmessage(Sender.ClassName);
  inherited Create(nil);
end;
Das gibt schonmal keine Fehlermeldung, aber als Sender wird mir nun TViewText angezeigt.
Wie krieg ich die aufrufende/erzeugende Klasse an die erzeugte Klasse?
Ralph

Geändert von Jumpy (21. Jan 2011 um 12:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#4

AW: Muss Sender immer TComponent sein?

  Alt 21. Jan 2011, 12:58
Das "inherited Create" gehört nicht ins FormCreate, sondern in den Konstruktor. Zeig uns doch einmal die Deklaration der beiden Konstruktoren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Muss Sender immer TComponent sein?

  Alt 21. Jan 2011, 13:49
Hallo DeddyH,

deine Frage hat mir schon die Augen geöffnet. OnCreate ist ja nicht der Konstruktor (wie ich blöderweise dachte) sondern das Ereignis, das beim Aufruf des Konstruktors gefeuert wird.
Daher war der Sender bei mir oben auch das TViewMSG selbst.

Da ich keinen Konstruktor hatte, galt denk ich mal der der Mutterklasse TForm und der will halt gern einen Owner TComponent.

Hab das OnCreate gelöscht und folgenden Konstruktor gebaut:
Delphi-Quellcode:
constructor TViewMSG.Create(Sender: TObject);
begin
  if Sender is TComponent then inherited Create(TComponent(Sender))
  else inherited Create(nil);
  if Sender <> nil then showmessage(Sender.ClassName);
end;
Damit läuft es, wie es soll, aber es kommt die Warnung im Kompiler:
[Warnung] mViewMSG.pas(31): Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomForm'

Ist das schlimm? Muss ich da noch irgendwo ein override oder so hinzufügen?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#6

AW: Muss Sender immer TComponent sein?

  Alt 21. Jan 2011, 13:57
Ist das schlimm? Muss ich da noch irgendwo ein override oder so hinzufügen?
Richtig erkannt. Schreib im Interface-Teil einfach "override;" hinter die Konstruktor-Deklaration, dann sollte die Meldung verschwinden.

[edit] Halt! Geht so nicht, da Du ja keinen Owner, sondern einen Sender übergibst. [/edit]

[edit2] Wovon ist denn TViewMSG abgeleitet? TCustomForm? [/edit2]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (21. Jan 2011 um 13:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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 by Thomas Breitkreuz