PDA

Просмотр полной версии : данные из функции AS3


exsites
04.11.2015, 03:21
Доброй ночи. потихому изучаю AS3 вот получилось что получилось..

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE,onComplete);

function onComplete(event:Event) {
var img:Array = [event.target.data];

//trace(img)

//return img;
}

как получить массив img вне функции?
Спасибо.

ALeXVoz
04.11.2015, 10:54
Хендлеры всегда должны быть void
В onComplete вызвать другую функцию и передать как параметр.

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE,onComplete);

function onComplete(event:Event):void {
var img:Array = [event.target.data];
someFun(img)
}

function someFun(arr:Array):void {
//do something
}

Zebestov
04.11.2015, 14:10
Или объявить var img:Array вне метода (в данном случае обработчика события).


var img:Array;

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(event:Event):void {
img = [event.target.data];
test();
}

function test():void {
trace(img);
}

caseyryan
04.11.2015, 19:26
Хендлеры всегда должны быть void
Совсем не обязательно. Просто в общем случае из них нет смысла что-либо возвращать

ALeXVoz
04.11.2015, 19:40
Или объявить var img:Array вне метода (в данном случае обработчика события).

Глобальные переменные - не лучший метод. По возможности нужно избегать.

Zebestov
04.11.2015, 19:42
О чем ты говоришь :) парень код в кадре пишет! В противном случае разумеется переменная img была бы полем класса.

exsites
05.11.2015, 04:58
Спасибо, разобрался.
Да, про поле класса я знаю, не судьба пока мне писать в отдельных файлах.

caseyryan
05.11.2015, 07:21
Да, про поле класса я знаю, не судьба пока мне писать в отдельных файлах.
Надо сразу привыкать к написанию кода в классах. Установить какую-нибудь нормальную IDE, типа FlashDevelop или Flash Builder (FlashDevelop бесплтаная и очень крутая, так что я руками и ногами за нее :D)

exsites
05.11.2015, 08:11
Я Flex попробовал, вроде бы написать что-то можно, но я хоть ты апстену не понимаю как там рисовать на swf какие-нибудь картинки поля или еще что-то... Во флеше можно и нарисовать и написать..

caseyryan
05.11.2015, 09:56
Я Flex попробовал, вроде бы написать что-то можно, но я хоть ты апстену не понимаю как там рисовать на swf какие-нибудь картинки поля или еще что-то... Во флеше можно и нарисовать и написать..

эти понятия нужно разделять

exsites
05.11.2015, 10:44
То есть? Рисовать во флеше а кодить в билдере? Да это по моему еще хуже извращение чем кодить в о фреймах:-))))

udaaff
05.11.2015, 12:12
Кадры - это жутко неудобно для написания чего-то сложнее баннера. И как раз таки написание в оных, имея более удобные инструменты, можно считать извращением. Почему бы сразу не пойти по верному пути?

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

exsites
05.11.2015, 14:27
Не знаю, может быть. Мне кажется можно код по кадрам растолкать, то же самое что и файлы в папках... Только в файлы все на сервер тащить надо а тут адна swf... савсэм адна..:-)

udaaff
05.11.2015, 14:31
Файлы точно также компилируются в swf, их не нужно никуда тащить.

exsites
05.11.2015, 15:04
Да ладно?! Вот это уже интереснее.. ТО есть мне не придется их тащить на сервер? Блин. Я думал .. Век живи. Походу надо попробовать, тем более у меня стоит Flash Builder 4.6. Он нормален для этих целей?

Кстати не подскажете как можно текстовое поле масштабировать? У меня там картинка выводится. Её надо сделать по размерам поля, тут наверное надо получить как-то его ширину в текущем состоянии этого поля. Ну и хотелось бы что бы она разворачивалась на фулскрине..

udaaff
05.11.2015, 15:40
Он нормален для этих целей?
Рекомендую вам использовать FlashDevelop или IDEA. Сам пользуюсь FDT, но он платный во всех смыслах.
Кстати не подскажете как можно текстовое поле масштабировать? У меня там картинка выводится. Её надо сделать по размерам поля, тут наверное надо получить как-то его ширину в текущем состоянии этого поля. Ну и хотелось бы что бы она разворачивалась на фулскрине..
Не сталкивался с таким. Если вопрос не относится к теме, то создавайте новую тему.

