Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 6  ОтправитьПечать
Очень популярная тема (более 25 ответов) Добавить кнопку (число прочтений - 94574 )
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #60 - 01. Июля 2013 :: 17:58
Печать  
Подправленный вариант
  

DWX_ToolBar.zip ( 7 KB | Загрузки )
Наверх
 
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Добавить кнопку
Ответ #61 - 26. Июля 2013 :: 12:38
Печать  
chessman писал(а) 01. Июля 2013 :: 17:58:
Подправленный вариант

Спасибо. Вреде бы теперь не падает.  Класс
Или там еще какие-то изменения были?
  
Наверх
GTalkICQ  
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #62 - 26. Июля 2013 :: 12:49
Печать  
Я что-то с Видимостью там мутил. Больше вроде ничего.

ЗЫ:
Падало, потому что после выделения памяти под функцию перехвата, ей (памяти) нужно задавать опцию PAGE_EXECUTE_READWRITE.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #63 - 16. Сентября 2013 :: 14:08
Печать  
chessman писал(а) 08. Февраля 2013 :: 10:13:
Я обнаружил для себя, что оказывается можно вызвать диалог редактированя списка пользователей в режиме предприятия и его редактировать, как в Конфигураторе.  


Привет. Как можно вызвать список пользователей в режиме предприятия?
Код известен - 32854.

Я бы просто создал глобальную функцию с вызовом этого списка, а уж функцию, понятное дело, можно прилепить куда угодно.
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #64 - 17. Сентября 2013 :: 08:26
Печать  
Достаточно вот этого

Wrap.SendMessage h1C, WM_COMMAND, 32854, 0

где h1C - хэндл окна приложения
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #65 - 17. Сентября 2013 :: 12:06
Печать  
Код
Выбрать все
ТекстМодуля = "
	|Public Const WM_COMMAND = &h111
	|Public Sub GetUsersWindow()
	|	Set Wrap = CreateObject(""DynamicWrapperX"")
	|	Wrap.Register ""USER32"", ""GetForegroundWindow"", ""f=s"", ""r=l""
	|	Wrap.Register ""user32"", ""SendMessage""	 ,  ""i=hull""	, ""r=l""
	|	Res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_COMMAND, 32854, 0)
	|End Sub";
мScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
мScrptCtrl.Language = "vbscript";мScrptCtrl.AddCode(ТекстМодуля);
мScrptCtrl.CodeObject.GetUsersWindow();
 

  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #66 - 17. Сентября 2013 :: 12:37
Печать  
Можно наверное и так, но я предпочитаю получать хэндл окна абсолютно надежным способом. Вот кусок кода:

Код
Выбрать все
Wrap = СоздатьОбъект("DynamicWrapperX");
Wrap.Register("Kernel32", "GetProcAddress" , "i=hl", "r=u");
Wrap.Register("Kernel32", "LoadLibrary" , "i=s", "r=h");
handle  = Wrap.LoadLibrary("mfc42");
func    = Wrap.GetProcAddress(handle, 6575); //AfxGetMainWnd(void)
Wrap.RegisterAddr(func, "AfxGetMainWnd", "r=l");

h1C = Wrap.NumGet(Wrap.AfxGetMainWnd(), 32);
 



Можно его завернуть в скрипт.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #67 - 17. Сентября 2013 :: 13:51
Печать  
Спасибо, как всегда!

Только у меня ругается при выполнении скрипта, пока я не пропишу так:

Код
Выбрать все
Res = Wrap.RegisterAddr.... 

  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #68 - 17. Сентября 2013 :: 14:45
Печать  
alyuev писал(а) 17. Сентября 2013 :: 13:51:
Спасибо, как всегда!

Только у меня ругается при выполнении скрипта, пока я не пропишу так:

Код
Выбрать все
Res = Wrap.RegisterAddr.... 



пиши без скобок

Код
Выбрать все
Wrap.RegisterAddr func, "AfxGetMainWnd", "r=l" 

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


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #69 - 27. Сентября 2013 :: 08:56
Печать  
Привет, chessman.

Подскажи пожалуйста по классу ТулБара - если задаю картинку только методом ЗагрузитьКартинкуИзФайла() - картинка устанавливается не та, которую гружу, а первая из текущего стандартного тулБара.  Почему?
И что-то я не совсем понимаю логику установки картинки по индексу (как из ресурса, так и из битмапа). Можешь кратко рассказать, как и что?

Я тестирую на Форме списка справочника.



