Читайте также:
|
|
Название | Описание |
DragDrop | Событие, возникающее по окончании операции перетаскивания элемента. |
DragOver | Событие, которое выполняется в случае, когда элемент находится над объектом-адресатом (при этом операция перетаскивания еще не завершена). |
DragMode | Свойство устанавливает режим перетаскивания элемента: · Manual (ручной); · Automatic (автоматический). |
Draglcon | Свойство задаёт изображение элемента при его перетаскивании. |
Drag | Метод, используемый для начала и окончания операции перетаскивания (перед этим необходимо установить DragMode = 0). |
Если установлен ручной режим перемещения (DragMode = 0), то в этом случае операция может быть выполнена только при помощи метода Drag. При автоматическом режиме возможно перетаскивание элемента без использования Drag.
Событие DragDrop, возникающее при завершении операции, имеет следующие параметры:
- DragDrop (Source As Control, X As Single, Y As Single), где Source As Control - ссылка на элемент-источник;
- X As Single, Y As Single - координаты точки объекта-адресата, в которой отпускается кнопка мыши по окончании операции.
Метод Drag имеет один параметр - Action, определяющий то или иное состояние выполняемого перетаскивания. В таблице приведены значения параметра Action метода Drag:
Константа | Значение | Описание |
vbCancel | Отмена операции | |
vbBeginDrag | Начало перетаскивания | |
vbEndDrag | Окончание операции |
Пример 1: Имитация действия Корзины путём перетаскивания в неё объекта. Восстановление объекта происходит при двойном щелчке по корзине.
В качестве корзины и объекта будем использовать элементы управления Image. В качестве рисунков пустой и полной корзины можно использовать файлы с расширением.ICO, в качестве объекта для перемещения – рисунок мяча. Соответствующие рисунки нужно скопировать в папку с данным проектом. При запуске приложения корзина изображена пустой, затем в Image будет загружен рисунок с изображением полной корзины методом LoadPicture <Рисунок1>.
Рисунок 1
Интерфейс проекта:
На форме разместить метку Label1 (Положи мяч в корзину), кнопку Command1 (Выход), 2 элемента управления Image (в один поместить изображение мяча, в другой – пустой корзины).
Обозначения:
· Mx, My – координаты перемещаемого объекта;
· P – переменная логического типа, определяющая, пустая корзина или полная.
Dim Mx, My As Single, P As Boolean
Private Sub Form_Load() ‘загрузка формы
P = False ‘признак пустой корзины
End Sub
Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then ‘если нажата левая кнопка мыши
Call Image1.Drag(vbBeginDrag) ‘начало перетаскивания
Mx = X
My = Y
End If
End Sub
Private Sub Image2_DragDrop(Source As Control, X As Single, Y As Single) ‘завершение перетаскивания объекта в корзину
Source.Visible = False ‘мяч стал невидим
P = True ‘признак полной корзины
Image2.Picture = LoadPicture("LEO4.ICO") ‘рисунок полной корзины
Label1.Caption = "Достань мяч из корзины!!!" ‘изменили надпись в метке
End Sub
Private Sub Image2_DblClick() 'извлечение объекта из корзины
Image1.Visible = True ‘мяч стал видимым
P = False ‘признак пустой корзины
Image2.Picture = LoadPicture("LEO3.ICO") ‘загрузить рисунок пустой корзины
Label1.Caption = "Положи мяч в корзину!" ‘изменить надпись в метке
End Sub
‘Завершение перетаскивания объекта на форме с учётом поправки (необязательная процедура)
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
SourceMove (X - Mx), (Y - My)
End Sub
При автоматическом перетаскивании элемента по форме при завершении операции его левый верхний угол будет находиться в той точке, где располагался указатель при отпускании кнопки мыши, независимо от того, где он находился на элементе в начале перетаскивания. Для того, чтобы конечное расположение совпадало с контуром, который отображается по умолчанию при перетаскивании (или с изображением, установленным в свойстве DragIcon), необходимо ввести поправку. После установления ручного режима становится возможным определение координат точки, в которой находился указатель в начале перетаскивания путём обработки события MouseDown для соответствующего элемента, что позволяет откорректировать параметры метода Move. [1]
ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ:
1. Создание простейших игр.
2. Введение собственных координат и масштаба.
ИСПОЛЬЗУЕМАЯ ЛИТЕРАТУРА:
1. Вирт Н. Алгоритмы и структуры данных. –М.: Мир, 2001.
2. Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы. Построение и анализ. –М.: МЦНМО, 2000.
3. Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и алгоритмы. –М.: Вильямс, 2000.
4. Голицына О.Л., Попов И.И. Основы алгоритмизации и программирования. –М.: Форум, 2008.
16)аналогично в vb Var Temp,k: integer;Begin
AssignFile(f,1.txt);
Resetf(f);
K:=0;
While not EOF(f) do
Begin
Read(f,1.txt);
If temp = (then begin
K:=k+1;
17)
Написать программу обработки кольцевого списка из N лементов, решающую задачу Джозефуса. Задача представляет собой своего рода считалку: элементы становятся в круг, вводится некоторое число k. Необходимо, начиная с первого, отсчитать k-й элемент списка и удалить его. Далее отсчет начинается с (k+1)-го элемента и опять удаляется k-ый. Так продолжается до тех пор, пока в списке не останется один элемент. Выдать содержимое последнего элемента.
var
n,k,i: integer;
s: string;
begin
n:=50; // количество элементов, max 255
for i:=1 to n do
s:=s+chr(i);
k:=12; // номер элемента, который удаляем
i:=1;
repeat
i:=i+k-1;
while i > n do i:=i-n;
delete(S,i,1);
n:=length(s);
until n <= 1;
Edit1.Text:=IntToStr(ord(s[n]));
end;
18) Процедура или функция может содержать вызов других процедур или функций. В том числе процедура может вызвать саму себя. Никакого парадокса здесь нет – компьютер лишь последовательно выполняет встретившиеся ему в программе команды и, если встречается вызов процедуры, просто начинает выполнять эту процедуру. Без разницы, какая процедура дала команду это делать.
Пример рекурсивной процедуры:
procedure Rec(a: integer); begin if a>0 then Rec(a-1); writeln(a); end; |
Рассмотрим, что произойдет, если в основной программе поставить вызов, например, вида Rec(3). Ниже представлена блок-схема, показывающая последовательность выполнения операторов.
Рис. 1. Блок схема работы рекурсивной процедуры.
Процедура Rec вызывается с параметром a = 3. В ней содержится вызов процедуры Rec с параметром a = 2. Предыдущий вызов еще не завершился, поэтому можете представить себе, что создается еще одна процедура и до окончания ее работы первая свою работу не заканчивает. Процесс вызова заканчивается, когда параметр a = 0. В этот момент одновременно выполняются 4 экземпляра процедуры. Количество одновременно выполняемых процедур называют глубиной рекурсии.
Четвертая вызванная процедура (Rec(0)) напечатает число 0 и закончит свою работу. После этого управление возвращается к процедуре, которая ее вызвала (Rec(1)) и печатается число 1. И так далее пока не завершатся все процедуры. Результатом исходного вызова будет печать четырех чисел: 0, 1, 2, 3.
Еще один визуальный образ происходящего представлен на рис. 2.
Рис. 2. Выполнение процедуры Rec с параметром 3 состоит из выполнения процедуры Rec с параметром 2 и печати числа 3. В свою очередь выполнение процедуры Rec с параметром 2 состоит из выполнения процедуры Rec с параметром 1 и печати числа 2. И т. д.
В качестве самостоятельного упражнения подумайте, что получится при вызове Rec(4). Также подумайте, что получится при вызове описанной ниже процедуры Rec2(4), где операторы поменялись местами.
procedure Rec2(a: integer); begin writeln(a); if a>0 then Rec2(a-1); end; |
Обратите внимание, что в приведенных примерах рекурсивный вызов стоит внутри условного оператора. Это необходимое условие для того, чтобы рекурсия когда-нибудь закончилась. Также обратите внимание, что сама себя процедура вызывает с другим параметром, не таким, с каким была вызвана она сама. Если в процедуре не используются глобальные переменные, то это также необходимо, чтобы рекурсия не продолжалась до бесконечности.
Дата добавления: 2015-07-11; просмотров: 145 | Нарушение авторских прав