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

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


Клуб профессиональных программистов "Весельчак У"
Информационная рассылка сайта и форума.  Выпуск No80 (2009-11-15).

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

  • Программирование :: Общий
  • Lazarus при компиляции создаёт очень большие исполняемые файлы (больше 10 МБ), работать с такими файлами на домашних дисках с квотой 15 МБ ученикам невозможно.
    Помогите исправить данную ситуацию.
  • Всем доброго времени суток.  Так как не нашел отдельного раздела по Python'у, решил написать сюда (хотя, может, плохо искал?)

    У меня возникла необходимость получить список директорий на определенном ftp сервере, и в общем случае проблем с этим нет, нижеприведенный кусочек кода это делает

    Код:
     
    from ftplib import FTP

    filmsdir  = '/pub/video/films'

    ftp = FTP('172.16.8.22')
    ftp.login()
    ftp.cwd(filmsdir)
    ftp.retrlines('LIST')

    ftp.quit()

    Но если у нас названия директорий на великом и могучем, то я получаю вот это (кодировку  имен файлов на ftp я так и не определил)

    Код:
    drwxr-xr-x   87 ftp      ftp          4096 Oct 30 13:25 Äðàìû
    drwxr-xr-x   30 ftp      ftp          4096 Oct 23 21:01 Èñòîðèåñêèå
    drwxr-xr-x  240 ftp      ftp          4096 Oct 31 18:41 Êîìåäèè
    drwxr-xr-x   49 ftp      ftp          4096 Oct 23 20:02 Ìåëîäðàìû
    drwxr-xr-x   17 ftp      ftp          4096 Apr 10  2009 Ìèñòèêà
    drwxr-xr-x   27 ftp      ftp          4096 Oct 28 23:25 Ïðèêëþåíèÿ
    drwxr-xr-x   69 ftp      ftp          4096 Oct 23 20:53 Ðóññêîå êèíî
    drwxr-xr-x  194 ftp      ftp          4096 Oct 29 22:55 Ñåðèàëû
    drwxr-xr-x    6 ftp      ftp          4096 Sep 16  2007 Ñòàðûå ôèëüìû
    drwxr-xr-x   65 ftp      ftp          4096 Jul 20 08:39 Òðèëëåð_Äåòåêòèâû
    drwxr-xr-x  108 ftp      ftp          4096 Oct 31 18:52 Óæàñû



    Подскажите, как справиться с кодировкой или куда дальше копать?
  • Программирование :: .NET технология от и до
  • Вот создал я XML-документация к проекту, файл создался. Все хорошо. А вот как бы теперь так сделать, чтобы этот файл ХМЛ мне представили в каком-то более красивом/читабельном ввиде, чисто уже для пользования человеком?
  • Во многих программах (напр. FAR Manager) применительно к диску отображается такой параметр, как Serial Number. Как его можно получить под C#? В System.IO.DriveInfo не нашел :( .
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • наверное, вопросы к Джону )

    в общем, вопросы такие

    1) имеется диалог D с уже положенным на него в редакторе контролом K.
      Если делаем GetDlgItem(K_ID)->DestroyWindow(), а потом заменим на свой контрол K2 через K2.Create, как потом система обходится с экземпляром контрола K- он автоматически освободится ? То есть убили его и забыли ? (я полагаю, что просто m_hWnd подменяется, то есть, с точки зрения диалога как бы ничего и не произошло)

    2) если изначально на диалоге нет контрола K , создаём через new, крепим к диалогу через Create, то нужно ли потом вызывать для контрола DestroyWindow или достаточно его delete ?
  • Программирование :: С/С++ :: Borland C/C++
  • Здравствуйте, ситуация такая: нужно заставить иконку в трее мигать.
    Нашел, как заставить мигать приложения в панели задач:
    Код:
    FlashWindow(Application->Handle, false);
    FlashWindow(Application->Handle, true);
    Ну, соответственно, в таймере прописано
    A вот как иконку в трее заставить??
    Попробовал написать
    Код:
    FlashWindow(TrayIcon1->Handle, false);
    FlashWindow(TrayIcon1->Handle, true);
    Не помогло :(
    Может, надо как то перерисовывать..
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • Всем привет:)

    Помогите советом. :) Нужно выбрать из всей таблицы первый столбец и в нём произвести поиск (например, все 5 заменить на 1), я вот что-то уже с этим столбцом запарился, понять не могу, как работает SelectColumn, вот код написал:

    Код:
     Selection.Find.Replacement.ClearFormatting
            Selection.Find.ClearFormatting
            A = ActiveDocument.Tables(1).Columns(1)
            Selection.SelectColumn
            A.Find.Text = "5"
            A.Find.Replacement.Font.Superscript = True
            A.Find.Replacement.Font.Subscript = False
            A.Find.Replacement.Text = "йцукен"
           A.Find.Forward = True
            A.Find.Wrap = wdFindContinue
            A.Find.Format = True
            A.Find.MatchCase = False
            A.Find.MatchWholeWord = False
            A.Find.MatchWildcards = False
            A.Find.MatchSoundsLike = False
            A.Find.MatchAllWordForms = False
            A.Find.Execute Replace:=wdReplaceAll

    Вот эти строки - это, как я думаю, выбор первого столбца:
     A = ActiveDocument.Tables(1).Columns(1)- в этой строке выдаёт ошибку, что, мол, Отсутствует доступ к отдельным столбцам, поскольку ячейки таблицы имеют разную ширину.
     
    Selection.SelectColumn

  • Всем привет!:)
    Подскажите, если не трудно, такая проблема: нужно написать макрос, чтобы он находил на странице, например, все буквы Q, и заменял их на единицу, но уже в виде надстрочного символа (это вроде степени, например, А в квадрате:)))

    Я вот написал:

    Код:
    Selection.Find.Replacement.ClearFormatting
            Selection.Find.ClearFormatting
            Selection.Find.Text = "Q"
            Selection.Find.Replacement.Font.Superscript = wdToggle
            Selection.Find.Replacement.Text = "1"
            Selection.Find.Forward = True
            Selection.Find.Wrap = wdFindContinue
            Selection.Find.Format = False
            Selection.Find.MatchCase = False
            Selection.Find.MatchWholeWord = False
            Selection.Find.MatchWildcards = False
            Selection.Find.MatchSoundsLike = False
            Selection.Find.MatchAllWordForms = False
        Selection.Find.Execute Replace:=wdReplaceAll

    Но этот код почему-то просто замещает все Q на 1, без перевода их в надстрочные.
    Помогите, пожалуйста:)
  • Программирование :: Java
  • Здравствуйте опять.
    Небольшая программка, получает от пользователя double-число, потом ещё одно, обрабатывает и выдаёт результат. Выглядит примерно так:

    Код:
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Первое число: ");
        double op1 = in.nextDouble();
        System.out.print("Второе число: ")
        double op2 = in.nextDouble();
        System.out.println(op1 + " * " + op2 + " = " + (op1 * op2));
    }

    Если при запросе "Первое число: ", ввести сразу два через пробел, то программа сразу выдаёт результат. Удобно, но потом может понадобиться избавиться от подобных проблем.

    Вопрос: как после получения числа от пользователя и сохранения его, как переменной, очистить буфер клавиатуры?
  • И снова здравствуйте.
    Маленькая программка, получает сканером double от пользователя, обрабатывает и выводит результат.

    Дело в том, если пользователь ввёл число с точкой, а не с запятой, появляется "InputMismatchException", пытаюсь его отловить:

    Код:
    int i =0;
    do {

        try{

            System.out.println("Введите число: ");
            Double op1 = in.nextDouble();

            System.out.println(op1 * op1);

        } catch (InputMismatchException e) {

            System.err.println("Число введено неверно!");

        }
    }
    while (i == 0);

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

    Проблема в том, что если всё-таки возникает исключение, то программа выводит следующее:

    Код:
    Введите число: 1.1

    Число введено неверно!
    Exception in thread "main" java.util.InputMismatchException

    Введите число:        at java.util.Scanner.throwFor (Scanner.java: 840)
            at java.util.Scanner.next (Scanner.java: 1461)
    и т.д.

    Как заставить "try/catch" ничего не возвращать?
    Просто {return;} пробовал, но он прерывает выполнение программы.
  • Программирование :: Perl
  • Всем привет, возникла проблемка...
    Есть сервер Апач, на котором стоит mod_perl, есть база postgres.
    На сайте есть скрипт, который время от времени закидывает в базу данные. Так вот, если база пуста, то все проходит нормально.
    Если база не пуста, т.е. данные перезаписываются, то появляется ошибка DBD::Pg::db "array must be one-dimensional"

    С чем это может быть связано?
  • Программирование :: Программирование 1С
  • Доброго времени суток, друзья! Надеюсь на вашу помощь. Вот в чем суть проблемы:
    В 1С Управление торговлей для Украины (платформа 8.1 (8.1.15.14)), конфигурация (2.3.6.4) в рабочем месте менеджера по продажам, в закладке "Остатки и цены" характеристики товара сортируются по времени добавления (я так понимаю, что по своему коду). После проводки документов я хочу добавить некоторые характеристики в позицию. Но после этого в закладке "Остатки и цены" новые характеристики перемещаются вверх списка.
    Хотелось бы в идеальном случае иметь сортировку в данном месте по алфавиту, но как это сделать я к сожалению не нашел в конфигураторе. Подскажите, пожалуйста. заранее спасибо
  • Программирование :: Программирование 1С :: 1С 8.x
  • Уважаемые форумчане, помогите молодому неопытному, решил на досуге занятся конфигуратором 1с, скачал книжонку и кноплю потихоньку, но вот столкнулся с проблемой (т.е. с ошибкой). В книге написано:

    "Найдем в конфигураторе документ «ОказаниеУслуги» и откроем его форму «ФормаДокумента». Откроем свойства поля ввода, расположенного в колонке «Номенклатура» и внизу списка найдем событие «При изменении». Нажмем на кнопку с лупой и в открывшейся заготовке обработчика события напишем следующий текст:"

    и собственно текст
    ПроцедураПереченьНоменклатурыНоменклатураПриИзменении(Элемент)
       //получить текущую строку табличной части
    СтрокаТабличнойЧасти = ЭлементыФормы.ПереченьНоменклатуры.ТекущиеДанные;
       //установить цену
    СтрокаТабличнойЧасти.Цена = РозничнаяЦенаДата, Элемент.Значение);
       //пересчитать сумму строки
    РассчитатьСумму(СтрокаТабличнойЧасти); КонецПроцедуры


    делаю все как написано и выдает ошибку
    "{Документ.ОказаниеУслуг.Форма.ФормаДокумента(94,46)}: Неопознанный оператор
    СтрокаТабличнойЧасти.Цена = РозничнаяЦенаДата<<?>>, Элемент.Значение)
    ;"

    подскажите пожалуйста :(
  • Здравствуйте. Помогите, пожалуйста, разобраться с табличным документом.
    Есть отчет, в котором можно изменять значения в нескольких ячейках. Есть кнопка "Записать", которая введет изменения в документы, если в этих ячейках что-то изменилось.
    Не могу понять, как именно получить доступ к значениям этих ячеек (хотя структуру табл. документа изучил в справке:)). Сам  табличный документ это ТабДок=ЭлементыФормы.ПолеТабличногоДокумента. У него имеется область "Детали". Как же узнать, что хранится в ячейках после изменения?
  • Подскажите пожалуйста, как в 8.2 просклонять фамилию. Нужно получить родительный падеж.
  • Товарищи, в 1С абсолютный новичок, i need help
    Задача: есть база на 8.1, необходимо создать web-страничку, в которую грузить данные из этой базы в дерево-меню, с его пресловутыми "плюсиками"(в базе все подчинённости соблюдены), также на странице должен присутствовать ChelBoxList для выборки данных и т.д.

    Моя реализация: Сконвертировать базу в SQL, интерфейсные компоненты с обработками написать в Visual Studio 2005 (C#), затем всё это дело сверстать на html.

    Вопрос: а можно как-нибудь попроще это дело реализовать?

    Заранее благодарна!
  • Операционные системы :: Windows
  • Народ, кто пользовался, поделитесь впечатлениями?
    Собственно, интересует сравнение ее с Win XP. Собираюсь поставить посмотреть, что это и с чем его едят, хотелось бы послушать тех, у кого уже есть опыт. В данный момент у меня Win Xp Pro SP3 без MUI.
  • Есть ли такая программа, чтобы могла разделить диск жёсткий на 2 части... без переустановки и формата диска?
    Т.е. у меня ситуация такая: у меня 2 раздела - локальный С и Д, на одном не хватает места. И вот, к примеру, можно ли с помощью такой программы (если она есть, конечно) перенести 5 гигабайт с Д на С?
  • Направления программирования :: Drivers
  • Доброго всем времени суток...
    Появилась идейка связать компьютер и внешнее устройство (PIC18F4550) через USB шину (metod BUFFERED, тип передачи изохорный). От системы (PIC18F4550) требуется, для начала, получить (от хоста) и передать хосту 2 слова данных. С внешним устройством проблем нет (программой), а на компьютер есть.
    Драйверами начал заниматься где-то около месяца назад, прочитал умные книги : Агуров, Уолтер Они, и теперь в голове каша полная.
    Взял пример из DDK isoUSB за основу (правильно ли это?). На мой взгляд, там слишком много включено ненужных (необязательных) функций драйвера (так ли это?).
    Я уяснил, что есть обязательные функции: DriverEntry, DriverUnload, AddDevice.
    Рабочие процедуры регистрируются:

        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsoUsb_DispatchDevCtrl;
        DriverObject->MajorFunction[IRP_MJ_POWER]          = IsoUsb_DispatchPower;
        DriverObject->MajorFunction[IRP_MJ_PNP]            = IsoUsb_DispatchPnP;
        DriverObject->MajorFunction[IRP_MJ_CREATE]         = IsoUsb_DispatchCreate;
        DriverObject->MajorFunction[IRP_MJ_CLOSE]          = IsoUsb_DispatchClose;
        DriverObject->MajorFunction[IRP_MJ_CLEANUP]        = IsoUsb_DispatchClean;
        DriverObject->MajorFunction[IRP_MJ_READ]           =
        DriverObject->MajorFunction[IRP_MJ_WRITE]          = IsoUsb_DispatchReadWrite;
        DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = IsoUsb_DispatchSysCtrl;
        DriverObject->DriverUnload                         = IsoUsb_DriverUnload;
        DriverObject->DriverExtension->AddDevice           = (PDRIVER_ADD_DEVICE) IsoUsb_AddDevice;

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

        DriverObject->MajorFunction[IRP_MJ_CREATE]         = IsoUsb_DispatchCreate;
        DriverObject->MajorFunction[IRP_MJ_CLOSE]          = IsoUsb_DispatchClose;
        DriverObject->MajorFunction[IRP_MJ_READ]           = IsoUsb_DispatchReadWrite;
        DriverObject->MajorFunction[IRP_MJ_WRITE]          = IsoUsb_DispatchReadWrite;
        DriverObject->DriverUnload                         = IsoUsb_DriverUnload;
        DriverObject->DriverExtension->AddDevice           = (PDRIVER_ADD_DEVICE) IsoUsb_AddDevice;

    Помогите "разложить все по полочкам".
    Конкретные вопросы будут потом.
    СПАСИБО.
  • Направления программирования :: Сети
  • Доброго всем времени суток)))
    Моя проблема состоит в следующем: при передаче данных с сервера клиенту половина данных теряется. То есть, просто не доходит до клиента. Клиент и сервер работают в асинхронном режиме. Уже второй день сижу и не могу понять, почему так происходит. Может кто-нибудь уже сталкивался с такой проблемой? И еще один вопрос в связи с этим: может ли переполняться очередь сообщений до того, как их прочитает клиент?
    P.S.:
    Сокеты потоковые.
  • Направления программирования :: Техно
  • Есть одна машина на ней развернута  ситема сбора данных и установле ОРС сервер предоставляющий возможность обращаться к данным. Подключаться к OPC нужно со скады установленой на другой машине....

    Когда обе машины загружене под админом все работает без проблем....
    но если скада запускается от имени обычного пользователя все перестает работать, скада не может присоеденится к OPC, да он вобщемто и не запускается по запросу.
    Дал пользователю в "Абменистрировании компонентов" все права какие можно, пофиг.
    Обе машины XP про.

    Подскажите куда смотреть или чем можно поупать OPC  на предмет того что не срабатывает и почему он не стартует?

         
  • Практические разделы :: Базы данных
  • Проблема в том что функция SUM работает только с числовыми типами данных :(, а мне надо в селекте выбрать сумму строк (простая конкатенация). Select - обычный запрос c GROUP BY. Если бы был числовой тип, то SUM дала бы арифметическую сумму, а мне то надо "сложить" строки ...  Может можно свою БД-функцию сделать? Но надо чтобы она работала в самых разных селектах с разными таблицами и WHERE условиями. Общее у селектов - только GROUP BY и тип колонки - строковый.  Может решения нет и надо каждый раз организовывать цикл, внутри которого клеить строки? Не хотелось бы :((
    P.S.  БД - Microsoft SQL Server
  • Добрый день, подскажите в чём может быть проблема?

    Конструирую репорт в нём List  и внутри все данные. Генерирует репот отлично, но когда переходишь в Print Layout или конвертируешь в pdf,  то получаешь результат такой : 1 страница пустая, 2 заполнена, 3 пустая, 4 заполнена...

    Поскажите где искать ошибку?
    Заранее спасибо
  • Практические разделы :: Графика и дизайн
  • Всем привет, вот решил создать класс небесной оболочки, используя файл эффекта из "Кнут"а.
    После нескольких дней мучений, иправления тонны ошибок , просмотра десятков сайтов по этой тематике дошёл до того что эффект рисует этот куб, но кубическая текстура ресуется только с одной стороной, неправильно повёрнута да ещё и занимает 1/4 стороны куба...ППЦ
    (http://skybox_prscreen.jpg)

    Вот файл класса куба

    sky_model.cpp
    Код:
    #include "sky_model.h"

    struct Vertex
    {
    Vertex(){}
    Vertex(
    float x, float y, float z
      )
    {
    _x  = x;  _y  = y;  _z  = z;
    }
    float _x, _y, _z;
    };
    #define FVF_VERTEX (D3DFVF_XYZ)

    cSkyModel::cSkyModel(IDirect3DDevice9* device, Camera* TheCamera)
    {
    Device = device;
    D3DXMatrixIdentity(&_world);
    _bgtexture = 0;
    _SkyBoxEffect = 0;

    _WorldViewProjHandle = 0;

    _TexHandle = 0;
    _SkyBoxTechHandle = 0;
    D3DXMatrixIdentity(&_WorldViewProj);

    _TheCamera = TheCamera;
    }

    cSkyModel::~cSkyModel()
    {
    if(_vb){_vb->Release(); _vb = 0;}
    if(_ib){_ib->Release(); _ib = 0;}
    if(_bgtexture) _bgtexture->Release();

    // Device->Release(); // закомить- иначе ошибка gпри закрытии приложения, уберается один раз
    }

    bool cSkyModel::CreateCube( void )
    {
    Device->CreateVertexBuffer(
    24 * sizeof(Vertex),
    D3DUSAGE_WRITEONLY,
    FVF_VERTEX,
    D3DPOOL_MANAGED,
    &_vb,
    0);

    Vertex* v;
    float W=1.0f, H=1.0f, L=1.0f;
    _vb->Lock(0, 0, (void**)&v, 0);

    // build box

    // fill in the front face vertex data
    v[0] = Vertex( -W, -H, -L);
    v[1] = Vertex( -W,  H, -L);
    v[2] = Vertex(  W,  H, -L);
    v[3] = Vertex(  W, -H, -L);

    // fill in the back face vertex data
    v[4] = Vertex( -W, -H,  L);
    v[5] = Vertex(  W, -H,  L);
    v[6] = Vertex(  W,  H,  L);
    v[7] = Vertex( -W,  H,  L);

    // fill in the top face vertex data
    v[8]  = Vertex( -W,  H, -L);
    v[9]  = Vertex( -W,  H,  L);
    v[10] = Vertex(  W,  H,  L);
    v[11] = Vertex(  W,  H, -L);

    // fill in the bottom face vertex data
    v[12] = Vertex( -W, -H, -L);
    v[13] = Vertex(  W, -H, -L);
    v[14] = Vertex(  W, -H,  L);
    v[15] = Vertex( -W, -H,  L);

    // fill in the left face vertex data
    v[16] = Vertex( -W, -H,  L);
    v[17] = Vertex( -W,  H,  L);
    v[18] = Vertex( -W,  H, -L);
    v[19] = Vertex( -W, -H, -L);

    // fill in the right face vertex data
    v[20] = Vertex(  W, -H, -L);
    v[21] = Vertex(  W,  H, -L);
    v[22] = Vertex(  W,  H,  L);
    v[23] = Vertex(  W, -H,  L);

    _vb->Unlock();

    Device->CreateIndexBuffer(
    36 * sizeof(WORD),
    D3DUSAGE_WRITEONLY,
    D3DFMT_INDEX16,
    D3DPOOL_MANAGED,
    &_ib,
    0);

    WORD* i = 0;
    _ib->Lock(0, 0, (void**)&i, 0);

    // fill in the front face index data
    i[0] = 0; i[1] = 1; i[2] = 2;
    i[3] = 0; i[4] = 2; i[5] = 3;

    // fill in the back face index data
    i[6] = 4; i[7]  = 5; i[8]  = 6;
    i[9] = 4; i[10] = 6; i[11] = 7;

    // fill in the top face index data
    i[12] = 8; i[13] =  9; i[14] = 10;
    i[15] = 8; i[16] = 10; i[17] = 11;

    // fill in the bottom face index data
    i[18] = 12; i[19] = 13; i[20] = 14;
    i[21] = 12; i[22] = 14; i[23] = 15;

    // fill in the left face index data
    i[24] = 16; i[25] = 17; i[26] = 18;
    i[27] = 16; i[28] = 18; i[29] = 19;

    // fill in the right face index data
    i[30] = 20; i[31] = 21; i[32] = 22;
    i[33] = 20; i[34] = 22; i[35] = 23;

    _ib->Unlock();


    //////////////////////////////////////////////////////////////////////
    //
        // Создание эффекта
        //
        HRESULT hr = 0;
    ID3DXBuffer* errorBuffer = 0;
        hr = D3DXCreateEffectFromFile(
               Device,           // связанное устройство
               "simple_skybox.fx",  // имя файла эффекта
               0,                // нет определений препроцессора
               0,                // нет интерфейса ID3DXInclude
               D3DXSHADER_DEBUG, // флаги компиляции
               0,                // нет совместного использования параметров
               &_SkyBoxEffect,   // возвращает указатель на интерфейс эффекта
               &errorBuffer);    // возвращает сообщения об ошибках

        // Выводим любые сообщения об ошибках
        if(errorBuffer)
        {
             ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
    errorBuffer->Release();
        }

        if(FAILED(hr))
        {
              ::MessageBox(0, "D3DXCreateEffectFromFile() - FAILED", 0, 0);
              return false;
        }

        //
        // Сохраняем дескрипторы часто используемых параметров
        //
        _SkyBoxTechHandle  = _SkyBoxEffect->GetTechniqueByName("BasicCubeMap");
    _WorldViewProjHandle = _SkyBoxEffect->GetParameterByName(0, "mWorldViewProj");
        _TexHandle         = _SkyBoxEffect->GetParameterByName(0, "tex0");

        //
        // Устанавливаем параметры эффекта
        //
        // Матрица
        _SkyBoxEffect->SetMatrix(_WorldViewProjHandle, &_WorldViewProj);
        // Текстура
    hr = D3DXCreateTextureFromFile(Device, "models/skybox1.dds", &_bgtexture); //skybox1.dds
    if(FAILED(hr) )
    {
    ::MessageBox(0, "SkyBox->D3DXCreateTextureFromFile() - FAILED", 0, 0);
              return false;
    }
        _SkyBoxEffect->SetTexture(_TexHandle, _bgtexture);   

    return true;
    }


    bool cSkyModel::render(bool wireframe)
    {

    Device->SetTransform(D3DTS_WORLD, &_world);

    // Устанавливаем используемую технику
    _SkyBoxEffect->SetTechnique(_SkyBoxTechHandle);
        UINT numPasses = 0;
       
    _SkyBoxEffect->Begin(&numPasses, 0); // техника, пуск

    // Устанавливаем переменные эффекта
    _TheCamera->getSkyBoxMatrix(&_WorldViewProj, Device);
    _SkyBoxEffect->SetMatrix(_WorldViewProjHandle, &_WorldViewProj);
       
    for(int i = 0; i < numPasses; i++)
        {

    _SkyBoxEffect->BeginPass(i); // техника, проход

    Device->SetStreamSource(0, _vb, 0, sizeof(Vertex));
    Device->SetIndices(_ib);
    Device->SetFVF(FVF_VERTEX);
    Device->DrawIndexedPrimitive(
    D3DPT_TRIANGLELIST,
    0,                 
    0,                 
    24,
    0,
    12); 

    }
        _SkyBoxEffect->End(); // техника остановка


    D3DXMATRIX I;
    D3DXMatrixIdentity(&I);
    Device->SetTransform(D3DTS_WORLD, &I);

    return true;
    }

    sky_model.h
    Код:
    #ifndef __sky_modelH__
    #define __sky_modelH__

    #include <string>
    #include <vector>
    #include "camera.h"

    class cSkyModel
    {
    public:
    cSkyModel(IDirect3DDevice9* device, Camera* TheCamera);
    ~cSkyModel();

    bool CreateCube( void );
    bool render(bool wireframe);

    private:

    IDirect3DDevice9* Device;
    D3DXMATRIX _world;

    IDirect3DVertexBuffer9* _vb;
    IDirect3DIndexBuffer9* _ib;
    // Effect
    IDirect3DTexture9* _bgtexture; //текстура куба
    Camera* _TheCamera;
    ID3DXEffect* _SkyBoxEffect;
    D3DXHANDLE _WorldViewProjHandle;
    D3DXHANDLE _TexHandle;
    D3DXHANDLE _SkyBoxTechHandle;
    D3DXMATRIX _WorldViewProj;

    };
    #endif //CSKYBOX_H

    Класс использует камеру(с огромным количеством ненужного кода), которая уже обсуждалась (где-то здесь я видел её, поэтому её код
    приложен но не обсуждается), её задача заключается в создании и передаче матрицы SkyBox эффекту(функция  Camera::getSkyBoxMatrix).

    чтобы запустить эту белиберду :yes: в приложении нужно в...
     своём главном файле включить заголовки
    Код:
    #include "sky_model.h"
    #include "camera.h"

    определить класс камеры и скайбокса
    Код:
    Camera   TheCamera(Camera::LANDOBJECT);
    cSkyModel* _SkyModel;

    далее где-нибудь настроить камеру  и создать скайбокс (один раз :))
    Код:
    TheCamera.setProjParam( Device, D3DX_PI
    * 0.25f, (float)Width/(float)Height, 0, 0);
    Width - ширина экрана
    Height - высота

    // create skymodel
    _SkyModel = new cSkyModel(_device, TheCamera);
    if ( !_SkyModel->CreateCube() )
    {
    ::MessageBox(0, "_SkyModel->CreatePMesh - FAILED", 0, 0);
    ::PostQuitMessage(0);
    }

    Перед рендерингом
    Код:
    TheCamera.ReadInput(timeDelta); 
    // timeDelta - может быть любое число например 0.7f ("чувствительность" камеры)
    // Update the view matrix representing the cameras new position/orientation.
    TheCamera.useCamera( Device );

    теперь в функции рендеринга
    Код:
    if(_SkyModel)
    _SkyModel->render(false);

    вот кажется и всё разжевал :insane:... а да ещё надо при завершении приложения реализовать класс _SkyModel, но это уж как-нибудь сами)
    файл эффекта во вложениях, а кубическую текстуру(models/skybox1.dds) , к сожалению не могу передать, слишком много весит :(

    Мне кажется с матрицей, что передается в эффект(Camera::getSkyBoxMatrix) что-то не так :dontknow:

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


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


В избранное