Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #125


Клуб профессиональных программистов «Весельчак У»
Информационная рассылка сайта и форума.  Выпуск 125.  20 ноября 2011 г.

Здравствуйте, уважаемые читатели!

Оглавление



Подставной модуль Led


Итак, мы выяснили, что для тестирования модуля Application нам понадобятся подставные модули Led и Timer. Теоретически можно было бы написать их вручную, но этого не стоит делать по нескольким причинам. Во-первых, это рутинная работа, которую можно (и нужно) автоматизировать. Во-вторых, несмотря на рутинность, эта работа требует большого внимания и кропотливости, поскольку подставной объект — не такая уж простая штука. В-третьих, это сизифов труд, так как при каждом изменении интерфейса модуля подставной код нужно переписывать (или по крайней мере дописывать).

Поэтому сейчас самое время отправиться на домашнюю страницу проекта CMock и загрузить этот продукт в поддиректорию vendor\cmock нашего проекта. Мы будем далее работать с ним довольно много, поэтому не поленитесь отложить на время чтение этой статьи и внимательно прочитать документацию на CMock, тем более что ее совсем немного.

Прочитали? Продолжаем. Сначала создадим поддиректорию для модуля Led:


> CreateModule.bat Led

Затем сгенерируем заготовку модуля:


> GenMod.bat Led Led

Объявляем интерфейс модуля:


Код: (Led.c)
#ifndef _LED_H
#define _LED_H

void Led_init(void);

void Led_on(void);

void Led_off(void);

#endif // _LED_H

Создадим в поддиректории модуля Led поддиректорию mock для хранения подставных объектов. А теперь пора применить новые знания, полученные в процессе изучения документации CMock:


> ruby ..\vendor\cmock\lib\cmock.rb include\Led.h

Сообщение на консоли уведомляет нас о том, что подставной объект для модуля Led был благополучно сгенерирован. Но раз уж мы с самого начала привыкли проверять каждую деталь лично, отправимся в только что созданную нами поддиректорию mocks и поглядим, что там произошло. Видим, что там появились два файла: MockLed.h и MockLed.c. С первым из них мы будем непосредственно работать далее, поэтому рассмотрим его подробно:


Код: (MockLed.h)
/* AUTOGENERATED FILE. DO NOT EDIT. */
#ifndef _MOCKLED_H
#define _MOCKLED_H

#include "Led.h"

void MockLed_Init(void);
void MockLed_Destroy(void);
void MockLed_Verify(void);




#define Led_init_Expect() Led_init_CMockExpect(__LINE__)
void Led_init_CMockExpect(UNITY_LINE_TYPE cmock_line);
#define Led_on_Expect() Led_on_CMockExpect(__LINE__)
void Led_on_CMockExpect(UNITY_LINE_TYPE cmock_line);
#define Led_off_Expect() Led_off_CMockExpect(__LINE__)
void Led_off_CMockExpect(UNITY_LINE_TYPE cmock_line);

#endif

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

Далее мы видим несколько объявлений функций (эти функции чисто служебные и не представляют для нас интереса) и три макроопределения, на которых следует остановиться подробнее:


  • Led_init_Expect();
  • Led_on_Expect();
  • Led_off_Expect().

Эти макросы, написанные в функциональном стиле, очень напоминают наши интерфейсные методы, к которым дописан суффикс _Expect. С их помощью производится настройка подставного объекта, т.е. мы сообщаем ему, какие методы, в каком порядке и с какими параметрами (если есть) должны быть вызваны в подставном объекте, а также какие значения (если есть) они должны вернуть в тестируемую программу. У нас самый простой случай — методы без параметров не возвращают значений, поэтому и сигнатура настроечного макроса столь же проста.

Модуль MockLed.c мы рассматривать не будем, поскольку он чисто служебный. Можете посмотреть его самостоятельно, чтобы оценить, от какого количества писанины избавил нас автогенератор CMock.

На этом мы можем временно распрощаться с модулем Led и вернуться к модулю Application, поскольку у нас теперь есть все необходимое, чтобы начать его реализацию посредством TDD.



...


Полностью прочитать статью можно на нашем сайте, в разделе «Инструменты и технологии проектирования ПО».

  • Программирование :: Неотложка
  • есть бинарный файл на диске, типа

    Код:
    %-12345X@PJL
    PJL JOB
    PJL OKIUSERREQUIREMENT LANGUAGE=MJL
    PJL OKIACCESSCONTROL ID="8fbf" TYPE=1
    PJL OKIMFPJOB TYPE=PCPRINTJOB
    PJL OKIENDOFSYSTEMCOMMAND
    %-12345X@PJL JOB NAME = ""
    PJL OKIAUXJOBINFO DATA="ComputerName=01-PROJ-17"
    PJL OKIAUXJOBINFO DATA="UserName=Фронтов РњРёС…РРёР»"
    PJL OKIAUXJOBINFO DATA="PortName=192.168.1.114"
    PJL OKIAUXJOBINFO DATA="ReceptionTime=21:57:19 2011/11/17"
    PJL OKIAUXJOBINFO DATA="DocumentName=Новый текстовый документ — Блокнот"
    PJL OKIAUXJOBINFO DATA="MultiPage=1"
    PJL OKIAUXJOBINFO DATA="ApplicationName=Блокнот"

    здесь не все символы, там еще управляющие последовательности есть (esc-последовательности, которые, #27)

    вопрос, такую шнягу штатными средствами можно отправить на обычный принтер? а на хьюлетовский принтер, если он есть в системе?
  • Доброго времени суток! Мне необходимо создать БД и привязать ее к пользовательскому интерфейсу(сильно не пинайте, если путаю определения, я в этом-профан). Собственно прошу дать совет:
    1. на чем проще сделать базу и интерфейс (в принципе никаких особенных требований нет);
    2. Какую литературу почитать.

    Заранее благодарен за ответы...
  • Программирование :: .NET технология от и до
  • Нужно привязать к таблице коллекцию, элементы которой являются массивами. Т.е. каждый столбец таблицы соответствует позиции в массиве.
    WPF только осваиваю, поэтому пока решение в лоб:

    Код: (csharp)
    class Data
        {
            public string[] S { get; set; }
        }

    //////////////////

        List<Data> list = new List<Data>(2);

        Data d = new Data { S = new string[] { "aaa1", "bbb1", "ccc1" } };
        list.Add(d);

        d = new Data { S = new string[] { "aaa2", "bbb2", "ccc2" } };
        list.Add(d);

        DataGridTextColumn c;
        Binding b;

        for (int i = 0; i < 3; i++)
        {
            c = new DataGridTextColumn();
            c.Header = i.ToString();
            b = new Binding("S");
            b.Converter = new MyConverter(i);
            c.Binding = b;
            dataGrid1.Columns.Add(c);
        }

        dataGrid1.ItemsSource = list;

    //////////////////

        class MyConverter : IValueConverter
        {
            private int column;
            public MyConverter(int column)
            {
                this.column = column;
            }
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {            
                return ((string[])value)[column];
            }

            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException();          
            }
        }        

    И для поддержки редактирования нужно ещё в конверторе хранить ссылку на DataGrid.

    Добавлено через 3 дня, 14 часов, 30 минут и 30 секунд:
    Ещё такая проблема. Есть класс - оболочка для коллекции, например, List<Person>. Хочу, чтобы его можно было привязать к гриду через ItemsSource. Для этого реализую в своём классе интерфейс IEnumerable:
    Код: (csharp)
    class PersonCollection : IEnumerable
    {
         List<Person> list;

         IEnumerator Ienumerable.GetEnumerator()
         {
              return ((IEnumerable)list).GetEnumerator();
         }

         public List<Person> GetList()
         {
             return list;
         }
    }

    Однако, не работает, грид пустой (точнее, добавляются пустые строки) -

    Код: (csharp)
          dataGrid2.ItemsSource = collection;

    C данными всё ок, т.к. такой вариант, естественно, пашет
    Код: (csharp)
     dataGrid.ItemsSource = collection.GetList();

    В чём тут дело?





  • Программирование :: C/C++
  • Вот в этом случае всё отлично :
    Код:

    typedef void(*pCallback)(void);


    class CClass
    {
    private:
    explicit CClass(void);

    public:
    ~CClass()
    {
    m_pInstance = NULL;
    }

    static CClass* GetInstance()
    {
    if (!m_pInstance)
            {
    m_pInstance = new CClass();
            }
    return m_pInstance;
    }

    private:

           void _set(pCallback callback)
    {
    m_callback = callback;
    }

          void _check()
          {
               GetInstance()->_set(&CClass::GetInstance()->set_reload);
          }


    private:
    void static set_reload(void)
    {
    if(m_bReload == false)
    {
    m_bReload = true;
    }
    }

    private:
    static CClass* m_pInstance;

    private:
    bool static m_bReload;
    };

    Но стоит убрать объявление static в m_bReload и set_reload,как компилятор начинает ругаться illegal operation on bound member function :

    Код:

    typedef void(*pCallback)(void);


    class CClass
    {
    private:
    explicit CClass(void);

    public:
    ~CClass()
    {
    m_pInstance = NULL;
    }

    static CClass* GetInstance()
    {
    if (!m_pInstance)
            {
    m_pInstance = new CClass();
            }
    return m_pInstance;
    }

    private:

           void _set(pCallback callback)
    {
    m_callback = callback;
    }

          void _check()
          {
               GetInstance()->_set(&CClass::GetInstance()->set_reload);  <- Error illegal operation on bound member function
          }

    private:
    void set_reload(void)
    {
    if(m_bReload == false)
    {
    m_bReload = true;
    }
    }

    private:
    static CClass* m_pInstance;

    private:
    bool m_bReload;
    };

    Это потому что CClass - singletone (static CClass* m_pInstance)?
  • Программирование :: C/C++ :: WinAPI & Visual C++
  • Всем добрый вечер, у меня есть функция для посылки в устройство некоего кода, которая выглядит так:
    Код: (c++)
    int W_F(LPVOID lpBuffer, DWORD nNumberOfBytesToWrite, int)
     {
     _COMSTAT comstat; //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
     DWORD btr, temp = CE_RXPARITY, mask, signal;
    ClearCommError(hCom, &temp, &comstat); //нужно заполнить структуру COMSTAT
    btr = comstat.cbInQue;
    btr=btr + nNumberOfBytesToWrite;
    if(btr>87)                        
    PurgeComm(hCom,PURGE_TXCLEAR);

    WriteFile(hCom, lpBuffer, nNumberOfBytesToWrite, &btr, 0);     //записать байты
                counter+=btr;   //увеличиваем счётчик байтов
    return 12;
     }
    хотелось бы у вас узнать как правильно вызвать эту функцию(что использовать в качестве параметра lpBuffer)
    PS: вообще этот параметр должен содержать определенный код, например 20h(в 16-й форме) который заставляет устройство начать работать, а вот в какой форме это записать в буфер я не пойму
    буду признателен за вашу помощь
  • Суть в заголовке. Есть листбокс, который я использую для отображения лога, некоторые важные строки хорошо бы выделять цветом. Однако как получить из него конкретную строку мне не ясно. Я не уверен, что использую наиболее подходящий компонент, но лучше пока не нашёл.
  • Программирование :: Delphi
  • Код: (delphi)
      
    const Host_Server_SMTP = 'smtp.mail.ru';
    const Port_Server_SMTP = 25;
    const SenderUserName = 'mylogin';
    const SenderPassword = 'mypwd';
    const SenderAddress = 'mylogin@mail.ru';

    const RecipientAddress = 'yourbox@mail.ru';
    ........................................
    ........................................

    with DataMailModule do
      begin
        IdSMTP1.Host := Host_Server_SMTP;
        IdSMTP1.Port := Port_Server_SMTP;
        IdSMTP1.Username := SenderUserName;
        IdSMTP1.Password := SenderPassword;
        IdMessage1.From.Address := SenderAddress;
        IdMessage1.Subject := ExtractFileName(FileNameAttach);
        IdMessage1.From.Address := SenderAddress;
        IdMessage1.From.Text := 'For You';
        IdMessage1.Body.Text := 'File : ' + ExtractFileName(FileNameAttach);
        IdMessage1.Recipients.Add;
        IdMessage1.Recipients.Items[0].Text := RecipientAddress;
        TIdAttachmentFile.Create(IdMessage1.MessageParts, FileNameAttach);

        try
          IdSMTP1.Connect;
          IdSMTP1.Authenticate;
          IdSMTP1.Send(IdMessage1);
          IdSMTP1.Disconnect;

        except
          on E: Exception do
          begin
            //ShowMessage('Чот не то.');

          end;

        end;

    На строке
          IdSMTP1.Send(IdMessage1);

    прога прекращает выполняться, начинается except для нее.
    Если написать
        IdMessage1.From.Text := SenderAddress;
    то отправка проходит. Почему ?
  • ExcelApp := CreateOleObject('Excel.Application'); 

    Какой нужно параметр указать для этого?
  • Хочу остановить работу таймера внутри
    TMainForm.Timer1Timer(Sender: TObject);

    Но т.к. мессиджы плодятся каждую прошедшую минуту бездействия, то и возник вопрос - что ж он не остановится?
    Код: (delphi)
    const IDLE_INTERVAL = 60000;        // Минута бездействия

    function LastInput(): DWord;
    var
      LInput: TLastInputInfo;
    begin
      LInput.cbSize := SizeOf(TLastInputInfo);
      GetLastInputInfo(LInput);
      Result := GetTickCount - LInput.dwTime;
    end;

    procedure TMainForm.Timer1Timer(Sender: TObject);
    begin

     if (Round(LastInput) >= IDLE_INTERVAL) then
       begin
         MainForm.Visible := false;
         ShowMessage('Не было активности более минуты!');
         Timer1.Enabled := false;
         FinishSession();       // Какие-то действия
       end;

    end;
  • Уходит много вправо:
    (http://s017.radikal.ru/i406/1111/b9/498efb582b66.png)

    Как это регулируется?

    Delphi XE
  • Останавливал в службах MySQL- сервер, но в процедуру
    procedure TDataManagerModule.ADOConnectionManagerDisconnect(Connection: TADOConnection; var EventStatus: TEventStatus);
    прога не заходила...

    С чем связано такое ?

    Delphi XE / mysql-5.5.17-win32.msi
  • С помощью чего можно сделать что-то подобное как в ACDSee, а именно:
    # Увеличить/уменьшить изображение
    # При большом увеличении изображения перемещать его для просмотра отдельных частей
  • Программирование :: Java
  • Доброго времени суток!Столкнулся со следующей задачей:
    _________________________________________________________
    Разработать класс, позволяющий работать с табличными данными.
    Каждая строка таблицы представляется в виде объекта Map.
    Каждая колонка таблицы характеризуется строковым названием (ключ объекта Map)
    Добавлять строки в данную таблицу можно с помощью метода add(Map map)
    Для данной таблицы должно быть возможно указывать порядок сортировки по заданной колонке
    Должен быть реализован механизм разбиения данной таблицы на страницы с заданным количество строк (должно возвращаться общее количество страниц и получение итератора на данную страницу).
    В таблице должны присутствовать данные, представляющие собой денежные суммы. Должна быть обеспечена возможность ввода/вывода этих данных в фотмате xxx.xxx,dd
    _______________________________________________________

    Вобщем,смысл задания в том,что продемонстрировать степень владения методами Map, но у меня возник вопрос: как в моём случае Map лучше реализовать: при помощи HashTable, HashMap или TreeMap? Заранее спасибо)
  • Программирование :: Программирование 1С :: 1С 8.x
  • Добрый день, очень нужна подсказка.
    Опишу суть проблемы: пытаюсь с помощью обработки запущенной из  7.7 загрузить данные с Бухгалтерии 8.2 , запрос отрабатывает без ошибок, но в выборке данных нет.
    Пыталась этот запрос просто выполнить в 8.2 и посмотреть таблицу значений, но увы, данных нет, хотя по прежнему не ругается на выполнения запроса.

    Текст запроса:


    Код: (e1cv8)
    Запрос = Новый Запрос;
    Запрос.Текст =

    "ВЫБРАТЬ
    |ППВхТаблица.Ссылка.Номер,
    |ППВхТаблица.Ссылка.Дата КАК Дата,
    |ППВхТаблица.Ссылка.Организация.Код,
    |ППВхТаблица.ДоговорКонтрагента.Код,
    |ППВхТаблица.ДоговорКонтрагента.Владелец.Наименование,
    |СУММА(ППВхТаблица.СуммаДокумента) КАК СуммаДокумента,
    |ПОДСТРОКА(ППВхТаблица.Ссылка.Комментарий, 1, 100) КАК Поле1,
    |ПРЕДСТАВЛЕНИЕ(ППВхТаблица.Ссылка.ВидПлатежа)
    |ИЗ
    |Документ.ПлатежноеПоручение КАК ППВхТаблица
    |ГДЕ
    |ППВхТаблица.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    |И ППВхТаблица.Ссылка.Проведен = ИСТИНА
    |И ППВхТаблица.Ссылка.Организация.Код = &ОрганизацияКод
    |СГРУППИРОВАТЬ ПО
    |ППВхТаблица.Ссылка.Номер,
    |ППВхТаблица.Ссылка.Дата,
    |ППВхТаблица.Ссылка.Организация.Код,
    |ППВхТаблица.ДоговорКонтрагента.Код,
    |ППВхТаблица.ДоговорКонтрагента.Владелец.Наименование,
    |ПОДСТРОКА(ППВхТаблица.Ссылка.Комментарий, 1, 100),
    |ПРЕДСТАВЛЕНИЕ(ППВхТаблица.Ссылка.ВидПлатежа)
    |УПОРЯДОЧИТЬ ПО
    |Дата
    |";

    Запрос.УстановитьПараметр("ДатаНачала" ,НачалоДня(ДатаС));
    Запрос.УстановитьПараметр("ДатаКонца" ,КонецДня(ДатаПо));
    Запрос.УстановитьПараметр("ОрганизацияКод",Организация.Код);

    ВыбКИ = Запрос.Выполнить();

    ТаблицаЗначений = Новый ТаблицаЗначений;
             ТаблицаЗначений = ВыбКИ.Выгрузить();

    ТаблицаЗначений.ВыбратьСтроку();

  • Программирование :: Программирование 1С :: 1С 8.2: Управляемое приложение
  • Подскажите пожалуйста, где можно прочитать про индексы в Конструкторе запросов ?
    Для чего он и нужны ?

    Спасибо!
  • Доброго всем времени суток!

    Суть в следующем:
    Есть нетиповая конфигурация Бух 8.2.25.5. Обновляю методом сравнения и объединения на следующий релиз 8.2.26.8.
    Снимаю галочку на измененных мной объектах(В новом релизе эти объекты не изменены).
    Объединяю. Заново сравниваю. Почему-то не переносятся некоторые объекты (формы отчетов и документов).
    Режим - взять из файла.

    В чем может быть причина ?
  • Направления программирования :: Web :: Серверные скрипты
  • Есть текст содержащий кавычки, апострофы, амперсанды

    Бла "бла" 'бла' &бла& <a href="адрес ссылки, может содержать & ">ссылка может содержать спецсимволы</a> <любой текст в знаках больше меньше> <img src="адрес картинки может содержать &" alt="" />, а таже другие элементы разметки html, с атрибутами, значение которых заключается в двойные/одинарные кавычки

    Чтобы все правильно выводилось и работало необходимо спецсимволы в тексте заменить на их html сущности,
    но в тегах их не трогать, только амперсанд (&)

    Кодировка UTF-8

    htmlspecialchars( текст, ENT_QUOTES, 'UTF-8')
    htmlentities

    Действуют на весь текст

    Может как-то попытаться разрулить ситуацию регулярными выражениями с callback'ом (preg_replace_callback)
    Но здесь стоит вопрос о правильном регулярном выражении
    Попробовал несколько вариантов
    что-то не выходит каменный цветок

    Как написать регулярку, чтоб не затронуть параметры тегов. Т.е. теги исключить из процесса замены.



     
  • Если кто-нибудь когда-нибудь работал с FPDF то у меня к вам вопрос, у меня такая проблема, у меня всё настроенно, через PHP генерирует всё что я хочу, а вот спец символы, типа там всяких ЛЯмда, фи, эпсилон, как туда подключить я вот и не знаю, может есть где расширение класса? Я когда-то на такое расширение натыкал, ну и так глянул и забыл про него, а сейчас очень нужно, ни кто не знает где найти можно?

    Зарание спасибо, Павел.
  • Практические разделы :: Базы данных
  • Суть проблемы:
    делаю БД в Access 2010 для одной фирмочки (учет заказов) в многопользовательском варианте. Одна база - таблицы (играет роль сервера), остальные базы - как бы клиенты, связанные с таблицами. Использую ADO для соединения с таблицами, вроде всё ничего, но бывает, что Access неожиданно прекращает работу с предложением сообщить разработчикам, если я найду способ решения этой проблемы. Насколько вообще надежен Аксесс для нелокального использования (число записей в главной таблице порядка 3-4 тыс)?

А теперь прощаемся с Вами до следующего выпуска.


С уважением, команда Клуба.


В избранное