<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF74-75%3AGambas</id>
		<title>LXF74-75:Gambas - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF74-75%3AGambas"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF74-75:Gambas&amp;action=history"/>
		<updated>2026-05-13T04:54:47Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF74-75:Gambas&amp;diff=5707&amp;oldid=prev</id>
		<title>Yaleks: викификация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF74-75:Gambas&amp;diff=5707&amp;oldid=prev"/>
				<updated>2008-11-30T18:39:29Z</updated>
		
		<summary type="html">&lt;p&gt;викификация&lt;/p&gt;
&lt;a href=&quot;http://wiki.linuxformat.ru/wiki/index.php?title=LXF74-75:Gambas&amp;amp;diff=5707&amp;amp;oldid=5706&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF74-75:Gambas&amp;diff=5706&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Gambas}} ==Cекреты и хитрости== ''В последней статье этой серии король графического интерфейса д-р '''М...</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF74-75:Gambas&amp;diff=5706&amp;oldid=prev"/>
				<updated>2008-11-30T18:38:27Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Gambas}} ==Cекреты и хитрости== &amp;#039;&amp;#039;В последней статье этой серии король графического интерфейса д-р &amp;#039;&amp;#039;&amp;#039;М...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Gambas}}&lt;br /&gt;
==Cекреты и хитрости==&lt;br /&gt;
''В последней статье этой серии король графического интерфейса д-р '''Марк Александр Бейн''' (Dr Mark Alexander Bain) раскрывает свои секреты в работе с этим похожим на Visual Basic языком программирования.''&lt;br /&gt;
&lt;br /&gt;
Последние пару месяцев мы с вами рассматривали отдельные&lt;br /&gt;
аспекты программирования на Gambas. В этот раз я бы хотел&lt;br /&gt;
рассмотреть все те очень полезные секреты и маленькие хитрости, которые нельзя отнести к какой-то определенной категории. Мы&lt;br /&gt;
с вами напишем программу для редактирования конфигурационных&lt;br /&gt;
файлов и по ходу дела рассмотрим все тонкие моменты в действии.&lt;br /&gt;
&lt;br /&gt;
=== Всегда оставляйте путь для отступления ===&lt;br /&gt;
Я говорил это раньше и повторю ещё раз: перед тем, как добавлять что-нибудь в вашу Gambas-форму, реализуйте возможность корректно&lt;br /&gt;
закрыть её. Это может быть кнопка или пункт меню, по нажатию на которые выполняется код&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;ME.Close.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Объединяйте ваши процедуры в модули ===&lt;br /&gt;
При создании новой функции или подпрограммы подумайте, не вынести ли вам её в отдельный модуль. Ведь в этом случае вы с лёгкостью&lt;br /&gt;
сможете воспользоваться ею при создании другого приложения.&lt;br /&gt;
Давайте своим модулям понятные названия. Имена Module1 и&lt;br /&gt;
Module2 могут показаться вполне нормальными в первый момент, но&lt;br /&gt;
вскоре они станут абсолютно темными. Одновременно старайтесь&lt;br /&gt;
помещать похожие функции и подпрограммы в один и тот же модуль.&lt;br /&gt;
&lt;br /&gt;
Например, вы можете поместить всё, что относится к работе с базами&lt;br /&gt;
данных, в модуль Data.&lt;br /&gt;
&lt;br /&gt;
=== Не забывайте о зависимостях при повторном использовании кода ===&lt;br /&gt;
Если вы используете ранее написанный код для нового приложения, не&lt;br /&gt;
забудьте подключить компоненты, от которых зависит этот код.&lt;br /&gt;
Например, если вы используете модуль для подключения к базе данных,&lt;br /&gt;
вам потребуется компонент gb.db, и так далее.&lt;br /&gt;
&lt;br /&gt;
=== Создавайте необязательные параметры функций и используйте для них значения по умолчанию ===&lt;br /&gt;
В процессе работы над проектом вы часто будете создавать функции,&lt;br /&gt;
которым не требуются никакие параметры. Вот, например, простая подпрограмма для подключения к базе данных (не набирайте её, она приведена тут только для пояснения идеи!):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC conn AS NEW Connection&lt;br /&gt;
PUBLIC SUB make_connection()&lt;br /&gt;
WITH conn&lt;br /&gt;
.Host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
END WITH&lt;br /&gt;
conn.Open&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Эта подпрограмма будет работать только в том случае, когда сервер&lt;br /&gt;
баз данных расположен на том же компьютере, где и программа, такое&lt;br /&gt;
поведение зашито в коде. Но можно ведь написать и процедуру, которая&lt;br /&gt;
получает имя сервера баз данных в качестве параметра:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC SUB make_connection(hostName AS String)&lt;br /&gt;
WITH conn&lt;br /&gt;
.Host = hostName&lt;br /&gt;
END WITH&lt;br /&gt;
conn.Open&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь сервер не прошит в коде процедуры, но зато вам придётся&lt;br /&gt;
всегда указывать его при вызове этой подпрограммы. Фактически,&lt;br /&gt;
ваше приложение обрушится, если вы вдруг вызовете процедуру подключения к базе данных, не указав ей обязательный параметр, например вот так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;make_connection(&amp;quot;localhost&amp;quot;)&amp;lt;/source&amp;gt;&lt;br /&gt;
Но вы можете соединить лучшие свойства обоих вариантов, использовав необязательный параметр со значением по умолчанию.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC SUB make_connection(OPTIONAL hostName AS String = &amp;quot;localhost&amp;quot;)&lt;br /&gt;
WITH conn&lt;br /&gt;
.Host = hostName&lt;br /&gt;
END WITH&lt;br /&gt;
conn.Open&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь подпрограмма будет работать правильно вне зависимости от&lt;br /&gt;
того, указали вы ей, к какому серверу присоединяться, или нет (в этом&lt;br /&gt;
случае будет выполнено подключение к localhost).&lt;br /&gt;
&lt;br /&gt;
=== Ловите ошибки, и не давайте им уронить вашу программу ===&lt;br /&gt;
Если вы попробуете добавить последнюю функцию, которую я только что&lt;br /&gt;
рассматривал, в своё приложение и запустите её, то оно обязательно&lt;br /&gt;
обрушится. Это произойдёт потому, что я не передал достаточно сведений объекту conn – кроме имени сервера, ему требуются ещё и тип базы&lt;br /&gt;
данных, её название, а также имя пользователя и пароль.&lt;br /&gt;
&lt;br /&gt;
Не особенно приятно видеть, как ваша программа рушится из-за&lt;br /&gt;
таких простых вещей. Гораздо лучше обработать ошибку, информировать&lt;br /&gt;
о ней пользователя и корректно завершить работу, а лучше – дать возможность пользователю сделать то, что он всё еще может сделать. Для&lt;br /&gt;
этого вам потребуется оператор TRY. Вот пример готовой процедуры&lt;br /&gt;
подключения к базе данных, с обработкой ошибок и необязательными&lt;br /&gt;
параметрами со значениями по умолчанию:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC SUB make_connection(OPTIONAL dbname AS String = &amp;quot;customers&amp;quot;,&lt;br /&gt;
OPTIONAL dbtype AS String = &amp;quot;mysql&amp;quot;, OPTIONAL dbhost AS String&lt;br /&gt;
= &amp;quot;localhost&amp;quot;, OPTIONAL dbusername AS String = &amp;quot;bainm&amp;quot; OPTIONAL&lt;br /&gt;
dbpassword AS String = &amp;quot;mypassword&amp;quot;)&lt;br /&gt;
WITH conn&lt;br /&gt;
.Type = dbtype&lt;br /&gt;
.Host = dbhost&lt;br /&gt;
.Login = dbusername&lt;br /&gt;
.Password = dbpassword&lt;br /&gt;
.Name = dbname&lt;br /&gt;
END WITH&lt;br /&gt;
TRY conn.Open&lt;br /&gt;
IF ERROR THEN&lt;br /&gt;
message (&amp;quot;Cannot Open Database. Error = &amp;quot; &amp;amp; Error.Text)&lt;br /&gt;
END IF&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь, даже если подсоединение к базе данных окажется по какой-то причине невозможным, приложение просто выдаст сообщение об&lt;br /&gt;
ошибке и продолжит работу. Не используя при этом базу данных,&lt;br /&gt;
разумеется.&lt;br /&gt;
&lt;br /&gt;
=== Используйте свойства ===&lt;br /&gt;
Если вам необходимо просто задавать и считывать значения, то вас полностью устроят обычные переменные. Но свойства (property) имеют особенности, которые порой делают их очень полезными. К ним относятся&lt;br /&gt;
функция _Read и подпрограмма _Write. Итак, попробуйте угадать, в&lt;br /&gt;
какой момент они выполняются?&lt;br /&gt;
Вот определение свойства Host:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC PROPERTY Host AS String&lt;br /&gt;
PRIVATE localHost AS String&lt;br /&gt;
PRIVATE FUNCTION Host_Read() AS String&lt;br /&gt;
IF (localHost = &amp;quot;&amp;quot;) THEN&lt;br /&gt;
localhost = &amp;quot;localhost&amp;quot;&lt;br /&gt;
END IF&lt;br /&gt;
RETURN localHost&lt;br /&gt;
END&lt;br /&gt;
PRIVATE SUB Host_Write(ipHost AS String)&lt;br /&gt;
localHost = ipHost&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Обратите внимание, единственным публичным элементом является&lt;br /&gt;
Host, всё остальное закрыто от пользователя этого модуля. Посмотрите,&lt;br /&gt;
как в функции Host_Read определяется значение для этого свойства по&lt;br /&gt;
умолчанию.&lt;br /&gt;
&lt;br /&gt;
=== Изучите параметры командной строки ===&lt;br /&gt;
В наших примерах все значения параметров (таких как название базы&lt;br /&gt;
данных или идентификатор пользователя) были зашиты внутри программы. Но вы не обязаны делать так же, если вам это не нравится.&lt;br /&gt;
Изменяющиеся значения можно запросто передавать в параметрах&lt;br /&gt;
командной строки. Конечно, вам придётся написать немножко кода, что-бы обработать их правильно. Всё, что вы набрали в командной строке&lt;br /&gt;
приложения Gambas, называется аргументом и хранится в массиве&lt;br /&gt;
Application.Args. Вот простой пример работы с ним (эту функцию можно поместить в модуль Startup).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC SUB Main()&lt;br /&gt;
input_variables_1&lt;br /&gt;
END&lt;br /&gt;
PRIVATE SUB input_variables_1()&lt;br /&gt;
DIM i AS Integer&lt;br /&gt;
FOR i = 1 TO application.Args.count&lt;br /&gt;
IF (Application.Args[i]) THEN&lt;br /&gt;
message (Application.Args[i])&lt;br /&gt;
END IF&lt;br /&gt;
NEXT&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Если затем вы создадите исполняемое приложение и запустите его&lt;br /&gt;
из консоли, передав несколько параметров командной строки, оно отобразит серию сообщений, по одному на каждый параметр. Это не самое&lt;br /&gt;
полезное приложение на свете, но оно даёт представление о том, с какой&lt;br /&gt;
стороны подходить к обработке параметров.&lt;br /&gt;
&lt;br /&gt;
Следующий пример немного более осмысленный. Эта программа&lt;br /&gt;
ожидает, что вы передадите ей два параметра (в нужном порядке),&lt;br /&gt;
и сохраняет их значения в глобальных переменных:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC TargetUrl AS String&lt;br /&gt;
PUBLIC Database AS String&lt;br /&gt;
PUBLIC SUB Main()&lt;br /&gt;
input_variables_2&lt;br /&gt;
message (TargetUrl &amp;amp; &amp;quot; &amp;quot; &amp;amp; Database)&lt;br /&gt;
END&lt;br /&gt;
PRIVATE SUB input_variables_2()&lt;br /&gt;
TargetUrl = Application.Args[1]&lt;br /&gt;
Database = Application.Args[2]&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Как я уже говорил, в данном случае порядок имеет значение. А вот&lt;br /&gt;
если вы используете флаги, то это уже не столь важно:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC TargetUrl AS String&lt;br /&gt;
PUBLIC Database AS String&lt;br /&gt;
PUBLIC SUB Main()&lt;br /&gt;
input_variables_3&lt;br /&gt;
message (TargetUrl &amp;amp; &amp;quot; &amp;quot; &amp;amp; Database)&lt;br /&gt;
END&lt;br /&gt;
PRIVATE SUB input_variables_3()&lt;br /&gt;
DIM i AS Integer&lt;br /&gt;
DIM j AS Integer&lt;br /&gt;
FOR i = 1 TO Application.Args.Count&lt;br /&gt;
SELECT CASE Application.Args[i]&lt;br /&gt;
CASE &amp;quot;-u&amp;quot;&lt;br /&gt;
TargetUrl=Application.Args[i+1]&lt;br /&gt;
CASE &amp;quot;-d&amp;quot;&lt;br /&gt;
Database=Application.Args[i+1]&lt;br /&gt;
END SELECT&lt;br /&gt;
NEXT&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Теперь вы можете вызвать своё приложение как '''myapp -u /localhost -d mysql''' или как '''myapp -d mysql -u /localhost''', результат при этом не изменится.&lt;br /&gt;
&lt;br /&gt;
=== Запуск Gambas без графического интерфейса пользователя ===&lt;br /&gt;
Я думаю, вы уже обратили на это внимание, когда читали предыдущую&lt;br /&gt;
хитрость – вы не обязаны использовать Gambas только для приложений&lt;br /&gt;
с графическим интерфейсом. Вы можете также создавать консольные&lt;br /&gt;
приложения или приложения командной строки. Фактически, при создании нового приложения Gambas вы должны указать, потребуется ли вам&lt;br /&gt;
графический интерфейс (по умолчанию считается, что потребуется).&lt;br /&gt;
&lt;br /&gt;
Если вы выберете создание консольного приложения, то обнаружите,&lt;br /&gt;
что в свойствах проекта папки Forms нет вообще – и это правильно, ведь&lt;br /&gt;
вам не нужен GUI. Но кроме всего прочего, это значит, что вам негде отображать информацию, кроме как в стандартном потоке вывода, на консоли.&lt;br /&gt;
&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=КЛИШЕ ПОНЕВОЛЕ&lt;br /&gt;
|Содержание=Прошу прощения за включение в&lt;br /&gt;
этот учебник набившего оскомину&lt;br /&gt;
примера «Hello World», но таковы&lt;br /&gt;
условия моего контракта: я должен&lt;br /&gt;
представить его хоть раз в каждом&lt;br /&gt;
цикле статей. Это очередная&lt;br /&gt;
директива Европарламента.&lt;br /&gt;
|Ширина=150px}}&lt;br /&gt;
Вот обязательная программа “Hello, World” на Gambas:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC SUB Main()&lt;br /&gt;
sayHello&lt;br /&gt;
END&lt;br /&gt;
PRIVATE SUB sayHello()&lt;br /&gt;
PRINT &amp;quot;Hello World&amp;quot;&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Консольные приложения могут использовать все компоненты&lt;br /&gt;
Gambas, кроме графических, конечно.&lt;br /&gt;
&lt;br /&gt;
Используйте INPUT, чтобы передать информацию в консольное&lt;br /&gt;
приложение.&lt;br /&gt;
&lt;br /&gt;
Мы с вами уже видели, как использовать в Gambas параметры&lt;br /&gt;
командной строки. Это прекрасно работает и с графическим интерфейсом, и с консольным приложением. В графической форме обычно есть&lt;br /&gt;
ещё и поля ввода для передачи приложению дополнительной информации. В консоли вы можете использовать в тех же целях оператор INPUT:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
PUBLIC SUB Main()&lt;br /&gt;
DIM m AS Float&lt;br /&gt;
m=doMultiply()&lt;br /&gt;
PRINT m&lt;br /&gt;
END&lt;br /&gt;
PRIVATE FUNCTION doMultiply() AS Float&lt;br /&gt;
DIM x AS Float&lt;br /&gt;
DIM y AS Float&lt;br /&gt;
PRINT &amp;quot;Enter x:&amp;quot;&lt;br /&gt;
INPUT x&lt;br /&gt;
PRINT &amp;quot;Enter y:&amp;quot;&lt;br /&gt;
INPUT y&lt;br /&gt;
RETURN x*y&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Превращение консольного приложения в графическое и наоборот ===&lt;br /&gt;
Когда Gambas задаёт вам вопрос, проект графического или консольного приложения ему создавать, вы вправе поинтересоваться – в чём&lt;br /&gt;
разница? Ответ прост – разница в одном единственном компоненте&lt;br /&gt;
Gambas – gb.qt. Если вы подключите его к проекту консольного приложения, то вам будет доступен графический интерфейс. И наоборот, если&lt;br /&gt;
в графическом проекте вы отключите gb.qt, то получите проект консольной программы.&lt;br /&gt;
Проще простого.&lt;br /&gt;
&lt;br /&gt;
==== Извлечение информации из файлов ====&lt;br /&gt;
В предыдущей статье мы рассматривали, как получить информацию из&lt;br /&gt;
базы данных. Посмотрим сегодня, как прочитать её из обычного файла.&lt;br /&gt;
Всё, что вам надо сделать – это открыть файл в одном из четырёх режимов: read (чтение), write (запись), create (создание) или append (дописывание в конец). Думаю, довольно просто догадаться, что делает каждый из этих методов, хотя разницу между записью и созданием стоит&lt;br /&gt;
уточнить. Режим записи write очистит и запишет заново уже существующий файл. Режим создания create может создать файл, если таковой&lt;br /&gt;
отсутствует, но если он уже есть – действует в точности как write. Вот&lt;br /&gt;
простой пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
DIM lLine AS String&lt;br /&gt;
DIM pFile AS File&lt;br /&gt;
OPEN &amp;quot;/etc/passwd&amp;quot; FOR READ AS #pFile&lt;br /&gt;
WHILE NOT Eof(pFile)&lt;br /&gt;
LINE INPUT #pFile, lLine&lt;br /&gt;
PRINT lLine&lt;br /&gt;
WEND&lt;br /&gt;
CLOSE #pFile&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот код читает файл /etc/passwd и отображает на экране его&lt;br /&gt;
содержимое.&lt;br /&gt;
&lt;br /&gt;
=== Используйте динамические массивы Gambas на всю катушку ===&lt;br /&gt;
Этот заголовок может немного ввести вас в заблуждение, ведь на самом&lt;br /&gt;
деле в Gambas любые массивы – динамические. Давайте рассмотрим,&lt;br /&gt;
как их можно использовать. Определение массива выглядит так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;DIM mArray AS NEW String[]&amp;lt;/source&amp;gt;&lt;br /&gt;
Здесь создаётся массив строк, не содержащий ни одного элемента.&lt;br /&gt;
Пока он остаётся пустым, вы не можете присваивать ему никаких значений. Например, вот так:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;mArray[0]=&amp;quot;some data&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
вы получите ошибку «Выход за границы массива» (out of&lt;br /&gt;
bounds). Вместо этого нужно использовать метод Add:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;mArray.Add(&amp;quot;some data&amp;quot;)&amp;lt;/source&amp;gt;&lt;br /&gt;
Это вызов добавить ещё один элемент в конец массива. Но вы так&lt;br /&gt;
же можете добавлять элементы с начала:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;mArray.Add(&amp;quot;put this on the first line&amp;quot;,0)&amp;lt;/source&amp;gt;&lt;br /&gt;
Этим способом можно вставить новый элемент в любую позицию в&lt;br /&gt;
массиве. Если у вас есть массив из десяти элементов, то следующий код&lt;br /&gt;
вставит еще один точно посередине:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;mArray.Add(&amp;quot;in the middle&amp;quot;,4)&amp;lt;/source&amp;gt;&lt;br /&gt;
Индексы массивов начинаются с нуля, поэтому элемент с индексом&lt;br /&gt;
4 станет пятым по счёту, а всего в массиве теперь будет 11 строк. Уверен,&lt;br /&gt;
что вы сразу же попробуете написать&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;mArray.Add(&amp;quot;to see what happens&amp;quot;,1004)&amp;lt;/source&amp;gt;&lt;br /&gt;
Gambas просто добавит новую строчку после последнего элемента.&lt;br /&gt;
&lt;br /&gt;
==== Быстрое измерение массива ====&lt;br /&gt;
Если уж мы говорим о числе элементов, то давайте зададимся вопросом – а насколько велик вот этот массив? Ответ прост. Массивы&lt;br /&gt;
Gambas имеют два свойства – mArray.count и mArray.length. Оба&lt;br /&gt;
этих свойства обозначают одно и то же и возвращают общее число&lt;br /&gt;
элементов в массиве.&lt;br /&gt;
&lt;br /&gt;
Вы можете использовать любое из них для того, чтобы перебрать&lt;br /&gt;
все элементы:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
DIM mArray AS NEW String[]&lt;br /&gt;
DIM i AS Integer&lt;br /&gt;
FOR i = 1 TO 10&lt;br /&gt;
mArray.Add(i)&lt;br /&gt;
NEXT&lt;br /&gt;
FOR i = 1 TO mArray.Count&lt;br /&gt;
message(mArray[i-1])&lt;br /&gt;
NEXT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот код просто создаёт массив из десяти элементов, а затем показывает каждый элемент в отдельном сообщении.&lt;br /&gt;
Вас может удивить, что в качестве индекса я использовал i-1, а не&lt;br /&gt;
i. Но, как я упоминал раньше, индексы массива начинаются с нуля, так&lt;br /&gt;
что в массиве с десятью элементами они нумеруются от 0 до 9, а не от&lt;br /&gt;
1 до 10. Если вам не нравится i-1, то можно использовать другой&lt;br /&gt;
способ:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
FOR i = 0 TO mArray.Count - 1&lt;br /&gt;
message(mArray[i])&lt;br /&gt;
NEXT&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
На этот раз мы начинаем с нуля и останавливаемся на индексе&lt;br /&gt;
номер mArray.Count – 1, т.е. на индексе номер девять (поскольку&lt;br /&gt;
mArray.Count равно десяти).&lt;br /&gt;
&lt;br /&gt;
==== Добавление нескольких элементов ====&lt;br /&gt;
Да, я знаю, что вы хотите сказать: вам вовсе не хочется добавлять элементы по-одному. Вы просто хотите сразу создать нужное число элементов, и затем заполнять их в том порядке, в каком сочтёте нужным. Нет&lt;br /&gt;
проблем!&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
DIM mArray AS NEW String[]&lt;br /&gt;
mArray.Resize(10)&lt;br /&gt;
mArray[5] = &amp;quot;some info&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этом примере я создал массив, определил его размер равным 10&lt;br /&gt;
элементам (при помощи метода Resize) и задал значение шестого по&lt;br /&gt;
счету элемента (обратите внимание, как я мужественно справился&lt;br /&gt;
с соблазном использовать Пятый элемент!).&lt;br /&gt;
&lt;br /&gt;
Интересно, что вы так же можете уменьшить размеры массива. Для&lt;br /&gt;
этого надо воспользоваться методами Resize или Remove. Как работает Resize вы можете догадаться, а Remove – это просто обратный&lt;br /&gt;
метод для Add, то есть он удаляет последний элемент или элемент с&lt;br /&gt;
индексом, который ему передали.&lt;br /&gt;
&lt;br /&gt;
==== Массив подсказок ====&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=ИСПОЛЬЗОВАНИЕ РАЗДЕЛИТЕЛЕЙ&lt;br /&gt;
|Содержание=Если вы сохраняете свои данные в&lt;br /&gt;
файле, вам потребуется какой-нибудь символ для отделения&lt;br /&gt;
различных секций друг от друга.&lt;br /&gt;
Запятая – довольно частый выбор,&lt;br /&gt;
но вам следует избегать ее: если&lt;br /&gt;
кто-нибудь случайно введет в&lt;br /&gt;
текстовое поле строку с запятой, в&lt;br /&gt;
вашей «базе данных» появится&lt;br /&gt;
лишнее поле. Используйте что-нибудь более редкое, например,&lt;br /&gt;
вертикальную черту ({{!}}).&lt;br /&gt;
|Ширина=200px}}&lt;br /&gt;
Существует несколько приятных методов, которые вы можете найти&lt;br /&gt;
очень полезными при использовании массивов Gambas. Первый из них – это Sort. Посмотрите на это:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
DIM mArray AS NEW Integer[]&lt;br /&gt;
DIM i AS Integer&lt;br /&gt;
FOR i = 1 TO 10&lt;br /&gt;
mArray.Add(i)&lt;br /&gt;
NEXT&lt;br /&gt;
mArray.Sort(gb.Descent)&lt;br /&gt;
PRINT (mArray[0])&lt;br /&gt;
mArray.Sort(gb.Ascent)&lt;br /&gt;
PRINT (mArray[0])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот код заполняет массив из десяти элементов цифрами от 1 до&lt;br /&gt;
10. Затем он сортирует его по убыванию и по возрастанию, отображая&lt;br /&gt;
на месте первого элемента 10 и 1 соответственно. Любопытно будет&lt;br /&gt;
посмотреть, что изменится, если заменить определение массива на&lt;br /&gt;
String[]. На этот раз программа выведет 9 и 1. Почему? Потому что&lt;br /&gt;
Gambas правильно определяет тип переменных в массиве, и сортирует&lt;br /&gt;
числа в арифметическом порядке, а строки – в лексикографическом.&lt;br /&gt;
Второй интересный метод массивов Gambas – это Reverse (обратить). Догадались, что он делает? И последний – это Find (найти). Вам&lt;br /&gt;
требуются объяснения? Думаю, нет. Давайте вместо этого просто разберём пример:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vb&amp;quot;&amp;gt;&lt;br /&gt;
DIM nArray AS NEW String[]&lt;br /&gt;
DIM dArray AS NEW String[]&lt;br /&gt;
DIM lArray AS NEW String[]&lt;br /&gt;
DIM lLine AS String&lt;br /&gt;
DIM pFile AS File&lt;br /&gt;
OPEN &amp;quot;/etc/passwd&amp;quot; FOR READ AS #pFile&lt;br /&gt;
WHILE NOT Eof(pFile)&lt;br /&gt;
LINE INPUT #pFile, lLine&lt;br /&gt;
lArray = Split (lLine,&amp;quot;:&amp;quot;)&lt;br /&gt;
nArray.Add(lArray[0])&lt;br /&gt;
dArray.Add(lArray[5])&lt;br /&gt;
WEND&lt;br /&gt;
CLOSE #pFile&lt;br /&gt;
PRINT dArray[nArray.Find(System.User)]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Этот пример использует код для чтения данных из файла, который&lt;br /&gt;
мы рассматривали раньше. На этот раз имена пользователей и их&lt;br /&gt;
домашние каталоги из /etc/passwd загружаются в массивы. В конце&lt;br /&gt;
по имени пользователя ищется соответствующий ему идентификатор,&lt;br /&gt;
а по нему в свою очередь отображается домашний каталог.&lt;br /&gt;
&lt;br /&gt;
Здесь есть только одна строчка кода, которую мне кажется нужным&lt;br /&gt;
объяснить: lArray = Split (lLine,&amp;quot;:&amp;quot;). Он разбивает строку lLine на&lt;br /&gt;
отдельные элементы, используя указанный разделитель (в данном случае – двоеточие. Обратите внимание на врезку «Советы» выше), а затем&lt;br /&gt;
загружает части строки в массив lArray.&lt;br /&gt;
&lt;br /&gt;
==== Сохранение пользовательских настроек ====&lt;br /&gt;
Теперь мы знаем, как получить доступ к параметрам командной строки&lt;br /&gt;
из приложения Gambas. Это позволит пользователю задавать режим&lt;br /&gt;
работы, если только он согласиться вводить целиком все опции каждый&lt;br /&gt;
раз, когда запускает нашу программу. Нельзя ли это автоматизировать?&lt;br /&gt;
Конечно, ключом к решению является конфигурационный файл, который&lt;br /&gt;
считывается при старте приложения. Затем значения, перечисленные в&lt;br /&gt;
конфигурационном файле, заменяют установки по умолчанию, принятые&lt;br /&gt;
в программе.&lt;br /&gt;
&lt;br /&gt;
=== А НАПОСЛЕДОК Я СКАЖУ... ===&lt;br /&gt;
Полный исходный код разрабатываемого в этом учебнике&lt;br /&gt;
приложения вы можете найти&lt;br /&gt;
на компакт-диске. Он сочетает&lt;br /&gt;
в себе все приемы и трюки,&lt;br /&gt;
которые мы обсуждали, и&lt;br /&gt;
показывает, насколько легкими становятся сложные задачи, если под рукой есть&lt;br /&gt;
Gambas.&lt;br /&gt;
&lt;br /&gt;
Мой последний совет - документируйте все, что вы&lt;br /&gt;
делаете. Это относится не&lt;br /&gt;
только к Gambas. Не пренебрегайте комментариями. То,&lt;br /&gt;
что кажется вам очень логичным в момент кодирования,&lt;br /&gt;
может перестать быть таковым, когда вы вернетесь к&lt;br /&gt;
своей работе через пару&lt;br /&gt;
недель. Впрочем, так происходит всегда и везде. Сейчас&lt;br /&gt;
у вас хотя бы есть Gambas,&lt;br /&gt;
который немного упростит&lt;br /&gt;
вашу жизнь.&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>