29. januar 2008 - 14:30
Der er
12 kommentarer og 1 løsning
String til void (EventHandler)
Hej eksperter. Har lige sat og rodet rundt med at lave en string til typen void til brug i mit spil. Grunden er jeg loader knapper ind, og de skal have en onclick event. prøvede string test = "TestEvent"; Type t = typeof(void); EventHandler testevent1 = (EventHandler)(Convert.ChangeType(test, t) as EventHandler); gav error. EventHandler testevent = (EventHandler)(Convert.ChangeType(test, TypeCode.Object) as EventHandler); -- Min testevent private void TestEvent(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("Test Event"); } -- gav ingen fejl, men virker ikke når man klikker. Er der ingen måde at lave så man kan bruge en string som eventhandler target ? Takker.
Annonceindlæg fra Cognizant
29. januar 2008 - 14:38
#1
Hej.. Mon ikke du kunne omformulere spørgsmålet? Jeg forstår det simpelthen ikk'. Grunden til at dit sidste eksempel ikke virker, er fordi testevent er null. /B :)
29. januar 2008 - 14:40
#2
Det er klart... Convert.Changetype er kun valid, hvis typen rent faktisk kan konverteres... Du skal lave din egen EventArgs klasse f.eks public class MyEventArgs : EventArgs { private string _eventString; public string EventString { get {return _eventString;} } public MyEventArgs(string eventString) { _eventString = eventString; } } Og så erklære din testevent som EventHandler<MyEventArgs>
29. januar 2008 - 14:44
#3
Altså: eventen declares: public event EventHandler<MyEventArgs> testevent1; bindes op testevent1 += new EventHandler<MyEventArgs>(TestEvent); og lander i: private void TestEvent(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("Test Event"); }
29. januar 2008 - 14:45
#4
okay, omformulering. :) Jeg loader knap data ind i mit spil fra en XML fil. hver knap får så : string onclick = "ThisButtonOnClick"; string onMouseOver = "ThisButtonOnMouseOver"; osv. Jeg skal så kunne, f.eks når jeg klikker på knappen, køre den event der tilhører knappen. dvs, min ThisButtonOnClick skal køre eventen private void ThisButtonOnClick(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("Test Event"); } som et eksempel, lav en form, tilføj 1 knap, lav så : knap.click += new EventHandler(onclick); virker self ikke, fordi onclick = en string og ikke en void dvs onclick skal laves om til en void og så bruges knap.click += new EventHandler(convertet_onclick_ting); ved ikke om det forklarer det
29. januar 2008 - 14:48
#5
powerpunk den bruger også direkte info til hvilken void den skal køre den skal bruge string some referance til voiden.
29. januar 2008 - 14:50
#6
Joo... men det virker ikke helt som om du har forstået hvad det er du laver... i følgende knap.click += new EventHandler(onclick); er 'onclick' en delegate, altså den funktion du vil have til at håndtere eventet. Hvis du har en handler som ser sådan her ud : private void ThisButtonOnClick(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show("Test Event"); } skal der stå knap.click += new EventHandler(ThisButtonOnClick);
29. januar 2008 - 14:52
#7
Du kan ikke konvertere en streng til en delegate medmindre du vil ud i et eller andet snavs med reflection...
29. januar 2008 - 14:57
#8
god dammit.. det er træls, nå, så må jeg ud og omskrive mit UI system igen... :( så skal jeg til at lave en function for hver knap jeg loader ind via XML Knap test = new Knap(); if(knap.Type("Test")) test.click += new MouseEventHandler(gameScreen.TestOnClick); if(knap.Type("Test 1")) test.click += new MouseEventHandler(gameScreen.Test1OnClick); AddKnap(knap); der er nok noget med 100 vis af knapper, ville være rart hvis man bare kunne lave min onclick baseret på en string i min xml fil..
29. januar 2008 - 15:02
#9
Med reflection kunne du faktisk gøre noget i denne retning: string onclick = "ThisButtonOnClick"; string onMouseOver = "ThisButtonOnMouseOver"; Type myType = this.GetType(); MethodInfo clickMethod = myType.GetMethod(onclick); MethodInfo mouseOverMethod = myType.GetMethod(onMouseOver); Delegate clickDelegate = Delegate.CreateDelegate(typeof(EventHandler), clickMethod); Delegate mouseOverDelegate = Delegate.CreateDelegate(typeof(EventHandler), mouseOverMethod); knap.Click += new EventHandler(clickDelegate); knap.MouseHover += new EventHandler(mouseOverDelegate);
29. januar 2008 - 15:16
#10
okay, det ser da ikke helt tosset ud, men får en fejl 'clickDelegate' is a 'variable' but is used like a 'method'
29. januar 2008 - 15:31
#11
heh... det er ikke sådan når man bare skyder fra hoften... prøv: EventHandler clickDelegate = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), clickMethod); EventHandler mouseOverDelegate = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), mouseOverMethod); knap.Click += clickDelegate; knap.MouseHover += mouseOverDelegate;
29. januar 2008 - 15:34
#12
bruger EventHandler e = (EventHandler)Delegate.CreateDelegate(typeof(EventHandler), this, onclick, false); men alt godt, tak for det, smid et svar :)
29. januar 2008 - 15:43
#13
Godt set! den er lidt simplere... Svar!
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.