exsites
05.11.2015, 15:44
А как же рисовать??? Сейчас сижу и не понимаю.. Вот например форму для отправки обратной связи например как рисовать в билдере?

udaaff
05.11.2015, 16:03
Как вариант: готовите графику во флеш иде (прописываете необходимым объектам имена классов, в настройках в библиотеке, которые будут доступны в вашем проекте после подключения либы), далее экспортируете её в swc и подключаете её к своему проекту.

PS: Должны быть тысячи примеров раскрывающих такой подход.

exsites
05.11.2015, 16:13
ну вот теперь более менее картина проясняется.
а если один какой-то объект надо перерисовать? или размеры подогнать? надо после каждого движения делать экспорт?

udaaff
05.11.2015, 16:17
Конечно.

exsites
05.11.2015, 16:20
Зачем тогда флеш если там не нужно писать код?
Вот у адоба все через ж.. что видео редакторы, то и флеш...

udaaff
05.11.2015, 16:36
Приложения можно делать на дисплей листе или на stage3d (используя, например Starling framework). В первом варианте флеш удобен для верстки (т.е. позиционирование, вложенность элементов, масштабирование и т.п.), чего очень и очень не хватает во втором варианте, только не давно появилось расширения для того же старлинга http://www.flasher.ru/forum/blog.php?b=718 . А так или расставлять всё "руками", или писать скрипты для графического редактора, или использовать прочие менее удобные подходы.

exsites
05.11.2015, 19:47
а что такое дисплей лист?

udaaff
05.11.2015, 20:00
"Обычный способ", то как вы делаете сейчас, без использования stage3d.

exsites
06.11.2015, 05:00
конечно сейчас буду глупости спрашивать... но все же:
как перетащить отсюда:

stage.addEventListener(Event.RESIZE, resizeHandler);
function resizeHandler(event:Event):void {

x_ = 320;

}


вот сюда:


function completeLoadImage(event:Event):void
{
var X:Number = x_;
}


Подскажите.
Спасибо.

Добавлено через 24 минуты
Кстати на вопрос так никто и не ответил... Вопрос был как получить вне функции а не засунуть в другую функцию!

udaaff
06.11.2015, 11:14
Вопрос был как получить вне функции а не засунуть в другую функцию!
Загрузка данных выполняется асинхронно. Даже если вы загружаете что-то локально, данные не будут загружены моментально, доступ будет как минимум на след. кадре. Поэтому так как вы хотите работать у вас не получится, "плясать" так или иначе надо от функции-обработчика.

exsites
06.11.2015, 15:51
На след кадре... это как на след фрейме...., а это может быть выходом..., если результат один то идем в один фрейм а если другой в другой.. а вы говорите во флеше писать не надо... Да в любой, перечисленной вами программе, голову сломать можно :-) :-). То ли дело php, открыл блокнот и пофиг...
Я так понимаю в том примере на один пост выше мне не передать результат первой функции во вторую из-за того что там события -> event:Event ?
Или все так можно что-то сделать?

Tails
06.11.2015, 16:08
Ничего, никто ещё не сломал.
Книжку почитайте, Мука. С контекстом видимости переменных ознакомьтесь, атрибутами доступа. Давно бы уже сами всё узнали, вместо того чтоб пестрить тут нубскими вопросами.