И еще, может подскажешь. Хочу в перехватчике создать ТулБар через ВыполняемыйМодуль.

Делаю так:

Код
Выбрать все
	ТекстМодуля = "
	|Перем ТулБар;
	|
	|Процедура ButtonClick(actID)
	|	Сообщить(""ОбработкаНажатияКнопки, actID = "" + СокрЛП(actID));
	|КонецПроцедуры

	|Процедура ДобавитьКнопкиВТулБар()
	|	ТулБар=СоздатьОбъект(""DWX.ToolBar"");
	|КонецПроцедуры
	|
	|
	|ДобавитьКнопкиВТулБар();
	|";
	л_ВМ = СоздатьОбъект("ВыполняемыйМодуль");
	л_ВМ.УстановитьМодуль(ТекстМодуля);
	л_ВМ.НазначитьКонтекст(Конт);
	л_ВМ.КомпилироватьИВыполнитьМодуль();
 



Это я делаю в Событие_ПослеОткрытия()

Как видишь, я тут только инициализирую класс. Так вот почему-то после выполнения модуля класс ТулБар завершает работу, т.к. я вижу сообщение "Деструктор:: DWX.ToolBar" - с чем бы это могло быть связано? Причем это сообщение выводится уже после отработки Событие_ПослеОткрытия!
« Последняя редакция: 08. Января 2014 :: 10:36 - alyuev »  

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


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #70 - 27. Сентября 2013 :: 12:11
Печать  
Сбивают с толку смещения, которые нужно указывать при добавлении кнопки.

Код
Выбрать все
ТулБар.ЗагрузитьКартинкуИзРесурса(1035); //Здесь 9 картинок
ТулБар.ЗагрузитьКартинкуИзФайла(КаталогИБ()+"01.bmp");//58
ТулБар.ДобавитьКнопку(65563+Значение,48+9+Значение,..... 



Опытным путем установил, что индекс картинки состоит из:
48 - не понятно, что это такое? похоже на число картинок в ресурсе 1037.
9  - число картинок в ресурсе, загружаемом через ЗагрузитьКартинкуИзРесурса
значение - номер картинки, которую загрузили из файла

И с чем связано смещение для задания самой картинки кнопки (65563)? Пробовал меньше - кнопки рисуются недоступными.

« Последняя редакция: 27. Сентября 2013 :: 20:53 - alyuev »  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #71 - 27. Сентября 2013 :: 14:39
Печать  
alyuev писал(а) 27. Сентября 2013 :: 08:56:
Подскажи пожалуйста по классу ТубБара - если задаю картинку только методом ЗагрузитьКартинкуИзФайла() - картинка устанавливается не та, которую гружу, а первая из текущего стандартного тулБара.  Почему?


Смотри, я цепляюсь к уже существующему Тулбару. К нему в это время уже привязан некий битмап. Поэтому, чтобы сохранить картинки на существующих кнопках, приходится к сущ. битмапу прилеплять то, что ты хочешь добавить.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #72 - 01. Октября 2013 :: 08:52
Печать  
Понятно. С этим, в принципе, еще можно жить.
А с Выполняемым модулем что-то можно придумать?
  

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Добавить кнопку
Ответ #73 - 01. Октября 2013 :: 10:41
Печать  
alyuev писал(а) 01. Октября 2013 :: 08:52:
Понятно. С этим, в принципе, еще можно жить.
А с Выполняемым модулем что-то можно придумать?


Выложи тестовую базу, я гляну. А то так трудно сказать.
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


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

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Добавить кнопку
Ответ #74 - 09. Января 2014 :: 11:33
Печать  
Привет. Пытаюсь запустить на одном из компов - 1С вылетает.
Сделал тестовую обработку. В неё записал только это:

Код
Выбрать все
Перем ТулБар;

Процедура ПослеСозданияФормы()
	Сообщить("ПослеСозданияФормы()");
	ТулБар=СоздатьОбъект("DWX.ToolBar1");
	Сообщить("   Зарегили класс");
	ТулБар.УстановитьКонтекстФорму(Контекст,Форма);
	Сообщить("   Установили контекст");
КонецПроцедуры 



Пробовал в ПослеСозданияФормы и в ПослеОткрытия - одинаково.
Выводится последнее сообщение "Установили контекст" - и после этого 1С вылетает.

Причем на одной машине всё работает, а на другой - нет.

Chessman, не подскажешь - куда можно и нужно смотреть, чтобы разобраться, в чём дело, почему вылетает?

DWX.BLANG.ert размером 8704
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 6 
ОтправитьПечать