Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вызов функции из другого класса (http://www.flasher.ru/forum/showthread.php?t=164637)

kaploson 17.08.2011 21:06

Вызов функции из другого класса
 
Здравствуйте, не получается вызывать метод из другого класса.

Есть основной класс Main. В нем есть функция create. И есть второй класс. В котором используется в TextField выводится информация из БД с помощью htmlText.Выводятся, например такие переменные как date,name.. Переменная name выдает имя юзера из БД. Мне нужно, чтобы при нажатии на имя выполнилась функция из класса Main.

Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import flash.text.TextFormat;
        import flash.display.Bitmap;
        import flash.events.MouseEvent;
        import flash.display.*;
        import flash.events.*;
        import flash.display.MovieClip;
        import flash.utils.*;
        import Main;
 
        public class mean extends Sprite
        {
                private var _info:XML;
 
                private var _text:TextField;
                private var _textFormat:TextFormat = new TextFormat("AGOpus", 15, 0xFFFFFF);
 
 
                public function mean(info:XML)
                {
                        func();
 
                }
 
private function func():void
                {
                        var instance:Main = new Main();
                        _text = new TextField();
                        _text.multiline = true;
                        _text.wordWrap = true;
                        _text.htmlText = _info..name.text()+ "\n" +_info..date.text();
                        _info..name.text().addEventListener(MouseEvent.CLICK, instance.create);
 
 
                }

и главный класс Main :
Код AS3:

 public function Main():void
                {
 
 
                        if (stage) init();
                else addEventListener(Event.ADDED_TO_STAGE, init);
 
 
                }
 
        function create(e:Event)
                {
 
            // создание запроса
            var stat_loader:URLLoader = new URLLoader();
            var stat_request:URLRequest=new URLRequest("http://site.ru/create.php");// заменяем на ссылку к вашему скрипту
            stat_request.method=URLRequestMethod.POST;
            // добавление параметров в запрос
            var stat_vars:URLVariables = new URLVariables();
              stat_vars['search'] =  _info..name.text() as mean;
        stat_request.data=stat_vars;
        // выполнение запроса
        stat_loader.addEventListener(Event.COMPLETE,create_complete);
        stat_loader.load(stat_request);               
                }

Думаю, что неправильны строчки,наверное в них я написал чушь :
Код AS3:

 _info..name.text().addEventListener(MouseEvent.CLICK, instance.create);
stat_vars['search'] =  _info..name.text() as mean;

Помогите пожалуйста, очень надо..

goodguy 17.08.2011 21:12

Где модификатор доступа функции create?
она должна быть public

И вообще логика, мягко говоря, странная. Какой-то сторонний класс, создает в себе экземпляр главного?

п.с. Так же хоть, конструктор и не возвращает никаких данных, его принято делать не типизированным, а вот функция create, напротив должна быть void. Хоть в данном случае это и не принципиально, не нужно заводить себе сразу плохие привычки

kaploson 17.08.2011 21:49

сделал
Код AS3:

public function create(e:Event) : void

Ничего не изменилось.

Цитата:

И вообще логика, мягко говоря, странная. Какой-то сторонний класс, создает в себе экземпляр главного?
Сторонний класс исплозьуется как дизайн, а в главном все основные функции работы с базой данных..

Код AS3:

_info..name.text().addEventListener(MouseEvent.CLICK, instance.create);
stat_vars['search'] =  _info..name.text() as mean;

С этими строчками все нормально ??

goodguy 17.08.2011 22:23

Что есть вот это?
Код AS3:

stat_vars['search'] =  _info..name.text() as mean;


kaploson 17.08.2011 22:28

ну предполагается,отправить "имя" в скрипт php , где оно будет под переменной search

goodguy 17.08.2011 22:32

Так а почему это приводится к типу mean?
mean - это же спрайт О_о

kaploson 17.08.2011 22:39

убрал, сделал:
Код AS3:

stat_vars['search'] =  _info..name.text() ;

Все равно не работает..

Genzo 18.08.2011 12:10

Код AS3:

_info..name.text().addEventListener(MouseEvent.CLICK, instance.create);

на что вы вешаете прослушиватель? на XML или строку? как можно кликнуть по данным? ......

carrotoff 18.08.2011 12:53

Я что-то вообще не разобрался, Main - это документ класс (как понял я из фразы "основной класс"), он срабатывает при запуске, а где происходит создание экземпляра mean? Он вообще срабатывает?

Или я что-то не заметил?

Да, кстати, название классов лучше писать с большой буквы

kaploson 18.08.2011 13:00

Мне приходят данные в виде XML
Код:

<data>
        <name>ИМЯ1,ИМЯ2,ИМЯ3</name>
        <date>ДАТА</date>
</data>

Соответственно я их вывожу на экран. И мне надо сделать каким нибудь образом, чтобы можно было кликать на
ИМЯ1,ИМЯ2,ИМЯ3, нажав на одно из них должна вызывается функция из главного класса Main.

Да mean создается в Main'e.

Genzo 18.08.2011 13:05

Код AS3:

_text = new TextField();
                        _text.multiline = true;
                        _text.wordWrap = true;
                        _text.htmlText = _info..name.text()+ "\n" +_info..date.text();
                        _info..name.text().addEventListener(MouseEvent.CLICK, instance.create);

Вам надо не :
Код AS3:

_info..name.text().addEventListener(MouseEvent.CLICK, instance.create);

А :
Код AS3:

_text.addEventListener(MouseEvent.CLICK, instance.create);


carrotoff 18.08.2011 13:06

Цитата:

нажав на одно из них должна вызывается функция из главного класса Main
Вы выводите свой xml в текстовое поле, и хотите сделать кликабельными имя1, имя2, имя3 отдельно?
Если так, то в данном случае ничего не получится (ну если не применить некое шаманство, его мы не рассматриваем).

Для решения такой задачи, необходимо имя1, имя2, имя3 сделать отдельными экранными объектами.

Upd: Ну, а если я вас неправильно понял, и вам нужно всего лишь отловить нажатие мышки по текстовому полю, то ответ вам написали уже

kaploson 18.08.2011 14:01

Цитата:

Вы выводите свой xml в текстовое поле, и хотите сделать кликабельными имя1, имя2, имя3 отдельно?
Именно отдельными.
Цитата:

Для решения такой задачи, необходимо имя1, имя2, имя3 сделать отдельными экранными объектами.
Каким образом? Подскажите пожалуйста..

Genzo 18.08.2011 14:18

http://help.adobe.com/ru_RU/FlashPla....html#htmlText

Цитата:

Можно использовать событие link, чтобы ссылка выполняла функцию ActionScript в SWF-файле, а не открывала URL-адрес. Для определения события link используйте схему событий, а http в атрибуте href. То есть, href="event:myText" вместо href="http://myURL". Когда пользователь щелкает гипертекстовую ссылку, содержащую схему события, текстовое поле отправляет объект TextEvent с именем link, свойство text которого имеет значение myText. После этого можно создать функцию ActionScript, которая будет выполняться при отправке события TextEvent с именем link.

kaploson 18.08.2011 14:29

тут получается, что уже известно количество на которые делаются Link.. А у меня неизвестно т.е. может быть ИМЯ1,...,ИМЯN, причем они могут удаляться, добавляться и тд..Возможно ли сделать link на XML - как у меня?

Genzo 18.08.2011 14:41

Цитата:

тут получается, что уже известно количество на которые делаются Link.. А у меня неизвестно т.е. может быть ИМЯ1,...,ИМЯN, причем они могут удаляться, добавляться и тд..Возможно ли сделать link на XML - как у меня?
не очень ясен вопрос , опишите где вы это используете и зачем.

kaploson 18.08.2011 14:46

Как я писал раньше:
Мне приходят данные в виде XML
Код:

<data>
        <name>ИМЯ1,ИМЯ2,ИМЯ3</name>
        <date>ДАТА</date>
</data>

Соответственно я их вывожу на экран. И мне надо сделать каким нибудь образом, чтобы можно было кликать на
ИМЯ1,ИМЯ2,ИМЯ3, нажав на одно из них должна вызывается функция из главного класса Main.

Но тут может быть любое количество ИМЕН. и их количество неизвестно..

Точнее там XML код такой:
Код:

<data>
<id>       
<name>ИМЯ1</name>
        <date>ДАТА</date>
</id>
<id>       
<name>ИМЯ2</name>
        <date>ДАТА</date>
</id>
....
<id>       
<name>ИМЯN</name>
        <date>ДАТА</date>
</id>
</data>

Добавлено через 42 секунды
и как их все залинковать на одну функцию, и чтобы этой функции посылался ИМЯ на которое мы кликаем

carrotoff 18.08.2011 15:09

создавайте динамически текстовые поля в количестве равном количеству имен, записывайте туда по одному ваши имена, и подписывайте их на мышиное событие с одним и тем же обработчиком, в котором при клике проверяйте значение текстового поля

Genzo 18.08.2011 15:25

Цитата:

создавайте динамически текстовые поля в количестве равном количеству имен
Можно и в одном текстовом поле.

Код AS3:

var ids:XMLList = _info.id;
for each(var i in ids)
{
    _text.htmlText += '<a href = "event:' + i + '">' + ids[i].name + '</a>\n' + ids[i].date
}
 _text.addEventListener(TextEvent.LINK, linkHandler);
 
private function linkHandler(e:TextEvent):void {
  var index:uint = uint(e.text)
  var ids:XMLList = _info.id;
 
  //можно обращаться к ids[index]
 
}


carrotoff 18.08.2011 15:28

Да, можно ссылками сделать

kaploson 18.08.2011 15:55

Спасибо, сейчас попробую, а еще такой вопросик:
Например функция linkHandler находится в классе Main как мне ее вызвать правильно ?

Так:
Код AS3:

var number : Main = new Main();
var ids:XMLList = _info.id;
for each(var i in ids)
{
    _text.htmlText += '<a href = "event:' + i + '">' + ids[i].name + '</a>\n' + ids[i].date
}
 _text.addEventListener(TextEvent.LINK,number.linkHandler);

Просто я пробовал аналогично сделать с кнопкой - не получалось. Нажимал в приложении на кнопку и все висло. Хотя CS5 нормально компилировал.

Genzo 18.08.2011 16:01

Цитата:

Например функция linkHandler находится в классе Main как мне ее вызвать правильно ?
внтури класса Main публичная функция linkHandler , в параметром TextEvent

Код AS3:

public function linkHandler(e:TextEvent):void
{
 
}


kaploson 18.08.2011 16:27

при нажатии на кнопку, при которой должны появится данные name, date , приложение начинает виснуть..

Genzo 18.08.2011 16:30

"Код в студию"

kaploson 18.08.2011 16:38

код класса mean :
Код AS3:

 
private var _info:XML;
public function mean(info:XML)
                {
                        _info = info;
                        func1();
 
                }
 
private function func1():void
                {
          var number:Main = new Main();
                  var ids:XMLList = _info.part;
 
                        _text = new TextField();
                        _text.defaultTextFormat = _textFormat;
                        _text.multiline = true;
                        _text.wordWrap = true;
                        _text.width = _blockWidth - 20;
 
 
                    _text.htmlText += '<a href = "event:' + i + '">' + ids[i].name + '</a>\n' + ids[i].date
 
                _text.addEventListener(TextEvent.LINK, number.linkHandler);
 
                _text.height = _text.textHeight + 25;
 
                }

код в Main:
Код AS3:

public function linkHandler(e:TextEvent) : void
                {
                var index:uint = uint(e.text)
                  var ids:XMLList = _info.part;
            // создание запроса
            var stat_loader:URLLoader = new URLLoader();
            var stat_request:URLRequest=new URLRequest("http://site.ru/test.php");// заменяем на ссылку к вашему скрипту
            stat_request.method=URLRequestMethod.POST;
            // добавление параметров в запрос
            var stat_vars:URLVariables = new URLVariables();
            stat_vars['search'] = ids[index];
            stat_request.data=stat_vars;
            stat_loader.addEventListener(Event.COMPLETE,testing);
            stat_loader.load(stat_request);               
                                                        }


Genzo 18.08.2011 16:46

Код AS3:

stat_vars['search'] = ids[index];

- вы XML туда записываете ,а не параметр

в func1 , отсутствует цикл создания и неизвестная переменная i , не должно компилироваться

Добавлено через 40 секунд
в классе Main нет объекта _info

kaploson 18.08.2011 16:51

Код AS3:

private var _info:XML;
public function mean(info:XML)
                {
                        _info = info;
                        func1();
 
                }
 
private function func1():void
                {
          var number:Main = new Main();
                  var ids:XMLList = _info.part;
 
                        _text = new TextField();
                        _text.defaultTextFormat = _textFormat;
                        _text.multiline = true;
                        _text.wordWrap = true;
                        _text.width = _blockWidth - 20;
 
 
            for each(var i in ids)
                        {
                    _text.htmlText += '<a href = "event:' + i + '">' + ids[i].name + '</a>\n' + ids[i].date
                        }
 
                _text.addEventListener(TextEvent.LINK, number.linkHandler);
 
_text.height = _text.textHeight + 25;
 
                }

Цикл есть, просто удалял лишнее и случайно убрал..
Цитата:

Код AS3:
stat_vars['search'] = ids[index];
- вы XML туда записываете ,а не параметр
а как надо ? name запихивать?

Цитата:

в классе Main нет объекта _info
Написать в Main :
Код AS3:

private var _info:XML;

?

Genzo 18.08.2011 16:58

Цитата:

а как надо ? name запихивать?
. ну вам виднее ,что нужно передать. скорее всего
Код AS3:

stat_vars['search'] = ids[index].name;

Цитата:

Написать в Main :
Вам надо как-то классу Main передать ваш XML , можно сделать так же в конструкторе
Код AS3:

private var _info:XML;
public function Main(info:XML)
{
  this._info = info;
}
 
 
...... mean :
var number:Main = new Main(this._info);


kaploson 18.08.2011 17:10

Спасибо, вечерком попробую и отпишусь каков результат)

Добавлено через 2 часа 44 минуты
После компиляции выдает:
Цитата:

ArgumentError: Error #1063: Несоответствие количества аргументов в Main(). Ожидалось 1, получено 0.
Добавлено через 3 часа 41 минуту
Если поможет то вот Main :
Код AS3:

public function Main(info:XML):void
                {
 
                        this._info = info;
 
                        if (stage) init();
                else addEventListener(Event.ADDED_TO_STAGE, init);
}
 private function init(e:Event = null):void
{
 
        removeEventListener(Event.ADDED_TO_STAGE, init);
 
....
}

Добавлено через 22 часа 48 минут
Кто-нить подскажите пожалуйста..

dr1emaver 19.08.2011 21:33

Может надо попробовать подключить класс через import ?
Код AS3:

 import mean ;
public class Main {
...

Аналогично и в mean'e

kaploson 20.08.2011 13:16

Попробовал не получилось.. все равно таже ошибка :
Цитата:

ArgumentError: Error #1063: Несоответствие количества аргументов в Main(). Ожидалось 1, получено 0.

Genzo 20.08.2011 16:06

вы в класс Main что-нибудь передаете? Насколько я понял он является основным классом , соответственно он должен создаваться без параметров.

kaploson 20.08.2011 16:20

Да класс Main является основным классом.

Вы мне просто раньше писали:
Цитата:

Вам надо как-то классу Main передать ваш XML , можно сделать так же в конструкторе

Код AS3:private var _info:XML;
public function Main(info:XML)
{
this._info = info;
}


...... mean :
var number:Main = new Main(this._info);
Я так и сделал...
А если сделать без параметров, то все скомпилится нормально без ошибки, но при нажатии на кнопку информация :
Цитата:

for each(var i in ids)
{
_text.htmlText += '<a href = "event:' + i + '">' + ids[i].name + '</a>\n' + ids[i].date
}
не отобразится, хотя от сервера идет..

Genzo 20.08.2011 17:39

просто сделайте переменную в Main и назначайте ее , не в конструкторе
Код AS3:

private var _info:XML;
public function Main()
{
}
 
public function set info(value:XML):void
{
this._info = value;
}

просто непонятна структура приложения

kaploson 20.08.2011 18:12

Структура приложения:
Есть главный класс Main.В нем все функции работы с БД и различные испольняющие, например вывод в блоки информации.
И есть второй класс mean. Он используются как вывод информации в блоки ( контейнер).
При нажатии на кнопку которая описана в Maine вызывается функция, которая рисует блоки и выводит в них информацию, которая берется из mean'a.
После того как блоки и информация в нем отобразятся необходимо сделать, чтобы можно было нажать на имя и тогда бы вызвалась функция которая находится в Maine.

Приведу код который сейчас:
Main :
Код AS3:

public var _info:XML;
 public function Main():void
                {
                if (stage) init();
                else addEventListener(Event.ADDED_TO_STAGE, init);
        }
public function ClickHandler(e:TextEvent) : void
                {
        var index:uint = uint(e.text)
          var ids:XMLList = _info.part;
            // создание запроса
            var stat_loader:URLLoader = new URLLoader();
            var stat_request:URLRequest=new URLRequest("http://site.ru/test.php");
            stat_request.method=URLRequestMethod.POST;
            // добавление параметров в запрос
            var stat_vars:URLVariables = new URLVariables();
            stat_vars['search'] =  ids[index].name;
            stat_request.data=stat_vars;
            stat_loader.addEventListener(Event.COMPLETE,testing);//Функция testing просто для вывода результата
            stat_loader.load(stat_request);               
                                                        }
 
 
public function set info(value:XML):void
 {
this._info = value;
}

Класс mean:
Код AS3:

private var _info:XML;
public function mean(info:XML)
                {
                        _info = info;
                        func();
}
private function func():void
                {
 
              var ids:XMLList = _info.part;
              var number:Main = new Main();
 
 
                        _text = new TextField();
                        _text.defaultTextFormat = _textFormat;
                        _text.multiline = true;
                        _text.wordWrap = true;
                        _text.width = _blockWidth - 20;
 
        for each(var i in ids)
            {
    _text.htmlText += '<a href = "event:' + i + '">' + ids[i].name.text + '</a>\n' + ids[i].date.text;
        }
 _text.addEventListener(TextEvent.LINK, number.ClickHandler);
 
        _text.height = _text.textHeight + 25;
 
                }

Сам файл XML который идет от БД вида:
Код:

<data>
        <part>
                <name>ИМЯ1</name>
                <date>22.09.2011</date>
            </part>
            <part>
                <name>ИМЯ2</name>
                <date>11.09.2011</date>
            </part>
............         
  <part>
                <name>ИМЯN</name>
                <date>22.11.2012</date>
            </part>
</data>

В таком состоянии приложение нормально компилируется,но при нажатии на кнопку которая должна отображать блоки и информацию ничего не происходит..

Если заменить
Код AS3:

 for each(var i in ids)
                        {
                    _text.htmlText += '<a href = "event:' + i + '">' + ids[i].name.text + '</a>\n' + ids[i].date.text;
                        }

на:

Код AS3:

_text.htmlText = _info..name.text()+ "\n" +_info..date.text()+"\n" ;

То информация будет просто выводится на экран..Но мне нужно чтобы можно было кликать на определенное name (их может будет несколько ) и это name передавалось функции в maine, тоесть функции ClickHandler.

Genzo 20.08.2011 18:20

если у вас _info:XML; в maine инициализируется все должно работать. Только var number:Main = new Main(); в mean не должно быть , вы создаете главный класс в дочернем.

Код AS3:

_text.addEventListener(TextEvent.LINK, number.ClickHandler); //Попробуйте заменить на 
_text.addEventListener(TextEvent.LINK, parent.ClickHandler);


kaploson 20.08.2011 18:26

заменил Ошибка : Обращение возможного неопределенного свойства ClickHandler через ссылку со статическим типом flash.display:DisplayObjectContainer .

Genzo 20.08.2011 18:37

какой родительский класс у класса mean?

попробуйте
Код AS3:

var main:Main = this.parent as Main; //или var main:Main = this.parent.parent as Main
trace(this.parent) //Что выдаст?
_text.addEventListener(TextEvent.LINK, main.ClickHandler);


in4core 20.08.2011 19:11

Код AS3:

public function Main(info:XML)
{
this._info = info;
}
 
var number:Main = new Main(this._info);

В мемориз

Код AS3:

var лимон:Арбуз = new Арбуз(дыня);

и вот еще

Код AS3:

public class готовыйСтол(осталось_собрать:Ножки) { }

Добавлено через 1 минуту
Код AS3:

addEventListener(TextEvent.LINK

Какие то не опробаванные мной евенты! в 10.3 вышли или были уже?

alatar 20.08.2011 19:21

Цитата:

Какие то не опробаванные мной евенты! в 10.3 вышли или были уже?
В 9.0.


Часовой пояс GMT +4, время: 09:46.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.