Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.05.2008, 18:16

Irrlicht Gui Frage...

Hallo!
Ich habe ein Menü mithilfe des GUIEditor der Irrlicht Engine erstellt und erfolgreich anzeigen können. Auf Buttonklicks kann ich reagieren. Doch nun möchte ich Items einer ComboBox hinzufügen
Wie bekomme ich ein Element anhand der ID in form von IGUIElement* ?

ich habe schon das probiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
bool Input(SEvent event)
            {
                if (event.EventType == EET_GUI_EVENT)   
                {       
                    s32 id = event.GUIEvent.Caller->getID();    
                    IGUIEnvironment* env = device->getGUIEnvironment();
                    

                    switch(event.GUIEvent.EventType)
                    {
                        case EGET_BUTTON_CLICKED:
                            if(id==101) //Neues Spiel

                            {
                                GuiMgr->loadGUI("Neues Spiel.xml");
                            }
                            if(id==102) //Spiel laden

                            {
                            }
                            if(id==103) //Eigenschaften

                            {
                                GuiMgr->loadGUI("Eingenschaften.xml");      //Eigenschaftsfenster anzeigen


                                IGUIElement* element=event.GUIEvent.Caller->getElementFromId(302);
                                IGUIComboBox* combo=(IGUIComboBox*)element;
                                combo->addItem(L"800x600");
                                combo->addItem(L"1024x768");
                                combo->addItem(L"1280x1024");
                                combo->addItem(L"1400x900");
                            }
                            if (id == 104){     //Beenden

                                device->closeDevice();
                            }

    break;
    };
}
return false;
}


Aber leider funktioniert das nicht. Das Programm stürzt einfach ab!

Gruß Flo

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

11.05.2008, 19:17

haste ma debugger durchgerasselt wos genau bumst?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

11.05.2008, 19:25

Irrlich hat bestimmt auch eine Log. Da mal einen Blick riskieren und dann mit dem Debugger schauen..

4

11.05.2008, 19:40

Also hier:
event.GUIEvent.Caller->getElementFromId(302);
gibt er immer 0 zurück.
Also findet nichts...
hmm...
Die ID stimmt aber 100%ig.

Der Debugger sagt zugriffsverletzung bei "combo->addItem(L"800x600");
"

ISt das denn die richtige funktion?

Gruß Flo

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

5

11.05.2008, 19:51

hmm. ich meine ich hab das mit dem element finden immer vom root object aus gemacht.
also:

C-/C++-Quelltext

1
guiEnv->getRootGUIElement()->getElementFromId(302);


dafür müsstest du aber natürlich den guiEnvironment-Pointer haben...
kannst natürlich auch mal probieren den parameter "searchchildren" von getElementFromId auf true zu setzten... es liegt auf jeden fall an dem nicht gefundenen element. dass er dann bei "addItem()" abstürzt ist klar...
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

11.05.2008, 19:54

die zugriffsverletzung ist auf den rückgabewert 0 zurückzuführen.

wenn die ID stimmt, müsste es ja die funktion sein.

was sagt denn

C-/C++-Quelltext

1
 event.GUIEvent.Caller->getID()

?

wenn das auch 0 ist, dann stimmt irgendwas doch nicht mit deiner ID.

7

11.05.2008, 20:07

"event.GUIEvent.Caller->getID() " sagt 103 was der knopf zum öffnen der Eigenschaften ist.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

11.05.2008, 20:30

okay, ich halt mich doch raus, zuwenig ahnung von irrlicht sry :(

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

11.05.2008, 22:06

Wenn der Caller ein Button ist und die Box kein Child von dem Button kann "event.GUIEvent.Caller->getElementFromId(302);" nichts gescheites geben. Korrekt dürfte die von tnecniv vorgeschlagene Lösung sein.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

10

11.05.2008, 22:29

Juhu es klappt.
Hier nochmal der Code für andere die das selbe problem haben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
if(id==103) //Eigenschaften

                            {
                                GuiMgr->loadGUI("Eingenschaften.xml");      //Eigenschaftsfenster anzeigen


                                IGUIComboBox* b=0;
                                b=(IGUIComboBox*)GuiMgr->getRootGUIElement()->getElementFromId(302,true); 

                                if(b!=0)
                                    b->addItem(L"1280x1024");
                                else
                                    GuiMgr->addMessageBox(L"Error!",L"Element nicht gefunden!");
                            }


Vielen Dank

Gruß flo

Werbeanzeige