Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 17.02.2015, 10:40   #1
Заблокирован
 Разведчик
Аватар для Бросик
 
Бросик неизвестен в этих краях
Регистрация: 15.01.2015
Сообщений: 9
Популярность: -51
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию НАПИСАНИЕ ВНЕШНИХ КОМПОНЕНТ ДЛЯ 1С НА DELPHI

СБОРКА ПРОЕКТА
Для компиляции примера потребуется среда разработки Delphi 6 или 7.
  • Файл проекта - TestVK.dpr.

Откройте этот файл (например, двойным щелчком мыши из Проводника). Нажмите сочетание клавиш Ctrl-F9 (или пункт меню Project-Compile). Если все прошло нормально, в этой же папке образуется готовая внешняя компонента TestVK.dll (для проверки, а все ли хорошо, ее можно удалить, и получить готовую TestVK.dll еще раз).

При компиляции должна быть закрыта программа 1С в режиме Предприятие – иначе файл DLL будет заблокирован системой, и Delphi напишут пугающее сообщение: [Fatal Error] Could not create output file 'TestVK.dll'
ПРОВЕРКА РАБОТОСПОСОБНОСТИ DLL
В комплект примера входит тестовая конфигурация 1С:Предприятие 7.7. Если компонента зарегистрировалась нормально (возможно, потребуется вход в Windows и первый запуск под правами администратора), то откроется отчет, в котором доступны кнопки "Сообщение", "Предупреждение" и "Сигнал" (я реализовал три метода для вывода информации из внешней компоненты - знать, как работают подобные вещи, часто бывает полезно для отладки).
ПЕРЕИМЕНОВАНИЕ DLL
Первое, что я делаю при создании новой внешней компоненты – переименовываю уже существующий образец. Переименуйте TestVK.dpr так, как вы хотите (например, MyVK.dpr). Произведите замену всех вхождений подстроки TestVK в файлах проекта на нужное вам имя внешней компоненты.

Подсказка: чтобы открыть другие модули проекта, используйте пункт меню View-Units…

Программный код 1С, разумеется, также нужно не забыть изменить так, чтобы заменить все подстроки «TestVK».

Важно: замените значение CLSID внешней компоненты, чтобы новая DLL, с точки зрения Windows, стала действительно новой.
Цитата:
CLSID_AddInObject : TGUID = '{CE4FB6DB-636C-4824-86C4-DCE02135FE5A}';

Чтобы сгенерировать новый CLSID, нажмите сочетание клавиш Ctrl-Shift-G. Попробуйте скомпилировать новый проект – 1С должна «увидеть» вашу новую внешнюю компоненту, которая создана на основе другой ВК, но содержит полный набор ее свойств и методов.
ЧТО ТАКОЕ СВОЙСТВА И МЕТОДЫ?Новички могут задаться вопросом, а что такое свойства и что такое методы? В коде 1С свойства выглядят как, своего рода, «переменные», объекта, доступные через точку, например
Цитата:
vk.Заголовок="Внешняя компоннета";

Здесь объект – имеет имя vk (посмотрите, как он объявляется и инициализируется в глобальном модуле 1С). Этот объект поддерживает свойства и методы.

В этом коде я установил свойству "Заголовок" текстовое значение (посмотрите, как будет работать пример, если установить этому свойству другое значение заголовка, например, «Здесь был romix», или не устанавливать его вовсе).

Метод объекта – это, своего рода, «функция» объекта, доступная «через точку».
Цитата:
vk.ВсплывающаяПодсказка("Проверка всплываюшего сообщения", 3000);

Метод может иметь параметры. В данном примере, параметры – это «Проверка всплывающего сообщения» и 3000 – попробуйте установить в коде 1С что-нибудь другое и нажать кнопку «Сообщение» в тестовом отчете.
ИЗМЕНЕНИЕ СПИСКА СВОЙСТВ И МЕТОДОВ ВК
В модуле AddinObj.pas за количество свойств отвечают участки кода, которые я пометил (*2*), (*5*), (*6*), (*8*), (*11*) а за количество методов - (*3*), (*7*), (*9*), (*10*), (*12*). Я завел в шаблон по 5 свойств и методов, но что нужно сделать, чтобы их стало 6, например, в приведенном ниже фрагменте кода, - я надеюсь, понятно без объяснений.
Цитата:
prop1: vk_object.prop1(m_get_value);
prop2: vk_object.prop2(m_get_value);
prop3: vk_object.prop3(m_get_value);
prop4: vk_object.prop4(m_get_value);
prop5: vk_object.prop5(m_get_value);

Вы можете завести свойства и методы «с запасом» - лишние заготовки не повредят (их можно будет оставить пустыми).
ПРОГРАММИРОВАНИЕ ФУНКЦИОНАЛЬНОСТИ СВОЙСТВ
Откройте (через меню View – Units…) модуль vk_object.pas

Для свойств вы увидите примерно такой код, продублированный, с небольшими отличиями, несколько раз: Это самая важная часть наших действий, которую важно постараться понять.
Цитата:
/////////////////////////////////////////////////////////////////////
function T_vk_object.prop1(mode: TMode): String;
begin
case mode of
m_rus_name: Result:='Пиктограмма';
m_eng_name: Result:='IconType';
m_get_value: g_Value:=g_IconType;
m_set_value: g_IconType:=g_Value;
end;//case
end;

Что я здесь делаю?

# m_rus_name – устанавливаю русское имя свойства (в данном случае, свойство называется Пиктограмма). В коде 1С я пишу что-то вроде
Цитата:
vk.Пиктограмма=32;