Zebestov
06.11.2015, 16:15
на вопрос так никто и не ответил... вопрос был как получить вне функции а не засунуть в другую функцию!А это что (http://www.flasher.ru/forum/showpost.php?p=1188624&postcount=3)?

exsites
06.11.2015, 16:40
А это что (http://www.flasher.ru/forum/showpost.php?p=1188624&postcount=3)?


Вот:

var img:Array;

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(event:Event):void {
img = [event.target.data];
test();
}

function test():void {
trace(img);
}



А вот так сможно?


var img:Array;

var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("myxml.xml"));
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(event:Event):void {
img = [event.target.data];
test();
}

var new_img =img;



Добавлено через 1 минуту
Ничего, никто ещё не сломал.
Книжку почитайте, Мука. С контекстом видимости переменных ознакомьтесь, атрибутами доступа. Давно бы уже сами всё узнали, вместо того чтоб пестрить тут нубскими вопросами.

Мук это автор?
Зря вы про нубские вопросы. У каждого языка есть свои тараканы. И невозможность получить результат выполнения функции в любом месте это "надевание трусов через голову".
И то что вам кажется очевидным....

Zebestov
06.11.2015, 16:47
А вот так можно?Ну конечно можно! Другое дело, что new_img в этом месте выполнение программы будет равен null, как и img. И зачем тебе это?

ZackMercury
06.11.2015, 17:03
И невозможность получить результат выполнения функции в любом месте это "надевание трусов через голову".
И в каком месте нельзя получить результат выполнения функции?

Wolsh
06.11.2015, 19:47
резоннее спросить, в какое время.

ZackMercury
06.11.2015, 20:34
Ну что ж вы, сир, не вдумываетесь, временами, в столь простые вещи?
Неужто вы хотите полагать, что код, за телом функции линейно следующий лишь выполнится не сразу, а после окончания загрузки?
В таком бы случае, зачем там нужна функция вообще? По вашей логике, там было проще прописать загрузку, а ассет на строке чуть ниже стал уже б загружен.
Нет, здесь, внимание, такое есть понятие, как асинхронность. Сиё, извольте объяснить, означает, что слушаем мы "onComplete" событие лишь для того, чтобы поймать то место, самое то место, где ассет наш уже загружен, а всё, что далее идёт за функцией начинает выполняться в тот же миг, как начинается загрузка.

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

exsites
06.11.2015, 20:43
А я и не понимаю, как получить мне новую координату и ширину в следующей функции?


var x_ = 320;
var y_ = 0;
var new_width = stage.stageWidth - 320;
stage.addEventListener(Event.RESIZE, resizeHandler);
function resizeHandler(event:Event):void {
if (stage.stageWidth == '800') {
x_ = 320;
new_width = stage.stageWidth - 320;
} else {
x_ = 0;
new_width = stage.stageWidth;
}
}



function completeLoadImage(event:Event):void
{

containerImages_mc.removeChildAt(0);
var bitmapData:BitmapData = event.target.loader.content.bitmapData as BitmapData;
var bitmap:Bitmap = new Bitmap(bitmapData);
containerImages_mc.addChildAt(bitmap, 0);


var w= bitmap.width;
var h= bitmap.height;
var ar= w / h;
var new_h = new_w / ar;

containerImages_mc.x = x_; // вот тут получить координату
containerImages_mc.y = y_;
var new_w = new_width; // вот тут получить новую ширину

containerImages_mc.width = new_w;
containerImages_mc.height = new_h;
var bitmapW:Number = bitmap.width;
var bitmapH:Number = bitmap.height;

bitmap.width = Math.floor(bitmapW);
bitmap.height = Math.floor(bitmapH);
}

Psycho Tiger
06.11.2015, 20:46
Ну что ж вы, сир, не вдумываетесь, временами, в столь простые вещи?
Неужто вы хотите полагать, что код, за телом функции линейно следующий лишь выполнится не сразу, а после окончания загрузки?
В таком бы случае, зачем там нужна функция вообще? По вашей логике, там было проще прописать загрузку, а ассет на строке чуть ниже стал уже б загружен.
Нет, здесь, внимание, такое есть понятие, как асинхронность. Сиё, извольте объяснить, означает, что слушаем мы "onComplete" событие лишь для того, чтобы поймать то место, самое то место, где ассет наш уже загружен, а всё, что далее идёт за функцией начинает выполняться в тот же миг, как начинается загрузка.

Извольте иной раз, прежде, чем язык винить - представить, будто вы не понимаете чего-то, и почитать примеры и разъяснения из справки и других полезных книжек.
Что-то у меня от таких формулировок затошнило.

Для меня, кстати, совсем не просто и далеко не логично, почему я не могу загружать что-то синхронно. Да, даже в одном потоке. Да, нет ни одного довода в пользу асинхронных методов там, где нужны (были бы удобнее) синхронные.

udaaff
06.11.2015, 20:59
А я и не понимаю, как получить мне новую координату и ширину в следующей функции?
Сделайте одну функцию отвечающую за масштабирование изображения, если оно загружено.
function update(newWidth:Number, newHeight:Number):void
{
if (!myImage)
return;
// здесь изменяем размеры
}
Изменился размер - вызвали update(), есть уже у нас изображения - ок, меняем размер, нет - ничего не происходит.
Загрузилось изображение - вызвали update(stage.stageWidth, stage.stageHeight), выставили текущие размеры сцены.

ZackMercury
06.11.2015, 21:00
exsites, друг мой, успокойтесь вы, расслабьтесь, отдохните.
Существуют в мире программирования глобальные - общие, и локальные переменные.
Работающая программа на коем-то ни было языке - это совокупность глобальных переменных(классов с переменными), кои изменяются по всяким событиям, на которые мы добавим слушатель.
Представьте себе это, как таймлайн, на котором одно за другим по очереди всплывают какие-то события, и код ваш обрабатывает их, тот, который внутри обработчиков(функций).
https://pp.vk.me/c625826/v625826630/54194/YL8yEj7A-hY.jpg

exsites
06.11.2015, 21:20
Да, нет ни одного довода в пользу асинхронных методов там, где нужны (были бы удобнее) синхронные.

Вот как-то я об этом же.

Сделайте одну функцию отвечающую за масштабирование изображения, если оно загружено.
function update(newWidth:Number, newHeight:Number):void
{
if (!myImage)
return;
// здесь изменяем размеры
}
Изменился размер - вызвали update(), есть уже у нас изображения - ок, меняем размер, нет - ничего не происходит.
Загрузилось изображение - вызвали update(stage.stageWidth, stage.stageHeight), выставили текущие размеры сцены.
Так опять же переменные получаются внутри функции, наружу-то их не вытащить... Как я передам их туда куда хочу..?



exsites, друг мой, успокойтесь вы, расслабьтесь, отдохните.
Существуют в мире программирования глобальные - общие, и локальные переменные.
Да спокоен я как стадо мамонтов:-)))
Глобальные переменные зло. Во всяком случае в php.

Меня интересует, могу ли я результат выполнения функции передать в другую функцию как я написал в предыдущем посте? Можно или нет? Или мне надо весь код заново переписывать ввиду того что надо по другому?

Zebestov
06.11.2015, 21:28
нет ни одного довода в пользу асинхронных методов там, где нужны (были бы удобнее) синхронныеНо здесь-то не тот случай. Здесь имеется пользователь, которому надо что-то насвистывать, пока что-то грузится. Это же тебе не PHP, где все процессы и так фоновые и пользователю пабарабану, что весь код скрипта ждет, пока что-то куда-то загрузится, пользователь ждет конечного результата в той или иной форме, тупо втыкая в экран.

Кстати! Этот процесс тоже, выходит, асинхронный: пока ты крутишь перед носом пользователя фронтенд-прелоадер, где-то там в бэкенде скрипт синхронно для себя, но асинхронно для пользователя, пыхтит над результатом, которого этот самый пользователь ожидает.

exsites
06.11.2015, 21:30
Вы мне на моем примере покажите, как можно это реализовать. Пока что я хоть убей не понимаю как. Вы мне пытаетесь что-то донести, но это так размыто что не понятно даже что вы несете...:-))

Zebestov
06.11.2015, 21:34
Да вроде первые три комментария исчерпали тему. Мы уже так, между собой, не обращай внимания :)
Таки почитай Мука (сам не читал, его рекомендуют). Тогда и вопросы будут правильней, и ответы ясней.

ZackMercury
06.11.2015, 21:35
Глобальные переменные зло.
По-видимому, вы концепцию не уловили. Но оно то и понятно, никак-таки вы новичок.
Без них не будет ничего.
Main, главный класс в данном случае есть глобальная переменная, как и все его свойства и свойства его детей, и свойства его глобальных переменных, и так далее в рекурсии.
Ежели пишете вы в кадрах - логика начинает биться в глухой кут.

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

Пожалуй, без примера сложно на словах всё показать наглядно.

exsites
06.11.2015, 21:38
Вот поэтому и прошу, на моем примере покажите как это выглядит. Тогда быстрее понимание придет.

ZackMercury
06.11.2015, 21:40
exsites, ваш код построен по принципам, понятным только вам, но есть и общепринятые нормы формирования красивого кода.
Поэтому дайте какую-то задачу, и вам дадут пример решения.

Zebestov
06.11.2015, 21:43
Вот поэтому и прошу, на моем примере покажите как это выглядит. Тогда быстрее понимание придет.
Нет, не придет. Быстрее будет прочитать Мука.

exsites
06.11.2015, 21:47
Поэтому дайте какую-то задачу, и вам дадут пример решения.
Вот код, не могу найти решение, помогите. Дайте решение.
Нет, не придет. Быстрее будет прочитать Мука.
У меня даже книжки нет.

Вообщем вы не знаете как решить сию задачу.
Воды налили, умных слов наговорили, а дальше в сад:-)))

Zebestov
06.11.2015, 21:49
У меня даже книжки нет.
…даже в этом случае быстрее будет Мука прочитать ;)

exsites
06.11.2015, 22:00
Хватит флудить, про Мука я уже услышал. Есть решение, пишите, нет дасвидания.

Psycho Tiger
06.11.2015, 23:38
По идее вот этот код (http://www.flasher.ru/forum/showpost.php?p=1188733&postcount=35) должен работать. Ведь обе желаемые переменные объявлены в скоупе выше.

Глобальные переменные зло.
По-видимому, вы концепцию не уловили. Но оно то и понятно, никак-таки вы новичок.
Main, главный класс в данном случае есть глобальная переменная,
Ну... Вообще то exsites прав :) А вот ты нет.
Main, что главный класс не является переменной. Как и любой класс это константа (класс-переменная... это за гранью). Не знаю, существует ли вообще в каком-либое языке с настоящими ООП классами возможность иметь переменный класс, но знаю, что это будет явно плохой затеей. Прикидываю в голове, а что если это созданные метапрограммированием классы в рантайме, чтобы как-то снизить количество шаблонного кода? Ну, даже в этом случае это константы.

Глобальные переменные это плохо. Глобальные константы – это нормально (или хорошо). Любая глобальная переменная – это неявная внешняя зависимость. Такой код сложно тестировать и сложнее поддерживать. Чем меньше зависимостей (тем более неявных), тем функции/методы ближе к pure-функциям. Конечно, полностью абстрагироваться нельзя и так или иначе иногда глобальная переменная может быть нужна, но следует понимать что это архитектурная проблема. Избегайте этого по возможности.

Но здесь-то не тот случай. Здесь имеется пользователь, которому надо что-то насвистывать, пока что-то грузится. Это же тебе не PHP, где все процессы и так фоновые и пользователю пабарабану, что весь код скрипта ждет, пока что-то куда-то загрузится, пользователь ждет конечного результата в той или иной форме, тупо втыкая в экран.
Ну, конечно ) Было бы вообще странно если в однопотоковом языке были блокирущие команды. Но для недавно пришедшего человека (впрочем, для любого) такой код

var images:Array = ['path/image1.png', 'path/image2.png', 'path/image3.png'];
var loaded:Array = [];
for (var path:String in images) {
loaded.push(loadImage(path));
}

// all images are loaded!

Был бы сильно понятней и читаемей, чем какой-то хэндлер onComplete, который считает количество загруженных и общих и что-то там потом вызывает в другом конце файла. Конечно, в случае если так было бы можно – были бы и нормальные пользовательские потоки и можно было бы сделать, например, вот так:

thread {
// code from above
thread.join(main);
}

(почти) Линейный код, который легко читать, легко поддерживать и легко написать.
Кстати, не могу не отметить что именно такой код было бы просто тестировать.

// pseudo test
var instance:Something = new Something();
instance.loadImages();
expect(instance.loaded.length).to(eq(3));

И представь себе тест, который тебе приходится писать? Я никогда не тестировал во флеше, но, предполагаю, что придётся много stub'ить и вызывать некоторый #flush застабленным реквестам чтобы поддерживать ассинхронную архитектуру. (к слову, так и живём с JS'ом).

Мне очень нравится Event система, но с другой стороны я разделяю недоумение новопришедших людей по поводу её недостатков.

ZackMercury
06.11.2015, 23:50
PsychoTiger, брат, ты говоришь всё верно, но не учёл, что говорил я о концепции, а не о конкретном языке.
Я просил представлять главный класс и все его зависимости как глобальные переменные, и это верно с той точки зрения, что данный шаблон можно применить к любому его вложенному классу.
Есть класс игры, и в нём массив AI, и все AI не могут быть локальными, так как существуют дольше, чем один раз в событие(они существуют постоянно, а значит они глобальные).
И так со всем-всем-всем.

Глобальные переменные - это нормально, когда есть объекты, которые существуют дольше, чем в одном обработчике события.
Ну тоесть, как, глобальные, тоесть, как свойства класса.(в контексте темы имеется в виду именно это)

exsites
07.11.2015, 00:39
Вообщем вопрос решен.

Вы все равно друг другу не докажете, и смысла в этом нет.
Можно было просто подсказать решение а не флудить, сходи туда сходи сюда.

Добавлено через 1 минуту
Кстати, было еще одно решение в голове, я его оставлял на крайний случай. Это фреймы:-)) Как не банально звучит, но фреймы во флеше это наше все!:-))))

caseyryan
07.11.2015, 08:52
Как не банально звучит, но фреймы во флеше это наше все!:-))))
Фреймы?) Ну ну.
Я ими вообще не пользуюсь, да и другие разработчики, которые давно пишут код, тоже. Они максимум для анимаций, но никак не для кода.

undefined
07.11.2015, 12:17
exsites,не знаю предлагали ли уже.Почему бы не вызвать в обработчике другую функцию и передать ей в качестве параметра загруженную картинку и внутри этой функции сделать все что требуется?

Psycho Tiger
07.11.2015, 12:21
PsychoTiger, брат, ты говоришь всё верно, но не учёл, что говорил я о концепции, а не о конкретном языке.
Впрочем как и я.
Я просил представлять главный класс и все его зависимости как глобальные переменные, и это верно с той точки зрения, что данный шаблон можно применить к любому его вложенному классу.
Нельзя. Main – константа. Любой вложенный класс – тоже константа. Переменные внутри инстанса Main – не глобальны, как и инстанс Main'а (хоть это и синглтон это всё равно дурной тон иметь к нему глобальный доступ).
Глобальные переменные - это нормально, когда есть объекты, которые существуют дольше, чем в одном обработчике события.
Любой объект декларация которого находится за скоупом обработчика может существовать после (или до) отработки хэндлера. Глобальными они от этого не становится, как и не изменяют суть что глобально почти всегда плохо. Я расписал выше почему.

(они существуют постоянно, а значит они глобальные).
Вот здесь, думаю, есть путаница в понятиях. "Глобальный (https://en.wikipedia.org/wiki/Global_variable)" означает только область видимости. На существование и накладываемое значение никаких регалий не накладывается.

udaaff
07.11.2015, 12:54
Попытаюсь подытожить всё сказанное по теме: получить данные изображения сразу после вызова его загрузки нельзя. Вашу задачу можно разбить на две подзадачи:
1. Загрузка картинки.
2. Старт основной программы, которой необходимы предзагруженные данные.
Так как вы не хотите писать на классах, то загрузку можно сделать в первом кадре, и в обработчике окончания - переход на след. кадр, в котором уже и будете работать с загруженными данными.

exsites
07.11.2015, 15:10
exsites,не знаю предлагали ли уже.Почему бы не вызвать в обработчике другую функцию и передать ей в качестве параметра загруженную картинку и внутри этой функции сделать все что требуется?
именно так

Эту тему можно закрыть, вот теперь другая тема: http://www.flasher.ru/forum/showthread.php?p=1188779#post1188779