Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) мини-класс "КрасиваяКнопка" (число прочтений - 10760 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
мини-класс "КрасиваяКнопка"
24. Октября 2012 :: 10:09
Печать  
Мини-класс (наследник АктивИкс) для замены стандартных 1С-кнопок на АктивИкс-кнопку 3D Active Button Magic.

Кнопки заменяются через "ВыполняемыйМодуль" в глобальной процедуре ПослеСозданияФормы(), ну, или в Перехватчике, кто его использует.

Чтобы создалась АктивИкс-кнопка у 1С-кнопки должен быть Идентификатор.

Если в кнопке нужно использовать картинку, то идентификатор 1С-кнопки задается таким способом: кнЗакрыть_БлаБлаБла, кнОк_БлаБлаБла и т.п.
Первая часть до символа подчеркивания должна совпадать с именем картинки (ico или bmp, предпочтительнее ico) из каталога Pic\.
Если в этой же папке существует шаблон АктивИкс-кнопки (*.3bt), то будет использовать этот шаблон для кнопки.
По умолчанию используется шаблон "Обычная.3bt"

Код
Выбрать все
Процедура ПослеСозданияФормы(Конт)

	л_ВМ = СоздатьОбъект("ВыполняемыйМодуль");
	Для Х = 0 По ФормаРасш.КоличествоАтрибутов() - 1 Цикл
		Об=ФормаРасш.ПолучитьАтрибут(Х);
		ТипОб=Об.Тип;
		Если ТипОб = 3  Тогда
			ИдОб   = СК(ИдЭлем);
			Если ПустаяСтрока(ИдОб)=0 Тогда
				Попытка
					Опис 	  = СтрЗаменить(Об.Описание,РазделительСтрок,"|");
					ПозПроб   = Найти(ИдОб,"_"); ПозПроб = ?(ПозПроб=0,СтрДлина(ИдОб),ПозПроб-1);
					Настройки = Лев(ИдОб,ПозПроб);
					Формула   = Об.Формула;
					Формула   = СтрЗаменить(Формула,"""","""""");

					ИмяПроц   = "НоваяКнопка_"+ИдОб;
					ИмяПерем  = "Кн"+ИдОб;
					ТекстМодуля = "
					|Перем "+ИмяПерем+";
					|
					|Процедура "+ИмяПроц+"()
					//|	Сообщить(""Создали кнопку"");
					|	Ф=СоздатьОбъект(""Форма""); Ф.УстановитьФорму(Форма);
					|	"+ИмяПерем+"=СоздатьОбъект(""КрасиваяКнопка"");
					|	Ф.СоздатьЭлементУправления("+ИмяПерем+","""+ИдОб+""");
					|	и+""");";
					Если ПустаяСтрока(Формула)=0 Тогда
						ТекстМодуля=ТекстМодуля+"
					|	"+ИмяПерем+".ФормулаКнопки="""+Формула+""";
					|";
					КонецЕсли;
					ТекстМодуля=ТекстМодуля+"
					|КонецПроцедуры
					|
					|"+ИмяПроц+"();
					|";
					л_ВМ.УстановитьМодуль(ТекстМодуля);
					л_ВМ.НазначитьКонтекст(Конт);
					л_ВМ.КомпилироватьИВыполнитьМодуль();
				Исключение
					//Сообщить(ОписаниеОшибки());
				КонецПопытки;
			КонецЕсли;
		КонецЕсли;

КонецПроцедуры 


           
Для того, чтобы изменить доступность КрасивойКнопки нужно сделать такой вызов для кнопки "кнЗакрыть":
           Ф=СоздатьОбъект("Форма"); Ф.УстановитьФорму(Фрм); ОбКнопки = Ф.ПолучитьЭлементУправления("кнЗакрыть"); ОбКнопки.Доступность = 0;
           

Или ещё более общий вариант. Прописать глобальную процедуру:

Код
Выбрать все
//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Процедура ОбновитьДоступностьАктивИксКнопки(Конт) Экспорт
	//Для того, чтобы изменить доступность КрасивойКнопки нужно сделать вызов этой функции в функции обновления формы
	Попытка
		Форма = Конт.Форма;
		ФормаРасш = СоздатьОбъект("РасширениеФормы");
		ФормаРасш.УстановитьФорму(Форма);
		Ф=СоздатьОбъект("Форма"); Ф.УстановитьФорму(Форма);
		Для Х = 0 По ФормаРасш.КоличествоАтрибутов() - 1 Цикл
			Об=ФормаРасш.ПолучитьАтрибут(Х);
			ТипОб=Об.Тип;
			Если ТипОб=3 Тогда
				ИдЭлем = Об.Идентификатор;
				Попытка
					ОбКнопки = Ф.ПолучитьЭлементУправления(ИдЭлем); ОбКнопки.Доступность = Об.Доступность;
				Исключение
				КонецПопытки;
			КонецЕсли;
		КонецЦикла;
	Исключение
	КонецПопытки;
КонецПроцедуры

//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  



И сделать вызов этой процедуры из функции обновления формы
« Последняя редакция: 25. Октября 2012 :: 07:57 - alyuev »  

_______________005.rar ( 35 KB | Загрузки )

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: мини-класс "КрасиваяКнопка"
Ответ #1 - 24. Октября 2012 :: 11:04
Печать  
Не хватает скриншота
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #2 - 24. Октября 2012 :: 11:29
Печать  
Пример скриншота...
  

Sample_001.jpg ( 121 KB | Загрузки )
Sample_001.jpg

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: мини-класс "КрасиваяКнопка"
Ответ #3 - 24. Октября 2012 :: 11:53
Печать  
Имхо, как то несуразно выглядит... лепнина, что ли
Улыбка

Размеры кнопок нужно как минимум уменьшить
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #4 - 24. Октября 2012 :: 13:05
Печать  
Так размер же АктивИкс-кнопок соответствует 1С-кнопкам! Суть-то не в этом скриншоте. Улыбка
Шаблоны АктивИкс-кнопок тоже настраиваемы.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: мини-класс "КрасиваяКнопка"
Ответ #5 - 24. Октября 2012 :: 13:15
Печать  
да знаком я с этим активиксом..
просто у тебя пример не очень удачный, имхо.
Да и.. не понял, зачем нужен идентификатор у кнопки ?
Если его нет - всё равно же можно активикс на него натянуть.

Не смотрел твой класс, как события кнопки генеришь ?
Прописываешь через ВМ буттонклик для каждой кнопки ? и для этого идентификатор нужон, так ?
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #6 - 24. Октября 2012 :: 13:53
Печать  
Идентификатор нужен чтобы вытащить формулу кнопки. А по большей части, чтобы прописать стиль и картинку для кнопки.
Click() в самом классе отрабатывает.

И как натянуть АктивИкс на кнопку без Идентификатора?

Я использую метод СоздатьЭлементУправления() объекта Форма. И там нужен Идентификатор.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: мини-класс "КрасиваяКнопка"
Ответ #7 - 24. Октября 2012 :: 14:45
Печать  
alyuev писал(а) 24. Октября 2012 :: 13:53:
Идентификатор нужен чтобы вытащить формулу кнопки. А по большей части, чтобы прописать стиль и картинку для кнопки.
Click() в самом классе отрабатывает.

И как натянуть АктивИкс на кнопку без Идентификатора?

Я использую метод СоздатьЭлементУправления() объекта Форма. И там нужен Идентификатор.


Не совсем так, ты же перебираешь атрибуты формы - достаточно знать номер:

Код
Выбрать все
 Кнопка=СоздатьОбъект("АктивИкс");
    Кнопка.УстановитьАтрибут(Форма,НомерАтрибута);
    Кнопка.СоздатьЭУ("BTNENH.BtnEnhCtrl.4");
 



  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #8 - 25. Октября 2012 :: 08:57
Печать  
Попробовал переделать создание через УстановитьАтрибут().
Кнопки c идентификатором создаются, но та, что была без идентификатора, создалась не на том объекте (передавался номер реквизита). И перестало обрабатываться событие Click.

Как переделал:

1. Убрал вызов СоздатьЭлементУправления()
2. Передаю ИдАтрибута (или номер, если ИДа нет) параметром в Инициализация()
3. В Инициализация вызываю метод КнопкаАИ.УстановитьАтрибут(Конт.Форма,ИдАтрибута);
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: мини-класс "КрасиваяКнопка"
Ответ #9 - 25. Октября 2012 :: 08:59
Печать  
Событие и не будет - оно же описано у тебя как ИмяАтрибута_onClick() в классе поди
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #10 - 25. Октября 2012 :: 09:01
Печать  
Нет, просто Click() - это ж класс-наследник АктивИкса
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 810
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #11 - 25. Октября 2012 :: 09:30
Печать  
Попробовал передать в СоздатьЭлементУправления() номер Атрибута. Метод его съедает, не ругается, но АктивИкс не создает.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: мини-класс "КрасиваяКнопка"
Ответ #12 - 25. Октября 2012 :: 09:49
Печать  
Был у меня где-то пример.. динамического добавления активиксов на форму, вот не помню. задавалялия там идентификаторы или нет.
Если найду - напишу.
  
Наверх
 
IP записан
 
aou1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 183
Местоположение: Екатеринбург
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #13 - 29. Октября 2012 :: 14:03
Печать  
УстановитьАтрибут / AssignAttrib

   Синтаксис: УстановитьАтрибут(Форма, ИдентификаторЭлементаДиалога)

   Параметры:

           Форма - тип: Форма. Форма, на которой будет создан элемент ActiveX
           ИдентификаторЭлементаДиалога - тип: Строка. Идентификатор элемента диалога, на месте которого будет создан элемент ActiveX.

Так что номер атрибута не сработает.

  
Наверх
ICQ  
IP записан
 
aou1c
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 183
Местоположение: Екатеринбург
Зарегистрирован: 29. Мая 2006
Пол: Мужской
Re: мини-класс "КрасиваяКнопка"
Ответ #14 - 06. Ноября 2012 :: 15:09
Печать  
Если кому интересно, то я сделал, так:
1. Делаю кнопки с не заданными идентификаторами невидимыми, а на месте их создаю новые кнопки со своими идентификаторами. Свойства новой кнопки копирую из невидимой кнопки.
2.Кроме того вызов формул делаю не через выполнить модуль, а по клику на кнопке из активх создается еще одна кнопка с минимальными размерами, чтобы не было видно, но в координатах клинутой кнопки, на эту кнопку копируется формула.
3. далее генерю внешнее событие(ВнешнееСобытие(...)), это чтобы уйти из контекста активх(нужно чтоб стандартно отрабатывалась клавиша esc).
4. В процедуре обработка внешнего события вызываю ЭмулироватьКлавиатуру() для нажатия маленькой псевдоневидимой кнопки.
5 .И наконец при клике на другой кнопке, маленькую кнопку передвигаю в размеры кликнутой кнопки, это нужно чтобы правильно появлялось всплывающее меню, если такое в формуле есть.

6.процедуру обработка внешнего события перехватываю глобально, так же как и создание кнопок 3d т.е. формы остаются нетронутыми.

Вывод:
Формулы на кнопках  отрабатываются стандартно без каких либо ограничений, в том числе директивы # и всплывающие меню.
Так же правильно(стандартно) работает клавиша esc для прерывания выполнения формулы.

Осталось: Пока не разобрался как скопировать картинку с кнопки 1С, это актуально, если кнопка  только с картинкой без заголовка, да еще и без описания.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать