Пишем игру Минер. Обработка событий ActiveX в 1С
Разработка - Практика программирования
Открываем и создаем проект аналогично описаном в предыдущей статье //firstportal.ru/public/625457/.
Для хранения изображений колоды карт будем использовать компонент TImage. Кидаем его на форму и подгружаем изображения. Свойство Visible = false
Открываем Type Library и добавляем 3 метода:
AddCell - добавляем ячейку
ChangeImage - поменять ячейку
ClearResource - Очищаем ресурсы с формы
Добавляем СОБЫТИЕ
Кодим:
Создаем класс
TCell = class
Public
Image : TImage;
Row: Integer;
Column: Integer;
Par : Tw0rmMine;
NameClass : string;
Procedure OnRightClickImage(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Constructor Create(x, y, iRow, iCol : Integer; iName: string);
End;
procedure Tw0rmMine.MyEvent(Row, Column: Integer; Button, Name: string);
begin
if FEvents <> nil then FEvents.OnClickCell(Row, Column, Button, Name);
end;
{ TCell }
constructor TCell.Create(x, y, iRow, iCol: Integer; iName: string);
begin
x := x;
y := y;
Row := iRow;
Column := iCol;
NameClass := iName
end;
procedure TCell.OnRightClickImage(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Butt : String;
begin
if Button = controls.mbRight then
begin
Butt := 'btRight';
end;
if Button = controls.mbLeft then
begin
Butt := 'btLeft';
end;
Par.MyEvent(Row, Column, Butt, NameClass); //!!!-ГЕНЕРИРУЕМ СОБЫТИЕ ДЛЯ 1С
end;
//Прорисовываем ячейку
procedure Tw0rmMine.AddCell(x, y, Row, Column: Integer;
const Name: WideString);
var
Cell : TCell;
const
h=30; //Высота изображения
begin
Cell := TCell.Create(x,y,Row,Column, Name);
cell.Image := TImage.Create(Self);
cell.Image.Parent:= Self;
cell.Image.Left:=x;
cell.Image.Top:=y;
cell.Image.Width:=h;
cell.Image.Height:=h;
cell.Image.Name := Name;
cell.Image.Canvas.CopyRect(Rect(0, 0, h, h), Image1.Canvas, Rect(column*h ,row*h, (column*h)+h, (row*h)+h));
cell.Image.OnMouseDown := cell.OnRightClickImage;
cell.Par := Self;
end;
//Меняем изображение в ячейке
procedure Tw0rmMine.ChangeImage(const Name: WideString; Row,
Column: Integer);
Var
img : TImage;
const
h=30; //Высота изображения
begin
img:=(FindComponent(Name)) as Timage;
img.Canvas.CopyRect(Rect(0, 0, h, h), Image1.Canvas, Rect(column*h ,row*h, (column*h)+h, (row*h)+h));
end;
//Очищаем ресурсы
procedure Tw0rmMine.ClearResource;
var i : integer;
begin
for i:= ComponentCount-1 downto 0 do
begin
If Components[i].Name <> 'Image1' then Components[i].Free;
end;
end;
Регистрируем компоненту.
Открываем 1С создаем обработку. Накидываем контролы. Видим, что появилось наше событие:
Кодим:
Перем МассивЯчеек;
Перем МассивИменЯчеек;
Перем МассивСостояниеЯчейки;
Перем МассивСостоянияФлагаЯчейки;
Перем ИдМины;
Процедура КнопкаВыполнитьНажатие(Кнопка)
ЭлементыФормы.ЭлементУправления1.AddCell(0,0,1,2, "s1");
ЭлементыФормы.ЭлементУправления1.AddCell(0,30,0,0, "s2");
КонецПроцедуры
Процедура ЭлементУправления1OnClickCell(Элемент, Row, Column, Button, Name)
СпецификацияЯчейки = СтрЗаменить(Name, "_", Символы.ПС);
Строк = Число(СтрПолучитьСтроку (СпецификацияЯчейки, 2)) - 1;
Колонка = Число(СтрПолучитьСтроку (СпецификацияЯчейки, 3))-1;
Если МассивСостояниеЯчейки[Строк][Колонка] =1 Тогда
Возврат;
КонецЕсли;
Если Button = "btLeft" Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк, Колонка, Name);
Если МассивЯчеек[Строк][Колонка] = 0 Тогда
ОбработатьПустуюЯчейку(Строк, Колонка);
Выход = Ложь;
Пока Выход = Ложь Цикл
Выход = Истина;
Для а = 0 по КоличествоСтрок-1 Цикл
Для б = 0 по КоличествоКолонок-1 Цикл
Если МассивСостояниеЯчейки[а][б] = 99 Тогда
ОбработатьПустуюЯчейку(а, б);
МассивСостояниеЯчейки[а][б] = 1;
Выход = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецЕсли;
МассивСостояниеЯчейки[Строк][Колонка] = 1;
КонецЕсли;
Если Button = "btRight" Тогда
МассивСостоянияФлагаЯчейки[Строк][Колонка] = МассивСостоянияФлагаЯчейки[Строк][Колонка] + 1;
Если МассивСостоянияФлагаЯчейки[Строк][Колонка] > 2 Тогда
МассивСостоянияФлагаЯчейки[Строк][Колонка] = 0;
КонецЕсли;
ОбработатьГрафическийВыводПраваяКнопка(Строк, Колонка, Name);
КонецЕсли;
ПроверитьИгру();
КонецПроцедуры
Процедура ПриОткрытии()
КоличествоКолонок = 10;
КоличествоСтрок = 10;
КоличествоМин = 10;
КонецПроцедуры
Процедура СтартНажатие(Элемент)
ЭлементыФормы.КомпонентПоле.ClearResource();
ИнициализироватьПоле();
ПрорисоватьПоле();
ИдБомбы = 999;
КонецПроцедуры
Процедура ИнициализироватьПоле()
МассивЯчеек = Новый Массив(КоличествоСтрок, КоличествоКолонок);
МассивСостояниеЯчейки = Новый Массив(КоличествоСтрок, КоличествоКолонок);
МассивСостоянияФлагаЯчейки = Новый Массив(КоличествоСтрок, КоличествоКолонок);
//Инициализируем массив
Для а = 0 по КоличествоСтрок-1 Цикл
Для б = 0 по КоличествоКолонок-1 Цикл
МассивЯчеек[а][б] = 0;
МассивСостояниеЯчейки[а][б] = 0;
МассивСостоянияФлагаЯчейки[а][б] =0;
КонецЦикла;
КонецЦикла;
//Расставляем мины
Для ии = 1 По КоличествоМин Цикл
МинаРасставлена = Ложь;
Пока МинаРасставлена = Ложь Цикл
Колонка = ПолучитьСлучайноеЧисло(0, КоличествоСтрок-1);
Ряд = ПолучитьСлучайноеЧисло(0, КоличествоКолонок-1);
Если МассивЯчеек[Ряд][Колонка] = 0 Тогда
МассивЯчеек[Ряд][Колонка] = ИдМины; //Ид мины в маасиве
МинаРасставлена = Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
//Обрабатываем поле
Для а = 0 по КоличествоСтрок-1 Цикл
Для б = 0 по КоличествоКолонок-1 Цикл
Если МассивЯчеек[а][б] = 0 Тогда
МассивЯчеек[а][б] = ПроверитьЯчейку(а,б);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПрорисоватьПоле()
игрек = 0;
МассивИменЯчеек = Новый Массив(КоличествоСтрок, КоличествоКолонок);
Для а = 0 по КоличествоСтрок-1 Цикл
икс = 0;
Для б = 0 по КоличествоКолонок-1 Цикл
имя = "Cell_" + СокрЛП(Формат(Число(а+1),"ЧГ=")) + "_" + СокрЛП(Формат(Число(б+1),"ЧГ="));
МассивИменЯчеек[а][б] = имя;
ЭлементыФормы.КомпонентПоле.AddCell(икс, игрек, 0, 0, имя);
икс = икс + 30;
КонецЦикла;
игрек = игрек +30;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьСлучайноеЧисло(Мин,Макс)
//вместо Randomize
Для н = 1 По 100 Цикл
Уник = Новый УникальныйИдентификатор;
КонецЦикла;
//генерируем GUID
Уник = СокрЛП(Новый УникальныйИдентификатор);
//оставляем только цифры
Уник = СтрЗаменить(Уник,"-","");
Уник = СтрЗаменить(Уник,"a","");
Уник = СтрЗаменить(Уник,"b","");
Уник = СтрЗаменить(Уник,"c","");
Уник = СтрЗаменить(Уник,"d","");
Уник = СтрЗаменить(Уник,"e","");
Уник = СтрЗаменить(Уник,"f","");
//знаменатель должен иметь такое же количество нулей + 1
Знаменатель = 10;
Для н = 2 По (СтрДлина(СтрЗаменить(Уник,Символы.НПП,""))) Цикл
Знаменатель = Знаменатель * 10;
КонецЦикла;
Случ = Число(Уник) / Знаменатель; //здесь получается дробное случайное число от 0 до 1
//преобразуем его в случайное число из заданного интервала, округляем до целого
ЧислоИзИнтервала = Мин(Макс(Окр(Мин + (Макс-Мин)*Случ),Мин),Макс);
Возврат ЧислоИзИнтервала;
КонецФункции
Функция ПроверитьЯчейку(Строк, Колонка)
счетчик = 0;
Если Строк-1 >= 0 и Колонка-1 >=0 Тогда
Если МассивЯчеек[Строк-1][Колонка-1] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Колонка-1 >=0 Тогда
Если МассивЯчеек[Строк][Колонка-1] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Строк+1 < КоличествоСтрок и Колонка-1 >=0 Тогда
Если МассивЯчеек[Строк+1][Колонка-1] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Строк-1 >=0 Тогда
Если МассивЯчеек[Строк-1][Колонка] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Строк+1 <КоличествоСтрок Тогда
Если МассивЯчеек[Строк+1][Колонка] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Строк-1 >=0 и Колонка+1 < КоличествоКолонок Тогда
Если МассивЯчеек[Строк-1][Колонка+1] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Колонка+1 < КоличествоКолонок Тогда
Если МассивЯчеек[Строк][Колонка+1]= ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Если Строк+1 < КоличествоСтрок и Колонка+1 < КоличествоКолонок Тогда
Если МассивЯчеек[Строк+1][Колонка+1] = ИдМины Тогда
счетчик = счетчик + 1;
КонецЕсли;
КонецЕсли;
Возврат(счетчик);
КонецФункции
Процедура ОбработатьПустуюЯчейку(Строк, Колонка)
МассивСостояниеЯчейки[Строк][Колонка] = 1;
Если Строк-1 >= 0 и Колонка-1 >=0 Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк-1, Колонка-1, МассивИменЯчеек[Строк-1][Колонка-1]);
Если МассивЯчеек[Строк-1][Колонка-1] = 0 и МассивСостояниеЯчейки[Строк-1][Колонка-1] <> 1 Тогда
МассивСостояниеЯчейки[Строк-1][Колонка-1] = 99;
Иначе
МассивСостояниеЯчейки[Строк-1][Колонка-1] = 1;
КонецЕсли;
КонецЕсли;
Если Колонка-1 >=0 Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк, Колонка-1, МассивИменЯчеек[Строк][Колонка-1]);
Если МассивЯчеек[Строк][Колонка-1] = 0 и МассивСостояниеЯчейки[Строк][Колонка-1] <> 1 Тогда
МассивСостояниеЯчейки[Строк][Колонка-1] = 99;
Иначе
МассивСостояниеЯчейки[Строк][Колонка-1] = 1;
КонецЕсли;
КонецЕсли;
Если Строк+1 < КоличествоСтрок и Колонка-1 >=0 Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк+1, Колонка-1, МассивИменЯчеек[Строк+1][Колонка-1]);
Если МассивЯчеек[Строк+1][Колонка-1] = 0 и МассивСостояниеЯчейки[Строк+1][Колонка-1] <> 1 Тогда
МассивСостояниеЯчейки[Строк+1][Колонка-1] = 99;
Иначе
МассивСостояниеЯчейки[Строк+1][Колонка-1] = 1;
КонецЕсли;
КонецЕсли;
Если Строк-1 >=0 Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк-1, Колонка, МассивИменЯчеек[Строк-1][Колонка]);
Если МассивЯчеек[Строк-1][Колонка] = 0 и МассивСостояниеЯчейки[Строк-1][Колонка] <> 1 Тогда
МассивСостояниеЯчейки[Строк-1][Колонка] = 99;
Иначе
МассивСостояниеЯчейки[Строк-1][Колонка] = 1;
КонецЕсли;
КонецЕсли;
Если Строк+1 <КоличествоСтрок Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк+1, Колонка, МассивИменЯчеек[Строк+1][Колонка]);
Если МассивЯчеек[Строк+1][Колонка] = 0 и МассивСостояниеЯчейки[Строк+1][Колонка] <> 1 Тогда
МассивСостояниеЯчейки[Строк+1][Колонка] = 99;
Иначе
МассивСостояниеЯчейки[Строк+1][Колонка] = 1;
КонецЕсли;
КонецЕсли;
Если Строк-1 >=0 и Колонка+1 < КоличествоКолонок Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк-1, Колонка+1, МассивИменЯчеек[Строк-1][Колонка+1]);
Если МассивЯчеек[Строк-1][Колонка+1] = 0 и МассивСостояниеЯчейки[Строк-1][Колонка+1] <> 1 Тогда
МассивСостояниеЯчейки[Строк-1][Колонка+1] = 99;
Иначе
МассивСостояниеЯчейки[Строк-1][Колонка+1] = 1;
КонецЕсли;
КонецЕсли;
Если Колонка+1 < КоличествоКолонок Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк, Колонка+1, МассивИменЯчеек[Строк][Колонка+1]);
Если МассивЯчеек[Строк][Колонка+1]= 0 и МассивСостояниеЯчейки[Строк][Колонка+1] <> 1 Тогда
МассивСостояниеЯчейки[Строк][Колонка+1] = 99;
Иначе
МассивСостояниеЯчейки[Строк][Колонка+1] = 1;
КонецЕсли;
КонецЕсли;
Если Строк+1 < КоличествоСтрок и Колонка+1 < КоличествоКолонок Тогда
ОбработатьГрафическийВыводЛеваяКнопка(Строк+1, Колонка+1, МассивИменЯчеек[Строк+1][Колонка+1]);
Если МассивЯчеек[Строк+1][Колонка+1] = 0 и МассивСостояниеЯчейки[Строк+1][Колонка+1] <> 1 Тогда
МассивСостояниеЯчейки[Строк+1][Колонка+1] = 99;
Иначе
МассивСостояниеЯчейки[Строк+1][Колонка+1] = 1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьГрафическийВыводЛеваяКнопка(Строк, Колонка, Name)
Если МассивЯчеек[Строк][Колонка] = ИдМины Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 4, 0);
Предупреждение("Вы проиграли!");
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 0 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 4, 1);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 1 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 1, 0);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 2 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 1, 1);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 3 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 1, 2);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 4 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 2, 0);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 5 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 2, 1);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 6 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 2, 2);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 7 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 3, 0);
КонецЕсли;
Если МассивЯчеек[Строк][Колонка] = 8 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 3, 1);
КонецЕсли;
МассивСостоянияФлагаЯчейки[Строк][Колонка] =0;
КонецПроцедуры
Процедура ОбработатьГрафическийВыводПраваяКнопка(Строк, Колонка, Name)
Если МассивСостоянияФлагаЯчейки[Строк][Колонка] = 0 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 0, 0);
КонецЕсли;
Если МассивСостоянияФлагаЯчейки[Строк][Колонка] = 1 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 0, 1);
КонецЕсли;
Если МассивСостоянияФлагаЯчейки[Строк][Колонка] = 2 Тогда
ЭлементыФормы.КомпонентПоле.ChangeImage(Name, 0, 2);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьИгру()
сч = 0;
Для а = 0 по КоличествоСтрок-1 Цикл
Для б = 0 по КоличествоКолонок-1 Цикл
Если МассивЯчеек[а][б] = ИдМины и МассивСостоянияФлагаЯчейки[а][б] =1 Тогда
сч = сч + 1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если сч = КоличествоМин Тогда
Предупреждение("Вы победили");
КонецЕсли;
КонецПроцедуры
Специальные предложения
См. также
Полезные процедуры и функции для программиста 140
07.10.2019 8992 HostHost 23
Таблица значений. Нюансы 191
01.10.2019 8539 Yashazz 35
[Шпаргалка] Программное создание элементов формы 283
06.09.2019 9809 rpgshnik 41
Агрегатные функции СКД, о которых мало кто знает 342
05.09.2019 13065 ids79 44
Отслеживание выполнения фонового задания 141
17.08.2019 10497 ids79 16
Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив 253
08.08.2019 14162 ids79 30
СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты 131
26.07.2019 12736 ids79 6
Обработчики событий при записи объектов. Зачем и что за чем? 202
25.07.2019 12814 4 AlbinaAAA 23
Управление качеством кода 136
22.07.2019 8262 Stepa86 29
СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ 147
17.07.2019 11221 ids79 27
Регистры сведений. За кулисами 129
09.07.2019 8774 YPermitin 12
"Меньше копипаста!", или как Вася универсальную процедуру писал 183
04.07.2019 7975 SeiOkami 49
Создание отчетов с помощью СКД - основные понятия и элементы 208
25.06.2019 21056 ids79 17
Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 179
11.06.2019 12722 dmurk 134
Регистры накопления. Структура хранения в базе данных 176
16.05.2019 19039 YPermitin 27
Выполнение внешней обработки в фоновом задании 149
11.05.2019 11309 Eret1k 23
Выгрузка документа по условию 5
25.04.2019 6102 m-rv 2
Как прикрутить ГУИД к регистру сведений 23
16.04.2019 8731 m-rv 16
О расширениях замолвите слово... 193
07.04.2019 17853 ellavs 122
Git-репозитории для 1С-кода (опыт использования при небольших проектах) 202
28.03.2019 13974 ellavs 83
Трюки с внешними источниками данных 166
14.03.2019 14273 YPermitin 52
Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 166
03.02.2019 17349 ids79 9
Разработка и сценарное тестирование с Vanessa-ADD. Концепция, теория и сквозной пример создания сценария 222
09.01.2019 27596 Vladimir Litvinenko 69
EnterpriseData – часть 2. Процесс выгрузки данных 127
26.12.2018 13813 ids79 27
Новый подход к обмену данными EnterpriseData 207
14.12.2018 23188 ids79 72
Программное заполнение пользовательских параметров и отборов СКД 136
13.11.2018 22187 Unk92 19
Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 127
10.11.2018 22286 ids79 40
Вспомогательные инструкции в коде 1С 105
15.10.2018 21529 tormozit 100
Произвольный код в фоновом режиме 165
03.09.2018 15757 nikita0832 42
Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 147
23.08.2018 22915 Rain88 42
Тестер: частые вопросы 156
25.07.2018 21000 grumagargler 24
Повышаем эффективность разработки правил обмена 124
25.06.2018 20246 olegtymko 47
Введение в механизм представлений в ЗУП ред. 3 156
04.06.2018 25624 xrrg 82
Как сделать запрос на изменение данных 75
01.06.2018 22167 m-rv 21
Строим графы средствами 1С (без GraphViz) 43
23.05.2018 17960 slozhenikin_com 19
Распределение расходов пропорционально продажам 9
13.05.2018 12065 Rustig 9
Просмотр временных таблиц запроса в отладчике без изменения кода 129
24.04.2018 26538 [email protected] 19
[ВсеПросто] "Оперативный" информатор из 1С за 5 мин. 198
22.02.2018 21455 DarkAn 25
Минимализмы 3 355
19.02.2018 37137 ildarovich 44
Этюды по программированию. Взаимодействие с Microsoft Word 109
11.12.2017 26564 milkers 23
Метод формирования движений в типовых регистрах нетиповыми регистраторами 31
05.12.2017 21996 itriot11 34
1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 737
19.11.2017 142816 MaxS 251
Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131
01.11.2017 23734 slava_1c 49
Программные перечисления, ч.2: приемы кэширования при разработке 67
30.10.2017 22061 unichkin 18
Разбираемся с настройками компоновки данных 161
29.10.2017 25126 json 9
Работа с Excel 298
23.10.2017 27125 arakelyan 39
Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 144
18.09.2017 48883 bugtester 43
Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере 127
10.09.2017 35166 tormozit 72