Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Sender??? (https://www.delphipraxis.net/9558-sender.html)

Alex_ITA01 29. Sep 2003 10:37


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

LoL 29. Sep 2003 10:51

Re: Sender???
 
hi

willst du wissen was ein sender is oder was der befehl macht?

Alex_ITA01 29. Sep 2003 10:53

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

LoL 29. Sep 2003 10:55

Re: Sender???
 
Zitat:

Zitat von Delphi Hilfe
In einer Ereignisbehandlungsroutine gibt der Parameter Sender an, welche Komponente das Ereignis empfangen und daraufhin die Ereignisbehandlungsroutine aufgerufen hat. Es kann sinnvoll sein, daß mehrere Komponenten gemeinsam eine Ereignisbehandlungsroutine verwenden, die sich abhängig davon, welche Komponente sie aufgerufen hat, unterschiedlich verhält. Dazu verwenden Sie den Parameter Sender in einer if...then...else-Anweisung. Beispielsweise zeigt der folgende Code den Titel der Anwendung in der Titelleiste eines Dialogfelds nur dann an, wenn das Ereignis OnClick von Button1 empfangen wurde.


sakura 29. Sep 2003 10:57

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:...

Alex_ITA01 29. Sep 2003 10:59

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?

Sharky 29. Sep 2003 11:02

Re: Sender???
 
Zitat:

Zitat von Alex_ITA01
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

Hai Alex,

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;

Alex_ITA01 29. Sep 2003 11:06

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?

Sharky 29. Sep 2003 11:19

Re: Sender???
 
Zitat:

Zitat von Alex_ITA01
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?

Hai Alex,

hier noch mal ein OnClick zur verdeutlichung:

Delphi-Quellcode:
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;
Wie Du siehst Prüfe ich mit Sender IS TEdit ob auf ein Edit geklckt wurde.
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.

Alex_ITA01 29. Sep 2003 11:25

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?

Alex_ITA01 29. Sep 2003 11:34

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

Sharky 29. Sep 2003 11:35

Re: Sender???
 
Zitat:

Zitat von Alex_ITA01
...label würde es dann (Sender As Label).caption heißen ge?

Bingo!

Sharky 29. Sep 2003 11:40

Re: Sender???
 
Zitat:

Zitat von Alex_ITA01
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

Dann brauchst Du ein eindeutiges Merkmale der Buttons. Dies wäre z.B. der Name. Dieser kann ja nur einmal vorkommen.

Delphi-Quellcode:
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;
Oder Du machst dies über die Tag Eigenschaft der Buttons.

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.

LoL 29. Sep 2003 11:40

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;

Alex_ITA01 29. Sep 2003 11:42

Re: Sender???
 
nein geht nicht habe ich schon probiert, button1 oder eben button2 undefiniert

LoL 29. Sep 2003 11:45

Re: Sender???
 
kommt natürlich darauf an wie deine buttons heisen

Alex_ITA01 29. Sep 2003 11:45

Re: Sender???
 
danke Sharky
das hilft mir echt weiter

sakura 29. Sep 2003 11:46

Re: Sender???
 
Aber so:

Delphi-Quellcode:
if sender = Button1 then
....
else
...

// oder bei mehr als 2 button

if sender = Button1 then
...
if sender = button2 then
....
...:cat:...

LoL 29. Sep 2003 11:46

Re: Sender???
 
omg sorry natürlich :wall: mein fehler

Alex_ITA01 29. Sep 2003 11:50

Re: Sender???
 
ok danke jetzt gehts,
und wenn ich das in eine procedure packen will?


Delphi-Quellcode:
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;
[edit=sakura]Delphi-TAGs gesetzt. Mfg, sakura[/edit]

Alex_ITA01 29. Sep 2003 11:56

Re: Sender???
 
was muss ich TEST übergeben damit er sender kennt?

Alex_ITA01 29. Sep 2003 12:07

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

LoL 29. Sep 2003 12:09

Re: Sender???
 
dann übergebe einfach ein object

sakura 29. Sep 2003 12:10

Re: Sender???
 
Also entweder die komplizierte:

Code:
procedure TForm1.Button2Click(Sender: TObject);
begin
  TEST[color=#ff0000](Sender)[/color];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TEST[color=#ff0000](Sender)[/color];
end;
Oder die einfache, da weißt Du einfach im Objekt Inspektor beiden Komponenten die gleiche Ereignismethode zu ;-)

...:cat:...

Sharky 29. Sep 2003 12:11

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:
procedure TForm1.Button2Click(Sender: TObject);
begin
 if Form1.OpenDialog1.Execute then
  begin
   ...
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Close;
end;
Oder Du weisst beiden Buttons die selbe OnClick Procedure zu.

Alex_ITA01 29. Sep 2003 12:12

Re: Sender???
 
danke hunzt jetzt dürfte ich es können,danke nochmal an alle die mir geholfen haben
alex

Alex_ITA01 29. Sep 2003 12:15

Re: Sender???
 
achso es sollten also die gleichen proceduren für mehrer buttons sein? klar macht ja auch mehr sinn

Alex_ITA01 29. Sep 2003 12:30

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?

Alex_ITA01 29. Sep 2003 12:33

Re: Sender???
 
sorry nehm alles zurück habs hinbekommen es geht mit der onclick sache
danke

Sharky 29. Sep 2003 12:57

Re: Sender???
 
Zitat:

Zitat von Alex_ITA01
achso es sollten also die gleichen proceduren für mehrer buttons sein? klar macht ja auch mehr sinn

Nein!

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:
Label1.Caption := 'http:/www.delphipraxis.net';
Label2.Caption := 'http:/www.sharkys-home.de';
Label3.Caption := 'http:/www.borland.com';
Jetzt möchtest Du bei einem Click auf ein Label das die entsprechende Seite im Browser geöffnet wird.

Du könntest jetzt entweder für jedes Label ein OnClick schreiben:

Delphi-Quellcode:
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;
Oder Du verwendest für alle drei Labels das gleiche OnClick:

Delphi-Quellcode:
procedure TForm1.Alle_LabelClick(Sender: TObject);
begin
 shellexecute(handle, 'open', PChar((Sender As TLabel).Caption), nil, nil, sw_show);
end;
Wie Du siehst spart man sich so einiges an Code und kann Fehler vermeiden.

Bei einem Button macht das natürlich nur Sinn wenn bei allen Buttons die Procedure aufgerufen wird.

Alex_ITA01 29. Sep 2003 13:02

Re: Sender???
 
danke jetzt glaub ich es wirklich zu verstehen, *g*

The-X 29. Sep 2003 13:02

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:
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;
Ohne die Abfragen *1 & *2 würde das Programm hängen bleiben, da ein Click auf eine der Listboxen
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