gifts2017

Изменяем вид кнопок на форме 1С 7.7

Опубликовал Аркадий Кучер (Abadonna) в раздел Программирование - Практика программирования

Изменяем вид кнопок на форме 1С 7.7. Статья для разработчиков ВК (Delphi)
Реализовано в http://infostart.ru/public/59436/?PAGEN_1=22#comm

Обратились ко мне любители "попугайских" форм с просьбой изменить вид (цвет) кнопок на форме, не прибегая к наложению картинки на кнопку.

Первое (и абсолютно неправильное!), что пришло в голову: наложить на кнопку что-то вроде TLabel, у которого есть возможность поменять цвета фона и шрифта. Однако, родная кнопка 1С в таком случае полностью перекрывается компонентом и, естественно, перестает реагировать на клик. В результате получаем цветную, но абсолютно нерабочую кнопку.

Второй вариант: создать динамически свою кнопку, но тогда события ее нажатия придется обрабатывать в форме в процедуре ОбработкаВнешнегоСобытия(), что не совсем комильфо.

Третий вариант: Оба! А что если перекрыть родную кнопку другой кнопкой от Delphi, которая имеет возможность изменения цветов? И заставить нашу новую кнопку посылать при ее нажатии

сообщение родной (которая под ней), что она (родная) нажата?!

Реализация:

Добавляем в основной модуль нашей ВК код

//определим свой тип на основе кнопки TJvNavPanelButton
// из замечательного набора компонент JEDI - рекомендую
type
  TBtn = class(TJvNavPanelButton)
 
private
  procedure BtnClick(Sender: TObject);
end;
// переопределяем родной OnClick TJvNavPanelButton
// на свою обработку - жмем родную 1С-кнопку на форме
procedure TBtn.BtnClick(Sender: TObject);
var
bt1C:hwnd;
begin
 // хэндл кнопки 1С, которую будем перекрывать нашей кнопкой
 
bt1C:=GetParent((Sender as TJvNavPanelButton).Parent.Handle);
 
// посылаем сообщение нажали/отпустили левую кнопку мыши - клик
 
SendMessage(bt1C,WM_LBUTTONDOWN,0,0);
 
SendMessage(bt1C,WM_LBUTTONUP,0,0);
end;

 

 

Прописываем нашу процедуру в ВК

// хэндл 1С-кнопки по её заголовку
function TMiracleClass.hButton(const Capt: WideString): Integer;
var
a: array [0..254] of ansichar;
begin
  
StrPCopy(@a,capt);
  
RESULT:=FindWindowEx(hReportDialog,0,'Button',a);
end;

procedure
TMiracleClass.SetButtonCaption(const Capt: WideString; ColorFrom,
 
ColorTo, FontColor: Integer);
var
TWC:TWinControl;
var
NewBt: TBtn;
var
r:TRect;
var
hB:hwnd;
begin

  hB:=hButton(Capt);
 
// строим TWinControl на весь размер 1С-кнопки
 
TWC:=TWinControl.CreateParented(hB);
 
GetWindowRect(hB,r);
 
TWC.UpdateControlState;
 
TWC.Top:=0;
 
TWC.Left:=0;
 
TWC.Width:=r.Right-r.Left;
 
TWC.Height:=r.Bottom-r.Top;
 
// строим нашу новую кнопку на весь TWinControl 
 
NewBt:=TBtn.Create(TWC);
 
NewBt.Parent:=TWC;
 
NewBt.Top:=0;
 
NewBt.Left:=0;
 
NewBt.Width:=TWC.Width;
 
NewBt.Height:=TWC.Height;
 
NewBt.Caption:=' '+Capt;
 
NewBt.Colors.ButtonColorFrom:=TColor(ColorFrom);
 
NewBt.Colors.ButtonHotColorFrom:=TColor(ColorFrom);
 
NewBt.Colors.ButtonSelectedColorFrom:=TColor(ColorFrom);
 
NewBt.Colors.ButtonColorTo:=TColor(ColorTo);
 
NewBt.Colors.ButtonHotColorTo:=TColor(ColorTo);
 
NewBt.Colors.ButtonSelectedColorTo:=TColor(ColorTo);
 
NewBt.Visible:=true;
 
NewBt.Font.Color:=TColor(FontColor);
 
// переопределям OnClick новой кнопки на "нажатие" 1С-кнопки
 
NewBt.OnClick:=NewBt.BtnClick;
end;

 

 

 

 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Vasily Kushnir (vasilykushnir) 20.08.10 14:31
Я просто в шорохе от реализации. Оказывается все гениальное - просто. ;)
2. Аркадий Кучер (Abadonna) 20.08.10 14:32
(1) Но не все простое гениально :D
3. Епрст (Ёпрст) 20.08.10 15:05
А можно просто натянуть активикс на кнопку и привет, будет хоть круглая:
4. Аркадий Кучер (Abadonna) 20.08.10 15:31
(3)Угу. Но актив-икс на кнопочку все равно ж dll-кой натягивать (в 7.7)
5. Епрст (Ёпрст) 20.08.10 15:43
(4) ну да..
эт просто к тому, что способы есть разные :)

Можно еще тупо картинку на форму кинуть.. типо "псевдо кнопка". Тогда вообще без ВК можно обойтись.
6. Аркадий Кучер (Abadonna) 20.08.10 15:46
(5) Кушнир у меня счастлив и ладно ;) Это ему хотелось.
О чем я теперь искренне сожалею :cry:
Я вообще терпеть всяких "гламуров" не могу, как-то строгий стиль больше по душе.
На вкус и цвет...
7. WEB (WEB) 26.08.10 09:53
У меня есть один вопрос: В методе TMiracleClass.hButton фигурирует переменная hReportDialog, но она нигде не объявлена. Если она является свойством класса TMiracleClass, то надо бы показать описание (секцию type) для этого класса, или просто писать self.hReportDialog ...
8. Boxa (Boxa) 26.08.10 11:25
9. Аркадий Кучер (Abadonna) 26.08.10 13:27
(7)
В методе TMiracleClass.hButton фигурирует переменная hReportDialog

Эта статья является продолжением статьи http://infostart.ru/public/73902/ , а там написано:
В статьях "Создание внешних компонент 1С для начинающих" (http://www.infostart.ru/public/14551/) и "Создание внешних компонент 1С для начинающих, часть 2" (http://www.infostart.ru/public/14556/) были рассмотрены методы внедрения визуальных компонент Дельфи на активную форму 1С (отчет, обработка, документ, справочник, журнал). В частности, там же рассмотрены методы получения хэндла "подложки" (hReportDialog), которая используется как родительское окно при внедрении компонента Дельфи

Каюсь, тут поленился дописать:(
10. Аркадий Кучер (Abadonna) 26.08.10 15:22
12. bugmeoncemore (maxdot) 15.12.10 23:31
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа