![]() |
Sender???
Servus ich hab da mal ne frage
Problem (besser Unwissenheit): Was bedeutet z.B. With Sender as TFileListBox do dieses "Sender"? Bitte mal ne Erklärung auch wenns bestimmt ganz einfach ist. danke alex |
Re: Sender???
hi
willst du wissen was ein sender is oder was der befehl macht? |
Re: Sender???
wenn geht sender, denn ich weiß nciht was das sender bedeutet wenn ich es weiß kann ich mir den rest bestimmt selber erklären
|
Re: Sender???
Zitat:
|
Re: Sender???
Wenn ein Ergeignis ausgelöst wird, so ist es üblich, daß im Parameter Sender das Objekt übergeben wird, welches das Ereignis ausgelöst hat. Sender wird i.A. aber nur als TObjekt deklariert, damit ist nicht bekannt, über welche Eigenschaften dieses Objekt verfügt.
Mit der Anweisung With Sender as TFileListBox do geht man jetzt davon aus, daß der Sender vom Typ TFileListBox ist und kann somit auf die entsprechenden Eigenschaften und Methoden (z.B. ausgewählte Dateien) zugreifen. Das ganze nennt man auch "type-cast". ...:cat:... |
Re: Sender???
achso,muss ich das dann so verstehen das es im prinzip das gleiche ist wie with TLISTBOX do ? da greife ich ja auch auf die eigenschaften von der listbox zu oder?
|
Re: Sender???
Zitat:
mal sehen ob ich das richtig erklären kann. Du bekommst in den Verschiedenen Ereignissen (OnClick,OnActiv,OnKeyPress,usw.) immer als Sender das Objekt welches das ereigniss ausgelöst hat. Nun kannst Du damit z.B. erreichen das Du für alle Objekte deiner Form (Buttons,Labels,Edits,usw.) nur eine Ereigniss Routiene für z.B. OnClick schreibst. Über den Sender kannst Du jetzt ermitteln welcher Objekttyp das Ereigniss ausgelöst hat (TButton, TLabel,...) und / oder wie der Name des Objektes ist um dann entsprechend zu reagieren. z.B.: Du Hast auf deiner Form: Labels, Edit, Checkboxen. Jetzt weisst Du allen im OnClick die Procedure zu:
Delphi-Quellcode:
procedure TForm1.TestClick(Sender: TObject);
begin If (sender IS TLabel) then begin ShowMessage ('Du hast auf ein Label gecklickt'); end; If (sender IS TEdit) then begin ShowMessage ('Du hast auf ein Edit gecklickt'); end; If (sender IS TCheckBox) then begin ShowMessage ('Du hast auf eine Checkbox gecklickt'); end; end; |
Re: Sender???
achso, danke jetzt hats klickt bei mir gemacht. das ist also ne art quelltext verkürzung zum abfragen welche komponente welches ereignis ausgeführt hat und dann es behandeln?
|
Re: Sender???
Zitat:
hier noch mal ein OnClick zur verdeutlichung:
Delphi-Quellcode:
Wie Du siehst Prüfe ich mit Sender IS TEdit ob auf ein Edit geklckt wurde.
procedure TForm1.TestClick(Sender: TObject);
begin If (sender IS TEdit) then begin ShowMessage ('Du hast auf ein Edit mit dem Name: ' + (Sender As TEdit).Name + ' und dem Inhalt: ' + (Sender As TEdit).Text + ' gecklickt'); end; end; Jetzt greife ich mit Sender AS TEdit auf die Eigenschaften des Edits zu. Ein (Sender As TLabel).Text könnte z.B. nicht funktionieren da ein Label ja keine Eigenschaft Text besitzt. |
Re: Sender???
danke echt klasse von dir hat mir sehr geholfen da kann ich meine programme gleich so umschreiben.
mit label würde es dann (Sender As Label).caption heißen ge? |
Re: Sender???
Sharky
ich hab mal ne frage: angenommen ich hab 2 buttons und will mit sender überprüfen welcher von den beiden geklickt wurde und dann jeweils zwei andere anweisungen durchlaufen lassen |
Re: Sender???
Zitat:
|
Re: Sender???
Zitat:
Delphi-Quellcode:
Oder Du machst dies über die Tag Eigenschaft der Buttons.
procedure TForm1.TestClick(Sender: TObject);
begin If (sender IS TButton) then begin If (sender As TButton).Name = 'Button1') then begin end; If (sender As TButton).Name = 'Button2') then begin end; end; end;
Delphi-Quellcode:
procedure TForm1.TestClick(Sender: TObject);
begin If (sender IS TButton) then begin Case (sender As TButton).Tag of 1: 2: 3: end; end; [Edit] Bei zwei Buttons kannst Du natürlich auch für jeden eine eigene OnClick Procedure machen. Es ist echt davon abhängig was mach machen möchte ob man mit dem Sender arbeitet oder für jedes Objekt eine Eigene Ereignissprocure schreibt. |
Re: Sender???
@ alex
Delphi-Quellcode:
if sender is Button1 then
.... else ... oder bei mehr als 2 button if sender is Button1 then ... if sender is button2 then .... (weis nicht ob das geht)! case sender of button1 : ... button2 : ... end; |
Re: Sender???
nein geht nicht habe ich schon probiert, button1 oder eben button2 undefiniert
|
Re: Sender???
kommt natürlich darauf an wie deine buttons heisen
|
Re: Sender???
danke Sharky
das hilft mir echt weiter |
Re: Sender???
Aber so:
Delphi-Quellcode:
...:cat:...
if sender = Button1 then
.... else ... // oder bei mehr als 2 button if sender = Button1 then ... if sender = button2 then .... |
Re: Sender???
omg sorry natürlich :wall: mein fehler
|
Re: Sender???
ok danke jetzt gehts,
und wenn ich das in eine procedure packen will?
Delphi-Quellcode:
[edit=sakura]Delphi-TAGs gesetzt. Mfg, sakura[/edit]
procedure Test(Sender:TObject);
begin if (Sender is TButton) then begin if (Sender as TButton).Name = 'Button2' then begin if Form1.OpenDialog1.Execute then begin ... end; end; if (Sender as TButton).Name = 'Button1' then begin Form1.close; end; end; end; procedure TForm1.Button2Click(Sender: TObject); begin TEST; end; procedure TForm1.Button1Click(Sender: TObject); begin TEST; end; |
Re: Sender???
was muss ich TEST übergeben damit er sender kennt?
|
Re: Sender???
sorry aber bitte helft mir mal denn er will für test ein parameter (ist ja klar ) aber wenn ich in test nicht sender:Tobject deklarieren würde,dann kennt er sender auch net
|
Re: Sender???
dann übergebe einfach ein object
|
Re: Sender???
Also entweder die komplizierte:
Code:
Oder die einfache, da weißt Du einfach im Objekt Inspektor beiden Komponenten die gleiche Ereignismethode zu ;-)
procedure TForm1.Button2Click(Sender: TObject);
begin TEST[color=#ff0000](Sender)[/color]; end; procedure TForm1.Button1Click(Sender: TObject); begin TEST[color=#ff0000](Sender)[/color]; end; ...:cat:... |
Re: Sender???
Stop! halt! Zurück!
Du machst einen Denkfehler! Was Du gemacht hast ist: Für jeden der beiden Buttons ein OnClickereigniss zu haben. Jetzt hast Du eine zusätzliche Procedure die in dem OnClick aufgerufen wird. Das macht so keine Sinn. Entweder Du schreibst deinen Code direckt in an OnClick des jeweiligen Buttons.
Delphi-Quellcode:
Oder Du weisst beiden Buttons die selbe OnClick Procedure zu.
procedure TForm1.Button2Click(Sender: TObject);
begin if Form1.OpenDialog1.Execute then begin ... end; end; procedure TForm1.Button2Click(Sender: TObject); begin Close; end; |
Re: Sender???
danke hunzt jetzt dürfte ich es können,danke nochmal an alle die mir geholfen haben
alex |
Re: Sender???
achso es sollten also die gleichen proceduren für mehrer buttons sein? klar macht ja auch mehr sinn
|
Re: Sender???
angenommen ich habe jetzt für zwei buttons jeweils eine onclick procedure geschrieben
diese will ich nun im objectinspector unter on click reinschreiben (die procedure heißt test) muss ich da nur test reinschrieben oder nochwas und muss ich hinter die procedure noch was schreiben? |
Re: Sender???
sorry nehm alles zurück habs hinbekommen es geht mit der onclick sache
danke |
Re: Sender???
Zitat:
hihi..... Es macht nur Sinn wenn bei allen das gleiche ausgeführt werden soll. Besser ist das zu erklären an einem Label. Angenommen Du hast auf deiner Form Labels in denen eine WEB-Adresse steht.
Delphi-Quellcode:
Jetzt möchtest Du bei einem Click auf ein Label das die entsprechende Seite im Browser geöffnet wird.
Label1.Caption := 'http:/www.delphipraxis.net';
Label2.Caption := 'http:/www.sharkys-home.de'; Label3.Caption := 'http:/www.borland.com'; Du könntest jetzt entweder für jedes Label ein OnClick schreiben:
Delphi-Quellcode:
Oder Du verwendest für alle drei Labels das gleiche OnClick:
procedure TForm1.Label1Click(Sender: TObject);
begin shellexecute(handle, 'open', PChar(Label1.Caption), nil, nil, sw_show); end; procedure TForm1.Label2Click(Sender: TObject); begin shellexecute(handle, 'open', PChar(Label3.Caption), nil, nil, sw_show); end; procedure TForm1.Label3Click(Sender: TObject); begin shellexecute(handle, 'open', PChar(Label3.Caption), nil, nil, sw_show); end;
Delphi-Quellcode:
Wie Du siehst spart man sich so einiges an Code und kann Fehler vermeiden.
procedure TForm1.Alle_LabelClick(Sender: TObject);
begin shellexecute(handle, 'open', PChar((Sender As TLabel).Caption), nil, nil, sw_show); end; Bei einem Button macht das natürlich nur Sinn wenn bei allen Buttons die Procedure aufgerufen wird. |
Re: Sender???
danke jetzt glaub ich es wirklich zu verstehen, *g*
|
Re: Sender???
Das ganze kann mann auch benutzen um rekursive Aufrufe zu unterbinden...
Wenn man z.B. zwei Listboxen hat und die beide auf eine Aktion der anderen reagieren soll:
Delphi-Quellcode:
Ohne die Abfragen *1 & *2 würde das Programm hängen bleiben, da ein Click auf eine der Listboxen
Procedure TForm1.ListBox1Click(Sender:TObject);
Begin if Sender=ListBox2 Then exit; {*1} {... Code für die 1. ListBox ...} ListBox2Click(ListBox1); end; Procedure TForm1.ListBox2Click(Sender:TObject); Begin if Sender=ListBox1 Then exit; {*2} {... Code für die 2. ListBox ...} ListBox2Click(ListBox2); end; auch einen CLick auf die andere aufrufen würde ... und immer so weiter ;() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 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-2025 by Thomas Breitkreuz