Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Welche Komponente führt die Metode aus? (https://www.delphipraxis.net/112921-welche-komponente-fuehrt-die-metode-aus.html)

napsterxx 29. Apr 2008 17:00


Welche Komponente führt die Metode aus?
 
Nehmen wir an ich habe 10 Komponenten des Typs TButton.
Alles dieser Komponenten haben die selbe OnClick Methode: ButtonClick
Das heißt egal auf welchen Button gedrückt wird, es geschiet das gleiche.

Nun möchte ich in der Metode des Button klicks abfragen welcher Button denn diese Metode ausgeführt hat und dies dann anzeigen.

Die Muhkuh 29. Apr 2008 17:01

Re: Welcher Komponente führt die Metode aus?
 
Die OnClick-Methode bietet Dir einen Parameter namens "Sender", dort kann Du überprüfen, auf welchen Button geklickt wurde.

Fussball-Robby 29. Apr 2008 17:01

Re: Welche Komponente führt die Metode aus?
 
Schau dir mal den Parameter Sender an.

napsterxx 29. Apr 2008 17:12

Re: Welche Komponente führt die Metode aus?
 
Ja habe ich bereits, aber ich werde daraus nicht schlau. Entschuldigung

Die Muhkuh 29. Apr 2008 17:14

Re: Welche Komponente führt die Metode aus?
 
Wo hapert es denn?

Du kannst per

Delphi-Quellcode:
(Sender as TButton).Name
an den Namen des Buttons dran kommen.

napsterxx 29. Apr 2008 17:18

Re: Welche Komponente führt die Metode aus?
 
Geht das denn auch mit Arrays? Ich habe ein Array von TJvThreads, jedoch wenn ich mit ShowMessage und dann dem Code von eben arbeiten möchte funktioniert das nicht. Ungültige Typenumwandlung

mkinzler 29. Apr 2008 17:24

Re: Welche Komponente führt die Metode aus?
 
Zeig mal den Code

napsterxx 29. Apr 2008 17:41

Re: Welche Komponente führt die Metode aus?
 
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  LI: TListItem;
begin                
  Inc(Index, 1);
  SetLength(Views, Index+1);
  SetLength(Threads, Index+1);

  { Neue ListView erstellen }
  Views[Index] := TJvListView.Create( self);
  Views[Index].Parent := panel1;

  Threads[Index] := TJvThread.Create(Form2);
  Threads[Index].OnExecute := ThreadsExecute;
  Threads[Index].Tag := Index;

  { Eigenschaften der neuen Listview zuweisen }
  with Views[Index] do
  begin
    Columns := JvListView1.Columns;
    ViewStyle := vsReport;
    Width := JvListView1.Width;
    Height := JvListView1.Height;
    Top := JvListView1.Top;
    Left := JvListView1.Left;
  end;
  Threads[Index].ThreadDialog := nil;
  Threads[Index].Execute(self);

  Tabs.AddTab(Edit1.Text);
  Tabs.SelectedTab := Tabs.Tabs.Items[Index];
end;

procedure TForm2.ThreadsExecute(Sender: TObject; Params: Pointer);
var
  I: Integer;
begin
  ShowMessage((Sender as TJvThread).Name);
end;

mkinzler 29. Apr 2008 17:49

Re: Welche Komponente führt die Metode aus?
 
Lass dir mal Anzeigem von Welchem Typ Sender ist.

napsterxx 29. Apr 2008 18:01

Re: Welche Komponente führt die Metode aus?
 
Und wie :D

mkinzler 29. Apr 2008 18:03

Re: Welche Komponente führt die Metode aus?
 
Sender.Classname

Fussball-Robby 29. Apr 2008 18:17

Re: Welche Komponente führt die Metode aus?
 
Delphi-Quellcode:
procedure TForm2.ThreadsExecute(Sender: TObject; Params: Pointer);
begin
  if Sender is TJvThread then
    ShowMessage((Sender as TJvThread).Name);
end;

//Oder Sender als TJvThread definieren

procedure TForm2.ThreadsExecute(Sender: TJvThread; Params: Pointer);
begin
    ShowMessage(Sender.Name);
end;
Das 2. kannst du natürlich nur benutzen, wenn die Sender ausschließlich TJvThreads sind.

Mfg

napsterxx 29. Apr 2008 18:26

Re: Welche Komponente führt die Metode aus?
 
Ja sind sie aber funkt einfach nicht

DeddyH 29. Apr 2008 18:32

Re: Welche Komponente führt die Metode aus?
 
Die Methodenparameter dürften wohl vorgegeben sein, also nimm besser die erste Variante.

napsterxx 29. Apr 2008 18:40

Re: Welche Komponente führt die Metode aus?
 
Delphi-Quellcode:
procedure TForm2.JvThread1Execute(Sender: TObject; Params: Pointer);
begin
  if Sender is TJvThread then
    ShowMessage((Sender as TJvThread).Name);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  JvThread1.ThreadDialog := nil;
  JvThread1.Execute(self);
end;
Selbst das geht nicht

mkinzler 29. Apr 2008 18:42

Re: Welche Komponente führt die Metode aus?
 
Und welche Klasse gehört Sender nun an?

napsterxx 29. Apr 2008 18:57

Re: Welche Komponente führt die Metode aus?
 
Ich habe keine Ahnung. Es muss ja eigentlich TJvThread sein. Also ich klicke auf einen Button, danach wird JvThread1.Execute;

Und das wars ...

mkinzler 29. Apr 2008 19:03

Re: Welche Komponente führt die Metode aus?
 
Dann lass es dir doch anzeigen :zwinker:

napsterxx 29. Apr 2008 19:11

Re: Welche Komponente führt die Metode aus?
 
Zuerst musste mir verraten wie ;)
SHowMessage( Sender.ClassType.ClassName );

