Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi welche Informationen schickt eigentlich (Sender: TObject) (https://www.delphipraxis.net/54519-welche-informationen-schickt-eigentlich-sender-tobject.html)

Tau 5. Okt 2005 21:54


welche Informationen schickt eigentlich (Sender: TObject)
 
Hallo Leute

Hätte da ein bar fragen zu (Sender: TObject)

wie kann ich feststellen welche Informationen von Sender an das onChange Ereignis weitergegeben werden?
Oder besser noch von welcher Komponente sind die informationen. :gruebel:

Kann man vielleicht auch eine Liste in ein Memo schreiben?


Schöne Grüsse
Tau

dizzy 5. Okt 2005 22:13

Re: welche Informationen schickt eigentlich (Sender: TObject
 
In Sender wird dir eine Referenz auf das auslösende Objekt übergeben. Wenn also ein Button1 eine OnClick-Routine auslöst, so ist Sender vom Typ TButton und du kannst auf ihn zugreifen. Das ist praktisch wenn mehrere Komponenten ein und die selbe Ereignisbehandlungsprozedur erhalten. Du kannst dadurch also ermitteln wer genau das Ereignis ausgelöst hat, und auch gleich mit dem Objekt interagieren.
Es ist deswegen vom Typ TObject, da TObject Vorfahre aller Komponenten ist. Somit kann dort jeglicher Typ drin übergeben werden ohne die OOP zu treten. Bevor du jedoch die Methoden von z.B. TButton verwenden kannst, musst du casten.
Delphi-Quellcode:
procedure OnClick(Sender: TObject);
begin
  (Sender as TButton).Caption := 'Ich bin geklicked';
end;
Sollte Sender hier kein TButton sein gibt's eine Exception. Daher lässt sich das über den is-Operator auch im Vorfeld abprüfen.


Gruss,
Fabian

leddl 5. Okt 2005 22:16

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Sender ist vom Typ Tobject (Steht ja auch schon da ;)) und beinhaltet das Objekt, von dem aus die Methode aufgerufen wird. Also in einer OnClick-Prozedur eines Buttons ist es der gedrückte Button. So kannst du zB eine Methode mehreren Komponenten zuordnen und per Typenüberprüfung trotzdem alles richtig zuordnen.
Zitat:

Kann man vielleicht auch eine Liste in ein Memo schreiben?
:gruebel: Die Frage versteh ich jetzt irgendwie nich...

//Edit:
Ich sollte öftes vor dem Abschicken mal unten im Fenster nachschauen :roll:

Grishnak 5. Okt 2005 22:18

Re: welche Informationen schickt eigentlich (Sender: TObject
 
'OnChange' ist ein TNotifyEvent und folgendermaßen deklariert:
Delphi-Quellcode:
type
  TNotifyEvent = procedure(Sender: TObject) of object;
Das einzige was du bekommst, ist das auslösende Objekt.

Zitat:

Zitat von Tau
Kann man vielleicht auch eine Liste in ein Memo schreiben?

Was meinst du damit? Wenn du ein TStringList-Objekt hast, dann kannst du dessen Inhalt (die Strings) mittels
Delphi-Quellcode:
Memo1.Text:=StringList1.Text;
in ein TMemo-Objekt kopieren.

Tau 5. Okt 2005 22:28

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Hi

Zitat:

Das einzige was du bekommst, ist das auslösende Objekt.
ich möcht wissen welcher Komponenten Type (TButton, TAction usw.) hat es ausgelöst.

An diese Informationen möchte ich rankommen.


Tau
:hi:

Grishnak 5. Okt 2005 22:32

Re: welche Informationen schickt eigentlich (Sender: TObject
 
per "Sender.ClassName" (String) oder "Sender.ClassType" (TClass)!

Tau 5. Okt 2005 22:50

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Hi


D A N K E ! ! !

der tipp mit "Sender.ClassName" war genau das was ich gesucht hatte.


:witch: :dancer2: :witch:

Tau
:hi:

ArmyMan 24. Apr 2006 11:50

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Hallo allerseits

Hab noch eine kleine Frage zu dem Sender : TObject.
Kann man im Sender ausfinden von welchem Event aus diese Procedure aufgerufen wurde?

z.B. wenn man in einem TEdit in dem OnChange und in dem OnExit die gleiche Procedure aufruft, kann man in der aufgerufenen Procedure rausfinden ob diese von OnChange oder von OnExit aufgerufen wurde??

Thx & Greetz

himitsu 24. Apr 2006 11:53

Re: welche Informationen schickt eigentlich (Sender: TObject
 
TEdit(Sender) ist dein TEdit

du kannst es genauso wie die Variable verwenden ... z.B. TEdit(Sender).Text

aber ob's nun von OnChange, oder OnExit kommt kannst du meines Wissens nicht rausbekommen.


[add]
ach ja, viele verwenden stadt TEdit(Sender) lieber (Sender as TEdit) es kommt aber etwa auf's selbe raus

ArmyMan 24. Apr 2006 11:57

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Gibt es irgend ein "work around" um doch rauszubekommen woher es kommt?

Greetz

Angel4585 24. Apr 2006 12:01

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Diese Events sind ja als Typen Deklariert:
OnChange ist z.B. TNotifyEvent.

Vielleicht kannst du irgendwie diesen Typ übergeben und in deiner Prozedur dann prüfen.

Edit: Huch, sorry das ging mit Klassen, da hab ich was verwechselt... :oops:

mkinzler 24. Apr 2006 12:03

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Zitat:

z.B. wenn man in einem TEdit in dem OnChange und in dem OnExit die gleiche Procedure aufruft, kann man in der aufgerufenen Procedure rausfinden ob diese von OnChange oder von OnExit aufgerufen wurde??
Der einfacheste WorkAround wäre, für verschiedene Events, verschiedene (Event-)Handler zu verwenden!

ArmyMan 24. Apr 2006 12:17

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Wäre echt toll wenn irgend jemand eine Möglichkeit herausfinden würde.
Ich versuchs vorläufig mal anders.

Thx & Greetz

himitsu 24. Apr 2006 12:21

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Es geht nicht anders, als mit verschiedenen EventHandlern.
PS: selbst wenn man auf TNotifyEvent prüfen könnte ... onExit ist das Selbe ... würde also eh nüschts bringen :zwinker:

Du kannst höchstens noch kleine Eventhandler bauen, welche dann einen großen/gemeinsamen mit entsprechenden Parametern aufrufen, anhand derer man es unterscheiden könnte.

ArmyMan 24. Apr 2006 12:24

Re: welche Informationen schickt eigentlich (Sender: TObject
 
OK. Ich mach es doch mit 2 Procedures.

Danke nochmal für eure Hilfe! :wink:
Greetz

Angel4585 24. Apr 2006 12:28

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Nur mal so am rande.. wofür brauchst du das eigentlich? :gruebel:

ArmyMan 24. Apr 2006 13:12

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Konkretes Beispiel:
Ich habe ein TEdit wo man einen Wert zwischen x und y eingeben kann.
OnChange brauch ich um bei der Eingabe schon zu kontrollieren ob der eingegebene Wert zwischen x und y liegt.
Falls nicht ist der "OK" Button deaktiviert.

Wenn ein Wert kleiner x oder grösser als y ist ist zwar der "OK" Button deaktiviert aber man kann ja logischerweise aus dem Feld raus klicke oder mit Tab. Dann soll eine Meldung kommen: "Wert liegt nicht zwischen x und y". Falls der Wert kleiner x ist wird dem Feld x zugewiesen, falls er grösser als y ist steht im Feld y.

Ich hoffe du verstehst was ich hier versuche... :drunken:

Greetz

Angel4585 24. Apr 2006 13:29

Re: welche Informationen schickt eigentlich (Sender: TObject
 
kontrollier doch in deiner Prozedur einfach ob das Edit noch den Fokus hat. wenn nicht dann gibst die Meldung aus.

himitsu 24. Apr 2006 13:30

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Da das eh zwei verschiedene Prüfungen (eine prüft und [de]aktiviert den Button und die andere ndert die werte und giebt 'ne Meldung aus) sind, machen sich 2 Ereignishandler sowieso besser.

ArmyMan 24. Apr 2006 13:36

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Ich brauche jetzt 2 Procedures.
Es funktioniert jetzt wunderbar, also lass ich es glaub ich :lol:

Danke nochmal
Greetz

DGL-luke 24. Apr 2006 13:37

Re: welche Informationen schickt eigentlich (Sender: TObject
 
Nochwas zum Casten: Die Operatoren is und as PRÜFEN, ob der typ übereinstimmt. TType(Object) dagegen castet direkt.

Deshalb ist

Delphi-Quellcode:
if Sender is TButton then
  TButton(Sender).Free;
performanter als

Delphi-Quellcode:
if Sender is TButton then
  (Sender as TButton).Free;
, weil da zwei mal geprüft wird.

(Es sei denn, der Compiler merkt das und optimiert die zweite Prüfung raus... weiss ich nicht)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz