Опубликован: 04.11.2006 | Доступ: свободный | Студентов: 4621 / 581 | Оценка: 4.46 / 3.96 | Длительность: 39:17:00
Урок 13:

Проверка и форматирование данных

В следующем упражнении мы с вами получим доступ к списку шрифтов вашего компьютера, затем, воспользовавшись этой информацией, создадим объект TextFormat и применим его различными способами к текстовому полю movingField, которое мы создали в предыдущем упражнении.

  1. Откройте файл flashWriter2.fla из папки Lesson13/Assets.

Мы продолжаем работу, начатую в предыдущем упражнении.

В этом упражнении мы добавим скрипт в кадр 1 слоя Actions, запрограммируем кнопки и используем компонент Checkbox – все это расширит функциональные возможности нашего проекта.

  1. При открытом инспекторе Параметры (Property) выделите компонент Checkbox.

Подробно разбирать этот компонент мы не будем; главное, что нам сейчас нужно знать – это имя экземпляра: applyToAll. Зная имя, мы сможем использовать метод данного компонента getValue(), который позволяет выяснить, установлен ли в данный момент флажок ( true ) или нет ( false ). Например, если флажок установлен, следующий скрипт присвоит переменной currentValue значение true:

currentValue = applyToAll.getValue();
  1. Откройте панель Действия, выделите кадр 1 слоя Actions и добавьте в конец имеющегося скрипта такую строку:
myFonts = TextField.getFontList();

Эта строка создает массив под именем myFonts, содержащий названия (в виде строковых значений) всех шрифтов, установленных в системе, на которой запущен Flash Player (включая шрифты, встроенные в основной SWF-файл и подгруженные дополнительные SWF-файлы). Например, на моей машине после выполнения данной строки myFonts[3] имеет значение "Arial". Работать этим массивом можно точно так же, как с любым другим. Мы используем значения из этого массива для случайного выбора шрифтов для нескольких объектов TextFormat.

Примечание Используя метод getFontList(), не следует указывать имя конкретного экземпляра текстового поля (как обычно делается с другими методами). Вместо этого мы просто пишем TextField.

  1. В конец имеющегося скрипта добавьте следующие строки:
styleStatus = new TextFormat()
with(styleStatus){
  font = myFonts[random(myFonts.length)];
  color = 0x858273;
  size = 16;
  bold = true;
}

Первая строка данного скрипта создает новый объект TextFormat под именем styleStatus. Как вы вскоре увидите, этот объект будет определять стиль текста в поле statusField. Далее следует оператор with с описанием некоторых параметров форматирования. Тут в основном все понятно, стоит обратить внимание только на строку, устанавливающую значение свойства font. Значение это присваивается путем случайного выбора одного из элементов массива myFonts. В выражении использована random(), которой в качестве аргумента передается длина массива myFonts. Если, например, в массиве 200 элементов, то будет генерироваться случайное число в диапазоне от 0 до 199. Это случайное число выступает как индекс элемента массива myFonts. Если, к примеру, было сгенерировано число 37, то в результате получится такая строка:

font = myFonts[37];

Если, например, под этим индексом в массиве содержится значение (имя шрифта) "DiscoMonkey", этот шрифт и будет использован в этом объекте TextFormat.

Чтобы применить стиль нового объекта TextFormat к текстовому полю statusField, нам следует использовать метод setTextFormat() – что мы и сделаем на следующем шаге.

  1. Измените описание функции updateStatus() следующим образом:
function updateStatus(){
  statusField._x = movingField._x;
  statusField._y = (movingField._y + movingField._height) + 10;
  statusField.text = movingField.length;
  statusField.setTextFormat(styleStatus);
}

Обратите внимание на последнюю строку, которую мы добавили в описание этой функции. Как вы помните, функция эта обновляет позицию текстового поля statusField и текст в нем. В последней строке использован метод setTextFormat(), задающий для текста в поле statusField новый стиль, описанный в объекте TextFormat styleStatus. Мы не случайно поместили эту строку именно в функцию: если описание формата в объекте styleStatus будет изменено, эти изменения отразятся на поле statusField, как только будет вызвана эта функция.

  1. Добавьте следующие строки в конец скрипта в кадре 1:
style1 = new TextFormat()
with(style1){
  align = "left";
  bold = false;
  color = 0x1A1917;
  font = myFonts[random(myFonts.length)];
  indent = 0;
  italic = true;
  leading = 0;
  leftMargin = 20;
  rightMargin = 20;
  size = 20;
  target = null;
  underline = false;
  url = null;
}