so habe ichs gemacht = Leere MSG Box

// So jetzt habe ichs TJvBaseThread
aber dann geht das nicht:

ShowMessage(( Sender as TJvBaseThread ).Name );

mkinzler 29. Apr 2008 19:14

Re: Welche Komponente führt die Metode aus?
 
Delphi-Quellcode:
ShowMessage( Sender.ClassName );
Ich nehme an das TJvThread von TJvBaseThread abstammt, dann dürfte es eigentlich keine Typenunverträglichkeit geben

Kennt die Klasse, die gewünschten Eigenschaften?

napsterxx 29. Apr 2008 19:15

Re: Welche Komponente führt die Metode aus?
 
Hatte es schon :D

Name kennt es nicht

//EDIT

hätte nicht gedacht das das soo kompliziert wird

napsterxx 30. Apr 2008 12:57

Re: Welche Komponente führt die Metode aus?
 
*mini push* :D

mkinzler 30. Apr 2008 13:25

Re: Welche Komponente führt die Metode aus?
 
Meinst du .Name? Und welche klasse?

napsterxx 30. Apr 2008 19:03

Re: Welche Komponente führt die Metode aus?
 
bei TJvBaseThread gibts kein name

mkinzler 30. Apr 2008 19:07

Re: Welche Komponente führt die Metode aus?
 
Wie sieht das Vererbungsschema aus?

napsterxx 30. Apr 2008 20:16

Re: Welche Komponente führt die Metode aus?
 
was meinst du damit?

mkinzler 30. Apr 2008 20:24

Re: Welche Komponente führt die Metode aus?
 
Von welcher Klasse stammt diese Klasse ab?

Die Muhkuh 30. Apr 2008 20:26

Re: Welche Komponente führt die Metode aus?
 
Bei einem Button wäre es z.B.

Delphi-Quellcode:
TButton -> TButtonControl -> TWinControl -> TControl -> TComponent -> TPersistent -> TObject
-> bedeutet: Erbt von

napsterxx 1. Mai 2008 09:00

Re: Welche Komponente führt die Metode aus?
 
Ja hier stammt TJvThread stammt von TJvBaseThread

napsterxx 4. Mai 2008 11:01

Re: Welche Komponente führt die Metode aus?
 
Das problem besteht nach wie vor :D

himitsu 4. Mai 2008 11:19

Re: Welche Komponente führt die Metode aus?
 
Kennt TJvBaseThread .Name nicht (ist also erst in TJvThread definiert), oder ist .Name in TJvBaseThread nur nicht sichtbar (in TJvBaseThread nicht als public/published definiert)?

Wenn es zwar definiert, aber nicht sichtbar ist, dann belaß es doch bei
(Sender as TJvThread).Name oder TJvThread(Sender).Name .

napsterxx 4. Mai 2008 11:37

Re: Welche Komponente führt die Metode aus?
 
ich weis es nicht, jedoch kann ich nicht TJvBaseTHread.Name schreieben ohne eine Fehlermeldung zu bekommen

mkinzler 4. Mai 2008 11:49

Re: Welche Komponente führt die Metode aus?
 
Man kann auch mit einem Fahrrad nicht Fliegen.
Delphi-Quellcode:
(Sender as TJvThread).Name

napsterxx 4. Mai 2008 12:15

Re: Welche Komponente führt die Metode aus?
 
Das geht doch nicht, das haben wir doch schon durchgekaut

TJvThread > TJvBaseThread > TThread > TObject

himitsu 4. Mai 2008 12:54

Re: Welche Komponente führt die Metode aus?
 
wie/wo ist den nun .Name definiert?

( in TThread existiert es noch nicht und die Jedis hab ich hier nicht installiert. :oops: )

mkinzler 4. Mai 2008 12:56

Re: Welche Komponente führt die Metode aus?
 
Zitat:

Zitat von napsterxx
Das geht doch nicht, das haben wir doch schon durchgekaut

TJvThread > TJvBaseThread > TThread > TObject

Wenn es so wäre würde es ja funktionieren. Versuch mal einen harten Cast:
Delphi-Quellcode:
TJvThread( Sender).Name;

napsterxx 4. Mai 2008 13:00

Re: Welche Komponente führt die Metode aus?
 
Zitat:

TJvThread( Sender).Name
Resulttiert in einer Zugriffsverletzung

mkinzler 4. Mai 2008 13:06

Re: Welche Komponente führt die Metode aus?
 
Diese Komponenten liegen auch nicht in der selben Veerbungshierarchie:
Delphi-Quellcode:
TJvThread = class(TJvComponent)

napsterxx 4. Mai 2008 13:13

Re: Welche Komponente führt die Metode aus?
 
OK habe es anders, mit einer Komponente aber merheren Threads gelöst, aber mich würde es trotzdem interessieren wieso es nciht geht

mkinzler 4. Mai 2008 13:18

Re: Welche Komponente führt die Metode aus?
 
Weil wie man sieht, ein TJvThread kein TJvBaseThread ist.
Es sieht eher aus, als ob ein Thread mehrer BaseThreads in einer Threadliste beinhalten kann.
Wäre FSender nicht privat, könnte man so vielleicht auf den Thread schließen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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