Вот здесь 1С и узнает, что свойство называется именно Пиктограмма (а не как-то иначе). Попробуйте переименовать свойство (например, в Псиграмма), и посмотрите, что получится.

# m_eng_name - англоязычный синоним - 'IconType' – я устанавливаю строкой ниже.

# m_get_value –1С получает значение переменной, в данном случае, g_IconType.

Что это за переменная? А это та переменная (точнее, свойство класса), где я решил запоминать идентификатор своей пиктограммы.

# m_set_value – 1С устанавливает значение свойства. Наличие этой строки позволяет изменять числовое значение моей пиктограммы из кода 1С. Попробуйте выставлять из кода 1С различные значения пиктограммы (в комментариях примера я описал, какие значения возможны), и смотреть, что получится.

ПРОГРАММИРОВАНИЕ ФУНКЦИОНАЛЬНОСТИ МЕТОДОВ
Для методов код похожий:

Цитата:
/////////////////////////////////////////////////////////////////////
function T_vk_object.meth1(mode: TMode): String;
var s: String;
var ms: Integer;
begin
case mode of
m_rus_name: Result:='ВсплывающаяПодсказка';
m_eng_name: Result:='BalloonTooltip';
m_n_params: g_NParams:=2; //Количество параметров функции
m_execute: begin
//Извлекаем параметры функции, переданные из 1С
s:=GetParamAsString(0);//сообщение
ms:=GetParamAsInteger(1);//задержка в мс
//Показываем сообщение в трее
sleep_icon(s, ms);
end;
end;//case
end;

Этот абзац можно воспроизвести несколько раз (что и сделано в примере), заменив meth1 на meth2, meth3 и т.д. Приведенные ниже строчки устанавливают русское и английское имя метода.

Цитата:
m_rus_name: Result:='ВсплывающаяПодсказка';
m_eng_name: Result:='BalloonTooltip';

Попробуйте изменить то или другое, перекомпилировать проект и посмотреть, что получится. В строчке

Цитата:
m_n_params: g_NParams:=2; //Количество параметров функции

я устанавливаю количество параметров метода. Попробуйте изменять это количество (например, установить значение 3) и посмотреть, что получится. Блок

Цитата:
m_execute: begin
//…
end;

реализует собственно функциональность метода (показывает всплывающее сообщение в трее). Подробнее код я опишу ниже – но сначала полезно потренироваться со вставкой в него отладочной печати (именно так я исследую код).

ОТЛАДОЧНАЯ ПЕЧАТЬ
Вы можете в качестве теста вписать в функциональность метода что-то свое, например,

Цитата:
MessageBox(0, 'Превед', 'Медвед', 0);

Этот вызов покажет стандартное окно предупреждения с кнопкой ОК. Или вот так:

Цитата:
ShowMessage('Просто текст');

Во втором случае, если Delphi будет ругаться при компиляции, добавьте Dialogs в раздел uses модуля.

ПОЛУЧЕНИЕ ПАРАМЕТРОВ ФУНКЦИИ

В своей функции я завел две переменные для хранения параметров:

Цитата:
var s: String;
var ms: Integer;

Они должны хранить, соответственно, текст сообщения (то, что я передаю из 1С) и значение паузы в миллисекундах, в течение которой будет высвечиваться сообщение в трее. Сейчас мы их заполним значениями, полученными из 1С.

Цитата:
s:=GetParamAsString(0);//сообщение
ms:=GetParamAsInteger(1);//задержка в мс

Параметры нумеруются, начиная с 0 (давняя традиция программистов на языке С). Чем отличаются AsString и AsInteger, надеюсь, понятно. Этот код можно было бы написать и так:

Цитата:
s:= GetNParam(0);//сообщение
ms:= GetNParam(1);//задержка в мс

Но в случае передачи значений неправильного типа (попытайтесь передавать вместо правильных значений различную "чепуху") сообщения об ошибке будут менее информативными.

ОТЛАДОЧНАЯ ПЕЧАТЬ ПАРАМЕТРОВ
При отладке полученные из 1С значения полезно выводить на экран. Но как это сделать? Я обычно использую следующий прием. Чтобы показать строковые переменные, я пишу так:

Цитата:
MessageBox(0, pchar(s), 'Отладка - s', 0);

А числовые значения и значение типа "дата-время" я отображаю примерно так:

Цитата:
ShowMessage('Отладка - ms'+#13+IntToStr(ms));
ShowMessage('Время = <'+TimeToStr(Now())+'>; Температура = <'+FloatToStr(RoundTo(t,-2))+'>');

ФУНКЦИОНАЛЬНОСТЬ МЕТОДОВ
Получив все значения из 1С, можно приступать к собственно написанию полезного кода.

Функция sleep_icon(s, ms); определена в коде примера, и показывает сообщение, используя функции Windows API (Application Programming Interface).

[Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось VeTaL_UA; 17.05.2015 в 05:33.
  Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi Компонент Lineage RenatPro Pascal/Delphi 16 07.12.2015 17:52
[Услуги] Написание программ на C, C++ STL, Qt, Pascal, Delphi Benjamin Товары/услуги в Сети 2 13.07.2013 04:03
[Программа] Парсер внешних ссылок с сайта Dream_Wizard Боты, скрипты и прочий софт для Lineage 2 0 06.05.2012 21:07
[Помогите!] Написание программы на Delphi 7 Fr[0]ST Общение разработчиков 40 12.12.2011 12:26
[Баг] пот хак без внешних прог Shuu Rising Force Online 1 28.11.2008 19:06

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 08:52.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net