PDA

Volledige versie bekijken : Custom contextmenu items


netwel
%Europe/Berlin %562 %2005, 13:29
Hallo
Ik probeer 10 eigen items aan een contextmenu toetevoegen.
Ik heb er wat over gelezen onderandere op macromedia livedocs,
en op actionscript.org heb ik er een tutorial over gevolgd, doch ik kom er niet uit.

Om de materie te begrijpen heb ik een leegdocument aangemaakt en daarin al
het noodzakelijke Actionscript geplaatst, zodat ik niet wordt afgeleid door overige code
(ik maak dr wel eens een zooitje van...)
Nu heb ik dus een klein filmpje met een frame en enkel _root, geen mc's, niks.
Als actionscript heb ik de volgende code ingevoegd:

var my_cm = new ContextMenu();
my_cm.hideBuiltInItems();
_global.linkje = new Array();

//volgende forlus zal in een onloadeventhandler geplaatst worden van een loadvar
// aan linkje wordt dan diverse url's toegekend.

for ( i=0; i<10; i++) {
linkje[i]="Wil je menu "+i ;
menuItem[i] = new ContextMenuItem(linkje[i], linkjesHandler(i));
my_cm.customItems.push(menuItem[i]);
}
_root.menu = my_cm;

function linkjesHandler(j){
trace ("item-"+j+" = "+j);
}

Ik zou nou verwachten dat ik 10 eigen items in het contextmenu heb, en dat als ik op een daarvan klik er een trace in mijn outputpanel plaatsvind , niet dus.
Bij het testen krijg ik direct de 10 traces en mijn contextmenu laat de nieuwe items niet zien.
Ergens mis ik iets, maar wat?
groeten,

theFlashWizard
%Europe/Berlin %568 %2005, 13:38
linkje[i] dus je wilt iets toevoegen aan de array linkje?
dan moet je die array eerst aanmaken volgens mij

linkje = new Array()
boven je for lus zetten..
zelfde probleem bij menuItem.

netwel
%Europe/Berlin %577 %2005, 13:51
Bedankt, Ik heb je tip geprobeerd,
linkje stond er al:
_global.linkje = new Array();

ik heb daar direct onder dit gezet:
menuItem = new Array();
Na testen heb ik t zelfde resultaat: 10 traces in output venster, en geen customcontextmenu.

theFlashWizard
%Europe/Berlin %581 %2005, 13:57
_global.linkje = new Array();
is wat anders dan linkje he..
is het gelijk dan moet je altijd _global.linkje gebruiken of altijd gewoon linkje
en customItems was ook een array? die je ook van te voren hebt aangemaakt?

netwel
%Europe/Berlin %589 %2005, 14:08
Ja daar zeg je wat, als ik _global.linkje gebruik dien ik die overal met _global aan te roepen, daar sluipt er een fout in mijn code, dankje.

Maar voor mijn testfiletje maakt het niet uit of dat linkje global is of niet, ik heb dus voor het gemak even _global. ervoor weg gehaald. En menuItems was ik vergeten te declareren, dat heb ik nu gedaan direct voor de forlus. Nog steeds heb ik hetzelfde resultaat.

netwel
%Europe/Berlin %593 %2005, 14:14
Ha hey!
Ik heb het!
Bij het aanroepen van linkjeshandler gaf ik parameter i mee:

menuItem[i] = new ContextMenuItem(linkje[i], linkjesHandler(i));
foute boel, dit roept direct die linkjeshandler aan. terwijl als ik die i weglaat:

menuItem[i] = new ContextMenuItem(linkje[i], linkjesHandler);
Dan functioneert het naar behoren.

Nou nog even uitzoeken hoe ik linkjeshandler dan die parameter doorgeef.
FlashWizard bedankt voor de hulp.

theFlashWizard
%Europe/Berlin %603 %2005, 14:28
graag gedaan.. :)
voorderest kan ik je ben ik bang niet helpen want ik werk nooit met componenten..

damarez
%Europe/Berlin %612 %2005, 14:42
ik heb hier een goede contextmenu tutorial voor je
het maakt gebruik van de opdracht trace
maar als je het logisch benadert kan je alle mogelijke acties
z.a gotoandplay etc.....i.p.v trace zetten
zo ook meerdere contextmenu items toevoegen
ik hoop dat het lukt.p.s
je publish setting moeten op display menu zijn zijn



var my_cm:ContextMenu = new ContextMenu();
my_cm.customItems.push(new ContextMenuItem("Start", startHandler));
my_cm.customItems.push(new ContextMenuItem("Stop", stopHandler, true));
function stopHandler(obj, item) {
trace("Stopping...");
}
function startHandler(obj, item) {
trace("Starting...");
}
this.menu = my_cm;

netwel
%Europe/Berlin %648 %2005, 15:33
Is dat een tutorial?? Het is in ieder geval wel een duidelijk stukje code Damarez, bedankt. Je past het schitterend toe op je eigen flitsende site. Maar hier gebruik je per ContextMenuItem een andere eventhandler en ik geloof dat dit een statisch contextmenu is.

Ik wil één en dezelfde eventhandler gebruiken:
We hebben een phpwebkalender, de flashfilm haalt via loadvars een aantal urls daarvan op, en nu wil ik afhankelijk van die data, dus dynamisch, dat contextmenu genereren.
Daarvoor heb ik denk ik één handler nodig die parameters ontvangt en op basis van die parameter de juiste url genereert.

netwel
%Europe/Berlin %801 %2005, 19:13
Hehe. Ik ben er uit.
Ik dacht ik zal het hier maar even posten zodat anderen er eventueel gebruik van kunnen maken, of dat er misschien wel mensen zijn die een alternatieve manier hebben.
import mx.utils.Delegate; // deze regel is nodig om de delegate opdracht verderop te kunnen gebruiken
var my_cm = new ContextMenu(); //maakt nieuw contextmenuobject
my_cm.hideBuiltInItems(); // verbergt de standaard items van het flashcontextmenu
linkje = new Array();
menuitem = new Array();

for ( i=0; i<10; i++) {
linkje[i]="menu item "+i ;
menuitem[i] = new ContextMenuItem(linkje[i]); // ik maak géén gebruik van de menu-itemconstructor om de eventhandler te activeren, dat doe ik verderop met onSelect.
menuitem[i].teller= i; // menuitem[i] krijgt hier een extra propertie, teller. Je kunt nog meer properties aan een menu-item toe kennen, die zullen allemaal beschikbaar zijn in de eventhandler.
menuitem[i].onSelect=Delegate.create(menuitem[i], linkjesHandler); // pas hier word de eventhandler aan het menuitem gekoppeld
my_cm.customItems.push(menuitem[i]);
}
_root.menu = my_cm; // kent het contextmenu toe aan de root, je kunt hier ook een speciefiek mc specificieren

//eventhandler van de contextmenu
function linkjesHandler(){
trace (this.caption+" heeft als teller: "+this.teller);
}