Этот скрипт создает новый объект TextFormat под именем style1. В операторе with описаны свойства формата для этого объекта. Обратите внимание: свойствам bold, indent, leading, target, underline и url присвоены значения false, 0, null – это значит, что в данном объекте TextFormat эти свойства не будут использоваться. Конечно, можно описать объект, вообще пропустив эти строки, но мы все же не стали этого делать – и на то есть причина. Предположим, мы применили к текстовому полю некий объект TextFormat (у которого свойство bold имеет значение true ). Естественно, текст в этом поле станет полужирным. Потом, допустим, мы применяем к этому полю другой объект TextFormat (для которого значение свойства bold не было задано явным образом). В таком случае текст в этом поле так и останется полужирным, хотя и получит все другие характеристики, описанные в новом объекте TextFormat. Таким образом, все характеристики, которые должны быть изменены в результате применения объекта TextFormat, должны быть явно описаны в этом объекте, иначе старые значения сохранятся. То же самое касается применения метода setNewTextFormat(). Лучше всегда описывать все свойства, чтобы быть уверенным в результате.

  1. Добавьте следующие строки в конец скрипта в кадре 1:
style2 = new TextFormat()
with(style2){
  align = "center";
  bold = false;
  color = 0xCC0000;
  font = myFonts[random(myFonts.length)];
  indent = 0;
  italic = false;
  leading = 15;
  leftMargin = 0;
  rightMargin = 0;
  size = 14;
  target = null;
  underline = false;
  url = null;
}

Этот скрипт создает еще один объект TextFormat – под именем style2.

Примечание В файле, прилагаемом к этому упражнению, описаны еще два объекта TextFormatstyle3 и style4. Чтобы не повторяться (эти объекты очень похожи на те, что мы только что описали) и поберечь "зеленые легкие планеты", мы здесь пропустим описание этих объектов.

  1. Переместите вызов функций updateStatus() и reshapeBox() (две строки, находящиеся перед строкой myFonts = TextField.getFontList();) в самый конец скрипта в кадре 1.

Как обычно, лучше поместить первоначальные вызовы функций в конец скрипта – здесь, кроме прочего, на то есть особые причины. Вы помните, что на шаге 5 мы модифицировали функцию updateStatus(), которая теперь включает строку с использованием объекта TextFormat styleStatus. Если бы мы оставили вызов этой функции на прежнем месте, то получилось бы, что функция updateStatus() вызывается за долю секунды до того, как создается и описывается объект TextFormat styleStatus – в результате мы получим ошибку (хоть и не столь несущественную), поскольку нельзя использовать то, что еще не создано. Поместив вызов функций в самый конец скрипта, мы получаем уверенность в том, что все объекты будут созданы и описаны заранее.

Нам осталось только запрограммировать кнопки.

  1. При открытой панели Действия выделите кнопку с цифрой 1 и присоедините к ней такой скрипт:
on(release){
  if (_root.applyToAll.getValue()){
    movingField.setTextFormat(style1);
    movingField.setNewTextFormat(style1);
  }else{
    movingField.setNewTextFormat(style1);
  }
  updateStatus();
  reshapeBox();
}

Этот скрипт, в зависимости от того, установлен ли флажок компонента Checkbox (c именем applyToAll ), выполняет при нажатии на кнопку один из наборов действий. При значении true (флажок установлен) оператор if применяет стиль объекта TextFormat style1 ко всему тексту, имеющемуся в поле movingField (setTextFormat()), а также к новому тексту, который будет вводиться в это поле в дальнейшем ( setNewTextFormat() ). Новый стиль форматирования будет немедленно применен к тексту в этом поле. Если значение компонента Checkbox – false, выполняется секция else: стиль объекта style1 применяется только к новому тексту. После того, как будет выполнен один из этих наборов действий, вызываются функции updateStatus() и reshapeBox(), обрабатывающие все изменения? Произошедшие с текстовым полем statusField и экземпляром фильма-символа box в резул ьтате применения нового стиля форматирования.

  1. Мы не станем повторяться; присоедините самостоятельно такие же скрипты к кнопкам 2, 3 и 4, заменив style1 на style2, style3 и style4, соответственно.
  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

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

  1. Закройте тестовый фильм и сохраните свою работу как flashWriter3.fla.

На этом упражнение завершено, а с ним и весь урок. Теперь вы знаете, что можно различными способами манипулировать текстом – даже тем, который вводит пользователь! ActionScript дает возможность проверять всевозможные типы данных, а также форматировать их при помощи HTML и объектов TextFormat. Будучи вооружены этими знаниями, вы сможете даже обычный текст сделать интерактивным элементом.

Салтанат Бектегенова
Салтанат Бектегенова

Дострочное пересдача экзамена

 

Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт: