PDA

Volledige versie bekijken : Private function in class wordt niet aangeroepen


Laiverd
%Europe/Berlin %633 %2006, 15:12
Ik zie het even niet. In een class heb ik de volgende functie
public function showPanel (panel : String, mc : MovieClip)
{
/*trace ("panel > " + panel);
trace("mc > " + mc);
trace("typeof mc = " + typeof mc);
*/
mc.attachMovie (panel, panel, 0);
// switch the panel name and take according action
switch (panel)
{
case "fleetmanagement_panel_mc" :
_initFleetManagement ();
break;
case "fleetdisplay_panel_mc" :
_initFleetDisplay ();
break;
case "preferences_mc" :
_initPreferences ();
break;
case "addboats_panel_mc" :
_initAddBoats ();
break;
case "addpeople_panel_mc" :
_initAddPeople ();
break;
case "buildfleet_panel_mc" :
_initBuildFleet ();
break;
default :
trace ("No such panel (" + panel + "): nothing to initialise");
}
}
In het switch statement worden private functies aangeroepen, maar dat is een no go; ze worden niet uitgevoerd. Voorbeeld van een van de functies:
private function _initFleetManagement ()
{
trace ("function _initFleetManagement called");
}Note dat:
- als ik een trace() doe binnen een case, dit gewoon werkt
- het niet anders is als de functie public is

Tnx voor de input.

John

Emveedee
%Europe/Berlin %649 %2006, 15:35
Ik zie niets hierin wat fout is..
Probeer anders eens flash te herstarten?

Folkert
%Europe/Berlin %673 %2006, 16:10
[hoogstwaarschijnlijke onzin]
die switch zou je mooist een frame later uitvoeren, ervan uitgaande dat die private methods van de attached Panel zijn
[/hoogstwaarschijnlijke onzin]

Staan die private en publics allemaal in dezelfde class ? dan ou het moeten werken, wellicht even proberen this te tracen in je switch.

snelle test geeft aan dat het gewoon werkt;
snelle test is gedaan met onderstaande code

class TestSwitch
{

public function showPanel (panel : String, mc : MovieClip)
{
//mc attachMovie aan of uit maakt niet uit
mc.attachMovie (panel, panel, 0);
// switch the panel name and take according action
switch (panel)
{
case "fleetmanagement_panel_mc" :
_initFleetManagement ();
break;
default :
trace ("No such panel (" + panel + "): nothing to initialise");
}
}
private function _initFleetManagement ()
{
trace ("function _initFleetManagement called");
}
}

in flash
var test = new TestSwitch();
test.showPanel( "fleetmanagement_panel_mc", this );

uitslag van test in het output venster
function _initFleetManagement called

wellicht ligt je probleem niet exact daar waar je denkt ?

succes

Laiverd
%Europe/Berlin %724 %2006, 17:23
Okay ik denk dat ik weet waar het probleem ligt, weet alleen niet hoe het op te lossen. Ik heb een class BoatBoard; in de constructor daarvan wordt ook een instance aangemaakt van de class TabController. In TabController zit een functie waarme ik de onRelease van de verschillende knoppen van functies voorzie: ik voorzie iedere knop dus van een een call op showPanel(); een method van de BoatBoard class. Die functie wordt dus ook gewoon aangeroepen. Binnen de BoatBoard class wordt dan via showPanel() een van de andere private functies van BoatBoard aangeroepen, bv. _initFleetManagement().

Even wat as:
// Method van TabController om onRelease acties aan button te hangen: werkt goed
private function addMainAction (buttonObj : Object) : Void
{
// make reference to the current instance of the TabController
var instance = this;
// define the button and properties
var btn = buttonObj.clip;
btn.id = buttonObj.id;
btn.func = buttonObj.func;
btn.param = buttonObj.param;
btn.active = buttonObj.active;
btn.onRelease = function ()
{
this.func (this.param [0] , this.param [1]);
instance.highLight (this);
instance.removeSubMenu () // if there's a submenu, show it
if (buttonObj.sub)
{
instance.showSubMenu (instance.findMainIndex (this.id));
}
}
}
Na het maken van een instance van de BoatBoard class maak ik acties voor buttons aan met
planning.tabNav.addMainButton ("fleetmanagement", tabpanel_mc.tab_fleetmanagement_mc, planning.showPanel, ["fleetmanagement_panel_mc", panel_mc]);Voor de duidelijkheid: addMainButton() bevindt zich in TabController. showPanel() is een method van BoatBoard
De functie addMainButton() in de TabController class
public function addMainButton (id : String, clip : MovieClip, func : Function, param : Array) : Void
{
var tmp = new Object ();
tmp.active = false;
tmp.id = id;
tmp.clip = clip;
tmp.func = func;
tmp.param = param;
_mainTabs.push (tmp);
//return(_mainTabs[_mainTabs.length-1]);
}
Nadat alle buttons zijn aangemaakt worden ze 'geactiveerd' met
planning.tabNav.activateButtons ();
Ik hoop dat iemand het nog volgt ;)

Ik heb binnen de switch een trace(this) gedaan en dan krijg ik een verwijzing naar de button instance waarop is geklikt.

Overigens: het voorbeeld van Folkert werkt gewoon. Het zit 'm ergens in de relatie tussen de classes denk ik, maar hoe precies ... no clue ;(

Als iemand zich hier nog eens in zou willen verdiepen, zou ik dat erg op prijs stellen.

John

straaljagertje
%Europe/Berlin %787 %2006, 18:54
Kan je dan misschien een fla neerzetten aub?

Laiverd
%Europe/Berlin %794 %2006, 19:04
Misschien kan ik beter even een simpel voorbeeld maken. Bij deze (http://home.hccnet.nl/john.mulder/flash/temp/scope.zip)

Alvast dank.
John

Dauntless
%Europe/Berlin %804 %2006, 19:18
Het is vrij vreemd, maar de functie showPanel wordt uitgevoerd in de scope van de MovieClip die wordt aangeklikt...

Ik zie niet meteen een oplossing, maar eerlijk gezegd vind ik dat je files vrij vaag in elkaar zitten... Waarom probeer je al die dingen te regelen vanuit de fla ? Het zou logischer zijn als de button een event dispatched (bv onButtonPress) en dat die dan wordt opgevangen door BoatBoard of zo en dat BoatBoard dan beslist welke actie er ondernomen moet worden... Het probleem is nu denk ik dat je planning.showPanel doorgeeft, wat een functie is. Die functie verliest zijn context dan aangezien je de functie doorgeeft, niet de verwijzing naar de specifieke functie zelf (planning.showPanel)... Best vaag dus :D.

Laiverd
%Europe/Berlin %809 %2006, 19:25
He Dauntless, bedankt voor je reactie. Ik heb even een uitgeklede versie (http://home.hccnet.nl/john.mulder/flash/temp/scope.zip) gemaakt van dit probleem. Zou je in deze uitgeklede versie (http://home.hccnet.nl/john.mulder/flash/temp/scope.zip) eens willen aangeven hoe het beter zou kunnen? Of iemand anders: een oplossing? Het probleem zit 'm inderdaad denk ik in de scope en met nauwelijks ervaring met event dispatching gaat dit even wat tricky worden. Als iemand me op de goede weg kan zetten?!

Tnx,
John

Dauntless
%Europe/Berlin %813 %2006, 19:31
Ik zal ze even aanpassen voor je :). (Maar er is natuurlijk geen perfecte manier)

Laiverd
%Europe/Berlin %815 %2006, 19:34
Dat snap ik, maar als ik het basisprincipe van events dispatchen snap dan kom ik denk ik wel weer verder. Zat al even in de handleiding te spitten, maar daar wordt tot nu steeds verwezen naar components.

Mijn dank is bij voorbaat al groot ;)

John

Dauntless
%Europe/Berlin %821 %2006, 19:42
Hier you go :). Ik heb hier en daar wat comments gezet.

Tip: Classes hebben een bepaald doel (/werking). Het handige is juist dat je een functie kan oproepen en het gewenste resultaat krijgt, zonder dat je weet hoe het intern allemaal gebeurt. In je eerste (de grote) files ga je er vanuit dat je dus heel die werking weet, terwijl je dat dus eigenlijk niet zou mogen doen... Ik bedoel dus: Je gebruikt ' tabpanel_mc.submenu_mc en planning.showPanel' terwijl je dat juist eigenlijk niet zou mogen weten/gebruiken...

Ok, de tip is vrij slecht uitgelegd, maar 't is een vrij moeilijk onderwerp :p. Probeer gewoon dingen die bij elkaar horen, bij elkaar te houden en laat de communicatie tussen verschillende classes duidelijk zijn. Nu heb je functies die je doorstuurt naar andere classes en zo, terwijl dat helemaal niet nodig is.

Ohja, voor je files, de nl.dpdk.utils.BroadCaster class vind je hier:
http://www.flashfocus.nl/forum/showthread.php?t=12341&highlight=eventbroadcaster

Laiverd
%Europe/Berlin %831 %2006, 19:57
Many thanks,

Ik ga er eens goed naar kijken.

John