Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3489 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 8:

Операторы

< Лекция 7 || Лекция 8: 123456 || Лекция 9 >
Оператор LSet

Этот оператор служит для присвоения строк с одновременным выравниванием слева, а также для копирования записи одного определенного пользователем типа в запись другого типа. Его синтаксис:

Lset СтрПеременная = СтрВыражение
Lset переменная1 = переменная2

Здесь ключевое слово LSet обязательно, СтрПеременная - имя строковой переменной, СтрВыражение - выражение строкового типа. Во втором варианте переменная1 - имя переменной некоторого определенного пользователем типа, в которую выполняется копирование, переменная2 - имя переменной, возможно, другого пользовательского типа, значение которой копируется.

Результатом присвоения строк всегда является строка той же длины, что и у СтрПеременная. Если при этом СтрВыражение короче, добавляются пробелы справа; длиннее - лишние символы справа удаляются.

При втором варианте оператора двоичное представление записи из участка памяти, отведенного переменной2 копируется в участок памяти, отведенный переменной1, - При этом данные не преобразуются в соответствии с типами элементов (полей) записи, и если типы соответствующих элементов обеих записей не совпадают, результат операции трудно предсказать (часто выдается сообщение о несоответствии типов). Поэтому этот вариант следует использовать, лишь тогда, когда типы всех соответствующих элементов записей совпадают и имеют одинаковый размер.

Примеры.

Public Sub Assign2()
	Dim Str1 As String, Str2 As String
		
	Str1 = "0123456789" ' Начальное значение
	Str2 = "abcd"
	Debug.Print Str1, Str2

	LSet Str2 = Str1		' Результат - "0123"
	LSet Str1 = "	Влево"	' Результат -	"	Влево
	Debug.Print Str1, Str2

End Sub"

Вот результаты отладочной печати:

0123456789		abcd
	Влево		0123

В следующем примере происходит корректное копирование одной записи в другую; типы соответствующих элементов в определенных пользователем типах MyType1 и MyType2 совпадают:

Type MyType1
	age As Integer
	cost As Long
End Type

Type MyType2
	year As Integer
	pay As Long
	'pay As Integer
End Type

Public Sub Assign3()
	Dim my1 As MyType1
	Dim my2 As MyType2

	my1.age = 50
	my1.cost = 45666

	my2.year = 1997
	my2.pay = 22000
	Debug.Print my1.age, my1.cost, my2.pay, my2.year
		
	LSet my2 = my1
	' после этого присвоения my2.year=50 и my2.pay=45666
	Debug.Print my1.age, my1.cost, my2.pay, my2.year

End Sub

Вот результаты отладочной печати:

50				45666			22000			1997 
50				45666			45666			50

Если изменить тип элемента pay в MyType2 на Integer, то будет напечатано значение my2.pay, равное 0.

Оператор RSet

Этот оператор присваивает значение строковой переменной с выравниванием справа:

RSet	СтрПеременная =	СтрВыражение

СтрПеременная - имя строковой переменной, СтрВыражение - выражение строкового типа. В отличие от LSet оператор RSet нельзя использовать для копирования переменных записей. Результатом присвоения строк всегда является строка той же длины, что и СтрПеременная. Если при этом СтрВыражение короче, добавляются пробелы слева, длиннее - лишние символы слева удаляются.

Примеры:

Public Sub Assign4()
	Dim Str1, Str2, Str3
		
	Str1 = "0123456789"             ' Начальное значение
	Str2 = "abcd"
	Debug.Print Str1, Str2
		
	RSet Str2 = Str1                ' Результат - "0123"
	RSet Str1 = "Вправо "           ' Результат -	"	Вправо "
	RSet Str3 = Str1                ' Результат - пустая строка ""
	Debug.Print Str1, Str2, Str3
End Sub

Вот результаты отладочной печати:

0123456789		abcd
	Вправо		0123
Оператор Set

Этот оператор применим при работе с объектами, устанавливает ссылку на вновь созданный или существующий объект. Его синтаксис:

Set ОбПеременная = {[New] ОбВыражение| Nothing}

ОбПеременная - имя переменной или свойства, New - необязательное ключевое слово, используемое для явного вызова операции создания нового экземпляра класса (объекта). Если ОбПеременная содержала ссылку на объект, при присвоении эта ссылка освободится. ОбВыражение может быть именем объекта (класса), другой переменной того же типа, функцией или методом, возвращающими объект соответствующего типа. Выполнение оператора Set с правой частью Nothing прерывает связь между ОбПеременной и объектом, на который она ссылалась. Если при этом на него не осталось других ссылок, ресурсы системы и память, выделенные под этот объект, освобождаются. В общем случае, если ключевое слово New не указано, новая копия объекта не создается, а ОбПеременная как значение получает ссылку на существующий объект. При этом может оказаться, что несколько переменных ссылаются на один объект и изменение этого объекта через одну из них влияет на все остальные.

Примеры:

Определим класс объектов Child:

'Класс Child
'Свойства
Public Age As Byte
Public Name As String
'Другие свойства и методы пока не определены

А теперь введем объекты этого класса:

Public Sub Assign5()
	Dim Children(1 To 2) As Child
	Dim Boy As Child, Girl As Child
		
	'Создаем объекты
	Set Children(1) = New Child
	Set Children(2) = New Child
	'Инициализируем их
	Children(1).Age = 10
	Children(1).Name = "Александр"
	Children(2).Age = 7
	Children(2).Name = "Мария"
	Debug.Print "Имя: ", Children(1).Name, "Возраст: ", Children(1).Age
	Debug.Print "Имя: ", Children(2).Name, "Возраст: ", Children(2).Age
		
	'Утанавливаем дополнительные ссылки на существующие объекты
	Set Boy = Children(1)
	Set Girl = Children(2)
	Boy.Name = "Саша"
	Girl.Name = "Маша"
	'Изменились сввойства объектов
	Debug.Print "Имя: ", Children(1).Name, "Возраст: ", Children(1).Age
	Debug.Print "Имя: ", Children(2).Name, "Возраст: ", Children(2).Age
		
	'Удаляем одну из ссылок, но объект остается
	Set Children(1) = Nothing
	Set Children(2) = Nothing
	Debug.Print "Имя: ", Boy.Name, "Возраст: ", Boy.Age
	Debug.Print "Имя: ", Girl.Name, "Возраст: ", Girl.Age

End Sub
7.1.

Вот результаты отладочной печати:

Имя:				Александр		Возраст:			10 
Имя:				Мария			Возраст:			7 
Имя:				Саша			Возраст:			10 
Имя:				Маша			Возраст:			7 
Имя:				Саша			Возраст:			10 
Имя:				Маша			Возраст:			7
< Лекция 7 || Лекция 8: 123456 || Лекция 9 >
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.