AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [C#] Neuer Delegat und falscher Parameter?
Thema durchsuchen
Ansicht
Themen-Optionen

[C#] Neuer Delegat und falscher Parameter?

Ein Thema von Phoenix · begonnen am 2. Apr 2007 · letzter Beitrag vom 2. Apr 2007
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#1

[C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 09:09
Hi,

folgende Aufgabenstellung:

Pseudocode:
Code:
foreach MyObject Element in Liste
{
   Erstelle neuen Menüeintrag mit Element.Name;
   Neuer Menüeintrag.OnClick = new Eventhandler(
     delegate(object sender, EventArgs e)
     {
       MessageBox.Show(Element.Id);
     }     
   );
}
Problem:

Alle Menüeinträge zeigen zwar eine Messagebox, aber in der steht immer die Id des letzten durchlaufenen Elements und nicht die Id des Elements, das eigentlich angezeigt werden sollte.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 10:08
Zitat von Phoenix:
Problem:

Alle Menüeinträge zeigen zwar eine Messagebox, aber in der steht immer die Id des letzten durchlaufenen Elements und nicht die Id des Elements, das eigentlich angezeigt werden sollte.
Hi,
wie weit ist denn überhaupt sichergestellt, dass die Liste korrekt gefüllt wurde? Hast Du das mit einem Debugger geprüft?
Ich meine wenn die immer die ID des Vorgängers zeigen, was ist mit der ersten Message? Keine ID oder eine Falsche/Unerwartete?

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#3

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 10:13
Ja, die Liste ist korrekt gefüllt.

Beim debuggen wird für die einzelnen Elemente auch die korrekte Id und der korrekte Text für den Menüeintrag angezeigt.

Ich tippe einfach mal darauf, dass der delegat den ich Erzeuge eine Referenz auf MyObject erhält - und die dann beim weiteren durchlaufen eben diese ausgetauscht wird. Nur wenn dem so ist, dann dürfte das ja auch mit jedem anderen Objekt passieren. Wie bekomme ich nun einen String in die anonyme Methode rein, der dann statisch bleibt?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 10:41
Zitat von Phoenix:
Code:
     delegate(object sender, EventArgs e)
     {
       MessageBox.Show(Element.Id);
     }     
   );
}
Ahso, jetzt sehe ich erst was Du eigentlich meintest (dachte Du meinst es zeigt immer die ID des Vorgängers in der Liste), ja, ich und das Lesen, wird noch

Mal ganz einfach gesagt, wie würdest Du das denn in Delphi lösen? Du würdest doch auch nicht in einer OnClick-Methode (annonym oder nicht) auf eine Variable zurückgreifen, sondern den Sender auswerten, hier musst Du nichts anderes tun!

Code:
     delegate(object sender, EventArgs e)
     {
       MessageBox.Show(((MyObject)sender).Id);
     }     
   );
}
Bei den äußeren Klammern des Castings bin ich mir nicht sicher ob Du sie brauchst oder ob es dann schon die Eigenschaft ID gibt.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#5

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 10:47
Der Sender ist das Toolbar-Item, und das hat nirgendwo die Id des Elements in der Liste.

Ich will aus Performancegründen vermeiden, dass ich bei jedem OnClick erstmal den Namen des Elementes vom Sender auslesen muss, in der Datenbank nach der passenden Id suche und dann weitermache. Und die Id kann ich auch nicht auf das Toolbaritem setzen, weil das Interface welches mir das Item letzlich erzeugt sowas nicht vorsieht und das auch nicht ohne weiteres geändert werden kann. Zudem kann der Name zweideutig sein - und dann hab ich ein massives Problem das richtige Element zu finden.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 11:17
Zitat von Phoenix:
Der Sender ist das Toolbar-Item, und das hat nirgendwo die Id des Elements in der Liste.
Stimmt, sorry, gar nicht bedacht.

Zitat von Phoenix:
Ich will aus Performancegründen vermeiden, dass ich bei jedem OnClick erstmal den Namen des Elementes vom Sender auslesen muss, in der Datenbank nach der passenden Id suche und dann weitermache. ... Zudem kann der Name zweideutig sein - und dann hab ich ein massives Problem das richtige Element zu finden.
Der Weg der mir noch einfällt ist vielleicht nicht der perfomanteste, aber zumindest, entfällt die Doppeldeutigkeit. So erzeugst Du ja bereits in der Schleife die Objekte, die Du auf der Toolbar platzierst. Meine letzte Idee wäre hier, dass Du eine Verknüpfung zwischen abgespeicherter ID und diesem erzeugten Objekt erstellst und in einem anderen Objekt speicherst. Dazu würde ich entweder auf den Index des jeweiligen Elements (dass Du ja gerade erzeugt hast) zugreifen (soweit das möglich ist) und z.B. in einem Array oder (wenn .net das unterstützt) in einer ArrayList ablegen. Hier kannst Du dann mit sehr geringem Aufwand (konstant) gezielt die ID zu einem Element abfragen.
Ist das mit dem Array nicht möglich (z.B. weil sich die Positionen ändern können), dann kannst Du alternativ auch auf die Hash-Funktion des Objekts zurückgreifen. Was auch immer angeklickt wird, lässt sich (afaik) über das Eventarg ermitteln. Dieses Objekt hat einen Hash und es gibt bestimmt auch eine HashMap. Auch damit hast Du eine eindeutige Zuordnung, die nicht über den Namen sondern über das ausgewählte Objekt läuft und mit einer ID fest verknüpft werden kann (Änderungen bleiben natürlich auch möglich).
  Mit Zitat antworten Zitat
LarsMiddendorf

Registriert seit: 4. Sep 2003
Ort: Hemer
104 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 11:34
So müsste es funktionieren. Dann wird für jeden Schleifendurchlauf eine neue id erstellt. Bei den anonymen Methoden ist wichtig wo die Variable deklariert wurde.

Code:
foreach MyObject Element in Liste

   Erstelle neuen Menüeintrag mit Element.Name;
   int id=Element.Id;
   Neuer Menüeintrag.OnClick = new Eventhandler( 
     delegate(object sender, EventArgs e)
     { 
       MessageBox.Show(id);
     }     
   );
}
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#8

Re: [C#] Neuer Delegat und falscher Parameter?

  Alt 2. Apr 2007, 11:43
Meine Id ist zwar ein String, aber wenn ich das so mache und vorher einen neuen String deklariere passt das.

Okay, ich sollte mir die Sache mit dem Scope bei anonymen Methoden nochmal genauer angucken. Danke
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  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 19:43 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