Avatar billede bjering Nybegynder
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.
Avatar billede bvli Praktikant
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 :)
Avatar billede powerpunk Nybegynder
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>
Avatar billede powerpunk Nybegynder
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");
        }
Avatar billede bjering Nybegynder
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
Avatar billede bjering Nybegynder
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.
Avatar billede powerpunk Nybegynder
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);
Avatar billede powerpunk Nybegynder
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...
Avatar billede bjering Nybegynder
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..
Avatar billede powerpunk Nybegynder
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);
Avatar billede bjering Nybegynder
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'
Avatar billede powerpunk Nybegynder
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;
Avatar billede bjering Nybegynder
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 :)
Avatar billede powerpunk Nybegynder
29. januar 2008 - 15:43 #13
Godt set! den er lidt simplere...

Svar!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester