четверг, 25 февраля 2010 г.

Код для IC

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

InlineCode может использоваться в HiAsm в двух целях:
1. для написания кода, который нельзя реализовать на стандартных компонентах;
2. для объединения кода нескольких стандартных компонентов для оптимизации занимаемого в схеме места.

Второй пункт немаловажен, потому что иногда для построения какого-либо алгоритма приходится ставить очень много компонентов, а в IC тот же алгоритм реализуется на нескольких строчках кода. Поэтому у вас теперь есть выбор: в некоторых случаях можно использовать компоненты HiAsm, в других случаях - IC. Это оптимизирует схему.

Именно про второй способ я расскажу сегодня. Про первый - уже в следующей статье.

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

Посмотрим, как это реализуется на стандартных компонентах HiAsm.



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

Теперь посмотрим, как то же самое реализуется в IC.



Код для вас здесь пока непонятен. Но сразу можно сказать, что здесь не две строки кода. Самое объёмное (по коду) - это создание диалога открытия файла и создание списка строк и загрузка в него файла. Поэтому эти вещи делать в IC невыгодно, их лучше оставлять в виде компонентов HiAsm. А теперь смотрим окончательный вариант.



Симбиоз стандартных компонентов HiAsm и IC даёт отличные результаты. В IC написано практически три строки кода (блок if…the…else - это один блок, но я разбил его на две строки только для удобства чтения кода).


Разберём этот код. Как вы видите, на метод doBegin подаётся строка, причём несколько раз - столько, сколько строк в файле. Значит, код должен просто обрабатывать строку.

var s:string; - это объявление локальной переменной, про неё я рассказывал в прошлой статье блога. Имя переменной - s, тип - string (строковая переменная).

Ещё бывают такие виды переменных:
integer - целое число в 4 байта;
real - число с плавающей точкой (8 байт);
boolean - логический тип, который может принимать только два значения: true (истина) и false (ложь).


На деле типов переменных может быть гораздо больше, если учитывать объекты, например PstrList, Pstream, PopenSaveDialog. Но о них нужно вести отдельный разговор, поскольку это объекты и имеют много своих свойств.

if ToString(dt)<>'' then s := ToString(dt); - это условный блок в сокращенной форме. Полная выглядит так: if…the…else, что переводится как если…то….иначе. Если выполняется условия после if, происходят действия после then, если не выполняется - происходят действия после else.

ToString(dt) - это вы уже знаете по прошлой статье. С помощью этой функции мы получаем строку из потока. А вот дальше мы сравниваем её со строкой-константой (все строки в Pascal заключаются в одинарные кавычки). Символы <> - это сравнение на неравенство. А сравниваем мы с пустой строкой, так как между кавычками ничего нет.

Если строка не пуста, то переменной s присваивается эта самая строка из потока. То есть, переменная s теперь содержит эту строку. Это необходимо - помещать данные из потока или с точек в переменные, если происходит дальнейшая работа с ними. Ведь если мы удалим из такой строки символ, то как потом узнать, что получилось? Повторный вызов ToString(dt) прочитает исходную строку, а не ту, из которой мы удаляли.

Переведу эту строчку кода на русский язык:

ЕСЛИ строка_из_потока не пуста, ТО переменной_s присвоить строку_из_потока;

Дальше идёт более сложный код.

if copy(s,length(s),1)=copy(s,2,1) then delete(s,length(s),1)
else s[length(s)] := s[2];


copy - это функция копирования части строки. У неё три параметра: первый указывает саму строку, второй - позицию символа, с которого начинать копирование, а третий - количество копируемых символов.

length - это функция определения длины строки. Возвращает количество символов в ней. Она имеет только один параметр - строку, длину которой надо узнать.

Итак, мы копируем последний символ из строки s и сравниваем его со вторым. Затем начинает действовать THEN.

delete - это функция удаления символов из строки. У неё такие же параметры, как и у функции copy. Ей мы удаляем последний символ.

Если условие не соблюдается, то действует ELSE. В нём мы обращаемся к строке как к массиву. В квадратных скобках после строки мы указываем позицию символа и можем либо прочитать, либо изменить его. Конечно, можно было поступить так, как на стандартных компонентах: сначала удалить символ, а потом вставить другой, но это более сложный вариант для использования в коде. Помните только, что обращение происходит здесь лишь к одному символу строки, но не к нескольким.

_hi_OnEvent(onEnd,s); выдаёт строку в поток, откуда мы и записываем её в редактор текста.

Все эти действия можно реализовать и на стандартных компонентах, а значит, можно посмотреть код стандартных компонентов, чтобы выяснить, какие функции они используют. Для этого выделите компонент и нажмите Ctrl+F. Можно также вывести в контекстное меню компонента пункт для открытия кода компонента.

Для этого выполните «Сервис» - «Редактор команд» и выберите «контекстное меню элемента рабочего стола» из левого выпадающего списка. В правом списке можно выбрать для него команды меню. Найдите там пункт «исходник компонента» и нажмите «>>».






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

Комментариев нет:

Отправить комментарий