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

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


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

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

Сегодня в выпуске:



Извиняемся перед читателями нашей рассылки, которые получают ее через сервис content.mail.ru, за некачественное оформление. Причиной тому — сам сервис рассылки, который исправляет исходный материал перед отправкой. Обратите внимание, что сохраненная на их сайте копия выглядит значительно лучше того, что вы получаете в письме. Пример: предыдущий выпуск №81.

За год это уже третье изменение на сервисе, приводящее к искажению рассылки. Служба поддержки сервиса рассылок существует, к сожалению, лишь номинально. Остается надеяться и ждать, что когда-нибудь они устранят существующие неисправности и не создатут при этом новых.

Если кому-либо искаженная рассылка доставляет неудобства, рекомендуем подписаться на нашу рассылку на другом сервисе. Благо, mail.ru не единственный из них.

Список наших рассылок: http://club.shelek.ru/maillists.php.



Содержание.



Живое меню.


Теперь у нас всё готово для оживления меню. А пока пусть по-прежнему будут 3 безымянные кнопки с индексами 0, 1 и 2. Перечислим их:


Код:
class CMyControl:public CStatic
{
enum ee_buttons
{
e_but_noname0,
e_but_noname1,
e_but_noname2,
//
e_but_buttons_count,//количество кнопок
};

Наша задача:

  • оживить кнопку — заставить визуально реагировать на движение мышью и на нажатие;
  • определить возникновение события щелчка по кнопке: после того, как кнопку нажали, должно произойти отпускание кнопки, причём в момент отпускания курсор должен находиться над кнопкой;
  • задать обработчик, который вызывается в ответ на событие щелчка по кнопке.

Оживляем кнопки.


Для демонстрации "живости" кнопок допишем в обработчик OnMouseMove() такой код: ...


Целиком прочесть статью можно на нашем сайте, в разделе «Программирование в ОС::Windows».


Содержание.



Вводная. История идеи.


Не знаю, как кому, а мне сполна хватает штатных возможностей MySQL по генерации уникальных числовых последовательностей. Тем не менее, на форумах, посвященных MySQL, время от времени появляется один и тот же вопрос — как реализовать функционал наподобие SEQUENCE из Oracle. Заявленное применение — использование общей сквозной нумерации записей в нескольких таблицах без создания главной таблицы. Привыкли, понимаешь, к одному интерфейсу и не хотят уже проектировать базы данных иначе.

Не следует забывать, что MySQL и Oracle — СУБД разного класса, и к ним предявляются различные требования: MySQL — легкая, компактная и быстрая СУБД, Oracle же — СУБД более серьезная, насыщенная функционалом, но и более тяжелая в эксплуатации.

Кстати, исторический факт (для тех, кто не знает): на момент написания статьи MySQL принадлежит Sun Microsystems, которая находится сейчас в стадии покупки ее Oracle Corporation. Это означает, что MySQL уже не перейдет в более высокий класс, дабы не создавать конкуренцию Oracle Database — по крайней мере, пока Oracle Corp. не продаст MySQL кому-либо еще.

Ну да ладно с ней, с политикой, вернемся с небес к нашим базам.

В данной статье я хочу в режиме монолога рассмотреть штатные возможности MySQL, принципы работы SEQUENCE и возможность реализовать ее подобие.

Еще в процессе написания первых пунктов я понял, что статья получается длинная и, чтобы быстрее выпустить и чтобы легче читалось, решил разбить ее на части.


Штатные возможности MySQL.


Штатные возможности MySQL крайне просты, хотя и тут есть нюансы.

Для генерации уникальных последовательностей (далее будем условно называть «ID») используется признак AUTO_INCREMENT на целочисленной колонке. При этом колонка обязательно должна быть проиндексирована — должна входить в индекс. Индекс, в отличие от распространенного мнения, не обязан быть PRIMARY KEY или уникальным вообще. Он может быть любым, даже любого формата — BTREE или HASH (используется в MEMORY). Конечно, использование уникальных индексов полезно для обеспечения целостности, но знать о возможностях нужно, чтобы не застревать в общих шаблонах.

...


Целиком прочесть статью можно на нашем сайте, в разделе «Базы данных::MySQL».


  • Программирование :: Технологии разработки программных систем
  • Вопрос про само-обновляемое ПО и как его правильно вписать в архитектуру WinPX и более мудренных в плане защиты Vista и W7.

    Имеется ПО, написанное за 10 или более лет несколькими программистами. Периодически в нем исправляются баги и добавляются фичи. Соответственно, после этого надо обновить установку на всех машинах, где это ПО используется. Машины не персонализированы — все пользователи логинятся в домене Win2003.

    ПО состоит их набора exe, пары dll, сопутствующих неисполняемых файлов и библиотеки в распотрошенном виде.
    Библиотека состоит из кучки dll, часть из которых содержит COM и нуждается в регистрации на машине. Той у нее вид из-за того, что надо держать на каждой машине две версии этой библиотеки.
    Инсталяция простая: от имени текущего пользователя запускается bat-файл, который копирует на машину файлы по списку и регистрит COM-библиотеки. Пока даем пользователям права на административно созданную для ПО папку, право писать в реестр (в его часть) и право регистрировать библиотеки COM-объектов (последние два права дает встроенная группа Power Users). Процесс установки автоматизирован: при запуске программы она проверяет наличие обновления и по необходимости запускает его сама.

    Когда будут появляться машины с Vista и W7, предвижу трудности. Хотелось бы заранее подумать над изменением архитектуры.
  • Программирование :: .NET технология от и до
  • Всем привет! Возникла такая проблема. Мне нужно написать программу в Visual studio 2008, которая выполняет поиск дублирующихся файлов в каталоге или на логическом диске. программа должна предоставлять следующие возможности:
      выполнение поиска файлов, которые дублируются, в заданном пользователем адресном пространстве (логическом диске или каталоге);
      сообщение пользователя о найденных дубликатах; возможность навигации между ними;
      сжатие файлов-дубликатов за алгоритмом GZIP.
     Общие требования интерфейса программы (обязательные элементы):
      поле введения адресного пространства, в котором будет выполняться поиск дубликатов;
      форма с перечнем найденных файлов, которые дублируются, с возможностью их открытия прямо из дополнения (например, двойным нажатием левой кнопки мыши);
      если несколько текстовых файлов имеют дубликаты, то они должны каким-то образом группироваться; например, на диске присутствуют два одинаковых файла - С:\doc\text1.txt но C:\temp\my\text11.txt, а также на этом диске есть еще три файла, которые дублируются, - С:\doc\text2.txt, C:\temp\text.txt но C:\temp\my\text2.txt; тогда пользователю должны представиться две группы файлов, которые дублируются, - text1.txt и text2.txt (названия групп могут быть любые); причем пользователь должен иметь возможность самому избрать из группы файл-оригинал и файл(и) -дублікати;
      у пользователя должна быть возможность сжатия дубликатов за алгоритмом GZIP (за его желанием).

    На данном этапе у меня имеется следующее:
    Есть исходник написанного мной куска программы на С#:
    вот он http://files.mail.ru/LC6PT7

    На данном этапе моя программа по задающемуся пользователем пути отыскивает в каталогах текстовые файлы (*.txt), находит по алгоритму md5 хэш каждого файла сводя их в массив строк и выводя в отдельном текстовом поле формы программы(listbox1). Так вот у меня возникла проблема с тем ,что б потом из полученного масcива из хэшов найти одинаковые строки, свести их в новый массив и вывести в другое строковое поле listbox2.

    Может кто нибудь подскажет как решить мою проблему?...буду премного благодарен. Дело в том что я застрял даже на том ,что не могу получить элементарный контроль над массивом - пытался вывести первую строку...ничего не получилось -почему то выводило все строки сразу.
  • Здравствуйте. Пишу на MS VS 2008. Моя программа блокирует доступ пользователя на определенное время (время отдыха), после окончания  времени работы пользователя (по сути программа-таймер). Для блокирования клавиатуры использовал глобальный хук (WH_KEYBOARD_LL) в основу написания лег материал с http://www.sql.ru/forum/actualthread.aspx?tid=632552 + блокирование диспетчера задач, через изменение реестра.
    Задача: с помощью хука (WH_MOUSE_LL) заблокировать доступ к мыше.
    Вопрос:
     Не знаю как совместить хук клавиатуры и мыши.
    Программа:
    Код:
    .....
            //Функция установки хука
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

            //Функция снятия хука
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern bool UnhookWindowsHookEx(IntPtr hhk);

            //Функция передачи информации следующему приложению "слушающему" клавиатурные события
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern IntPtr GetModuleHandle(string lpModuleName);
    ....
            private const int WH_KEYBOARD_LL = 13;
            private const int WM_KEYDOWN = 0x0100;
            private static LowLevelKeyboardProc _proc = HookCallback;
            private static IntPtr _hookID = IntPtr.Zero;
    ....
    //*******************Функции для работы с Hook*****************************
            private void SetHook(LowLevelKeyboardProc proc)
            {
                if (_hookID != (IntPtr)0) return;  //исключаем повторный хук
                Process curProcess = Process.GetCurrentProcess();
                ProcessModule curModule = curProcess.MainModule;
                _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
           

            private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

            // Функция которая обрабатывает события клавиатуры
            private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
            {
                return (IntPtr)1;
            }
    ....
    private void timerRest_Tick(object sender, System.EventArgs e)
           {
                //присвоим делегат одной из переменных-членов класса, чтоб сборщик мусора не убрал
                // его после окончания первого же вызова функции
                _proc = new LowLevelKeyboardProc(HookCallback);
                // Включение режима
                KillCtrlAltDelete();//блокируем диспетчер задач
                SetHook(_proc); // устанавливаем хук         
                           countSec++;
               
    // счетчик отдыха достиг порогового времени
    if(countSec >= timeRest)
    {
    // оповещение пользователя
    this.notifyIcon.Text = "Таймер не запущен!";

    // отдохнули - можно приcтупать к работе
                    // Выключение режима работы             
                    LiveCtrlAltDelete();//Возобновляем работу диспетчера задач
                    bool b = UnhookWindowsHookEx(_hookID);// снимаем хук
                    if (b == false)
                    {
                        throw new Exception("UnhookWindowsHookEx");
                    }
                                                    countSec = 0;
    timerRest.Stop();
    strPrompt = "Работа!";
    pictureBox1.Invalidate();
    panel1.Visible = false;
    ....
                                 }


    }
  • Программирование :: .NET технология от и до :: WinForms
  • Привет всем...
    У меня такая проблема: скачал класc для работы с COM портом (я так подозреваю, это класc MFC)
    Я сделал приложение в Windows Forms и пытаюсь в это приложение экспортировать этот класc следующим образом:

    extern "C" class __declspec (dllexport)  SerialGate
    {    
    public:
        
        enum IN_LINES_NAME {CTS, DSR, RING, RLSD};
        enum OUT_LINES_NAME {DTR, RTS};    
     
        SerialGate();
        ~SerialGate();    
     
        bool Open(int port, int baud);    
        int Send(char* buff, int szBuff);
        int Recv(char* buff, int szBuff);    
        void SetLine(OUT_LINES_NAME ln, bool state);
        bool GetLine(IN_LINES_NAME ln);
        void GetPortsInfo(PortInfo* pi);
        void Close();
        void Clean();
     
    private:
        HANDLE m_hFile;
        bool state;
    };
     
    и компилятор по этому поводу ругается...
    Подскажите синтаксис экспорта/импорта классов, функций из DLL, искал на MSDN, так по поводу импорта в FORMах ничего нет (или плохо искал)....
  • Программирование :: С/С++
  • Код:
    0: bool foo()
    1: {
    2: int * temp = new int(0);
    3: if(!(temp = new int(1)))
    4: // Не хватило памяти
    5: return false;
    6: }
    Подскажите пожалуйста, после того, как в строке 3 не хватит памяти на виделение нового числа, указатель temp будет указывать на значение 0, или на какую-то другую область памяти?
  • Всем привет!У меня возникла такая проблема. Мне нужно написать программу в Visual studio 2008, которая выполняет поиск дублирующихся файлов в каталоге или на логическом диске. программа должна предоставлять следующие возможности:
       выполнение поиска файлов, которые дублируются, в заданном пользователем адресном пространстве (логическом диске или каталоге);
       сообщение пользователя о найденных дубликатах; возможность навигации между ними;
       сжатие файлов-дубликатов за алгоритмом GZIP.
     Общие требования интерфейса программы (обязательные элементы):
       поле введения адресного пространства, в котором будет выполняться поиск дубликатов;
       форма с перечнем найденных файлов, которые дублируются, с возможностью их открытия прямо из дополнения (например, двойным нажатием левой кнопки мыши);
       если несколько текстовых файлов имеют дубликаты, то они должны каким-то образом группироваться; например, на диске присутствуют два одинаковых файла - С:\doc\text1.txt но C:\temp\my\text11.txt, а также на этом диске есть еще три файла, которые дублируются, - С:\doc\text2.txt, C:\temp\text.txt но C:\temp\my\text2.txt; тогда пользователю должны представиться две группы файлов, которые дублируются, - text1.txt и text2.txt (названия групп могут быть любые); причем пользователь должен иметь возможность самому избрать из группы файл-оригинал и файл(и) -дублікати;
       у пользователя должна быть возможность сжатия дубликатов за алгоритмом GZIP (за его желанием).

    Прошу помогите кто нибуть, незнаю с чего начать.Существует ли какой то алгоритм поиска дублирующихся файлов и по каким критериям вообще производить поиск дублирующихся файлов?.Visual Studio 2008 уже установил, но незнаю что делать дальше  и с чего начинать:-/ :-/ :-/
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Всем привет!

    У меня есть готовый OCX с закрытым исходным кодом, и мне нужно использОвать его в своей программе.

    Моя программа пишется на Visual C++ 6. С этим OCX-ом у меня есть файл TLB.

    Я прочитал, что можно сделать #import этому TLB, и тогда использОвать OCX.

    Вы бы не могли подсказать или обьяснить, как обратитЬся к OCX компоненте?

    Может, мне нужно создать свой класс, который будет обращатЬся к зарегестрированному OCX-у?

    Или такой класс создается сам при #import-е?

    Компонента не графическая, если это имеет значение.

    ЗаранЕЕ благодарю!
  • Наверное, сразу нужно уточнить, что пользуюсь vs 2008 express, в которой отсутствует MFC.

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

    Вот конкретный пример: пользовательское окошко подсказки (tooltip).

    -- В конструкторе m_hWndToolTip = CreateWindow (), диалоговая процедура TTDlgProc ().
    -- static vector<ETOOLINFO>vTools; - массив структур добавленных инструментов, содержащий и оригинальные процедуры этих интрументов.
    -- SubclassProc  () - субклассинг, эта процедура использует информацию из vTools (оригинальные процедуры инструментов под субклассингом), указатель m_hWndToolTip и т.д.

    Код:
    class EncToolTip
    {
    ...

    // Tooltip window:
    private:
    static HWND m_hWndToolTip;
    static HWND m_hWndTTStatic;
    private:
    static LRESULT CALLBACK TTDlgProc (HWND, UINT, WPARAM, LPARAM);

    // Tools:
    private:
    static vector<ETOOLINFO>vTools;     // Массив структур
    static ETTADATA adata;                      // Структура вспомогательных данных
    private:
    static LRESULT CALLBACK SubclassProc (HWND, UINT, WPARAM, LPARAM);

    ...
    };

    Ну так вот, все прекрасно работает, пока не пытаешься создать второй экземпляр данного класса  :shuffle:
    Подскажите, пожалуйста, как сделать правильно.

    Использую express постоянно, все время возникает желание организовать контролы в иерархию. Может быть такое уже релизовано?
  • Программирование :: С/С++ :: Borland C/C++
  • Сделал прогу, которая рисует график. К ней надо приделать ввод данных, так чтобы данные вводились во время работы проги, желательно в другом окне или меню, или вообще хоть как-то.

    Код:
    #include <windows.h>
    #include <iostream.h>
    #include <math.h>
    #define ID_FIRSTCHILD 100
    #define ID_SECONDCHILD 101
    #define ID_THIRDCHILD 102
    #define Pi 3.14159265
    //---------------------------------------------------------------------------
    //Dannie
    //---------------------------------------------------------------------------

    double shag=1;
    double xx=2;
    double x1=-5;
    double x2=5;
    double x3=x2-x1;
    double kolshag=x3/shag;
    int mnogitel=1;
    double udef;
    bool flag=true;

    //---------------------------------------------------------------------------
    //часть 1 - окно
    //---------------------------------------------------------------------------

    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    void DrawDiagram(HWND hWnd, HDC hdc, int offset);

    //---------------------------------------------------------------------------
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    //---------------------------------------------------------------------------
    HWND hWnd;
    MSG msg;
    WNDCLASS wcex;
    //---------------------------------------------------------------------------
    //wcex.cbSize = sizeof(WNDCLASS);  //размер структуры
    wcex.style="CS_HREDRAW" | CS_VREDRAW; //задаем стиль окна, подробнее смотрите в MSDN
    wcex.lpfnWndProc = (WNDPROC)WindowProcedure;  //указываем оконную процедуру
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;  //указываем дескриптор приложениея
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);  //устанавливаем иконку приложения по умолчанию
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //устанавливаем курсор по умолчанию
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //задаем цвет окна
    wcex.lpszMenuName = NULL;     //меню окна - нет меню
    wcex.lpszClassName = szWindowClass;  //указываем класс окна
    //wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //загружаем иконку окна
    RegisterClass ( &wcex );                          // регистрируем класс окна
    NULL);

    hWnd = CreateWindow(
                  szWindowClass,        // имя класса окна
                  szTitle,              // заголовок окна
                  WS_OVERLAPPEDWINDOW,  // стиль окна
                  CW_USEDEFAULT,        // начальная Х-координата окна (или введите значение)
                  CW_USEDEFAULT,        // начальная У-координата окна (или введите значение)
                  CW_USEDEFAULT,        // начальный горизонтальный размер(или введите значение)
                  CW_USEDEFAULT,        // начальный вертикальный размер  (или введите значение)
                  NULL,                 // дескриптор родительского окна
                  NULL,
                  hInstance,            // дескриптор экземпляра программы
                  NULL);                // параметры создания
    if(!hWnd)
    {

      MessageBox(hWnd, "Ошибка создания окна", "Ошибка", IDI_ERROR || MB_OK); //в случае чего - говорим об ошибке
    return 1;
    }

    RECT rcClient;
    //---------------------------------------------------------------------------
    ShowWindow( hWnd , nCmdShow );  // отобразить окно на экране
    UpdateWindow( hWnd );           // вывести на экран рабочую область окна.
    //---------------------------------------------------------------------------
    while(GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return msg.wParam;
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            PAINTSTRUCT ps;  //структура для рисования
    HDC hdc;  //дескриптор устройства (монитор)
    RECT rect;  //область, где рисовать
    static int offset = 0;  //смещение для синусоиды
    SetTimer(hWnd, 1, 3000, NULL);  //устанавливаем таймер обновления рисунка
    switch (message)  //обрабатываем сообщения ос
    {

            case WM_TIMER: // если сообщение - сработал таймер, то...
            GetClientRect(hWnd, &rect);  //получаем рабочую область
            InvalidateRect(hWnd, &rect, true); //объявляем ее недействительной
            UpdateWindow(hWnd); //перерисовываем окно
            return 0;
            case WM_PAINT:   // если сообщение - перерисовать окно, то...
            hdc = BeginPaint(hWnd, &ps); //получаем дескриптор устройства
            DrawDiagram(hWnd, hdc, offset); //рисуем синусоиду
            EndPaint(hWnd, &ps); //заканчиваем рисование
            return 0;
            case WM_DESTROY: // если сообщение - уничтожить окно, то...
            PostQuitMessage(0); //посылаем "прощальное" сообщение операционке
                            return 0;
            default:
            return DefWindowProc(hWnd, message, wParam, lParam); //обработка всех других сообщений
               }
    return 0;
    }
    //---------------------------------------------------------------------------
    //часть2
    //---------------------------------------------------------------------------

    void DrawDiagram(HWND hWnd, HDC hdc, int offset)
    {
    RECT rect;
    GetClientRect(hWnd, &rect);
    GetLastError;
    const int xVE = rect.right - rect.left;
    const int yVE = rect.bottom - rect.top;
    //double nPixPerVolt = yVE / 1000.0;    //у е
    //double nPixPerMs = xVE / 680.0;       //у е
    //---------------------------------------------------------------------------
    int xmin=0;
    int xmax=xVE+56;
    int ymin=-yVE/2;
    int ymax=yVE/2;

    double u;
    double xd=x3/xmax;
    u=xx * cos(xx*xd /* radianPerx * */+xx*x1);
    if(!udef)
            udef=u;
    double yd=(ymax-ymin)/2;
    //*yd;

    //---------------------------------------------------------------------------
    SetMapMode(hdc, MM_ISOTROPIC);
    SetWindowExtEx(hdc, xVE+200, yVE+100, NULL);
    SetViewportExtEx(hdc, xVE+56, -yVE, NULL);  //ctnrf
    SetViewportOrgEx(hdc, 40.0, yVE/2, NULL);
    //---------------------------------------------------------------------------
    char* xMark[]={"1234", "1234", "1234", "1234", "1234","1234", "1234", "1234", "1234", "1234","1234", "1234", "1234", "1234", "1234","1234", "1234", "1234", "1234", "1234","1234", "1234", "1234", "1234", "1234"};
    char* yMark[] = {"  -5 ","  -4 ", "  -3 ", "  -2 ", "  -1 ", "    0", "    1", "    2", "    3", "    4","    5","    6"};

    double perem3=0,perem2=0;
    int perem1=0, perem=0;
    double x1def=x1;

    if(flag)
            while(x1def<=x2)
            {
            sprintf(xMark[perem],"%f",x1def);
            perem++;
            x1def=x1def+shag;
            flag=false;
            }
    //---------------------------------------------------------------------------
    perem2=shag*mnogitel/5;
    perem3=udef-shag*mnogitel;

    while(perem1<=10)
    {
    sprintf(yMark[perem1],"%f",perem3);
    perem1++;
    perem3+=perem2;
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    HPEN hPen1 = CreatePen(PS_SOLID, 1, RGB(200, 200, 200));
    SelectObject(hdc, hPen1);

    int x=xmin, xshag=xmax/kolshag;
    int y=ymin, yshag=(ymax-ymin)/10;

    for(int i = 0; i <= kolshag; ++i)
    {
            TextOut(hdc, xmin-40, y+8, yMark[i], sizeof(yMark[i]));
            TextOut(hdc, x+4, -8, xMark[i], sizeof(xMark[i]));
            MoveToEx(hdc, x, ymin, NULL); //перемещаемся в заданную точку
    LineTo(hdc, x, ymax);         //рисуем туда линию
            MoveToEx(hdc, xmin, y, NULL); //перемещаемся в заданную точку
    LineTo(hdc, xmax, y);         //рисуем туда линию
            x=x+xshag;
            y=y+yshag;
    }
    //---------------------------------------------------------------------------
    HPEN hPen0 = CreatePen(PS_SOLID, 3, RGB(0, 160, 0));
    HPEN hOldPen = (HPEN)SelectObject(hdc, hPen0);
            MoveToEx(hdc, xmin, ymin, NULL); //перемещаемся в заданную точку
    LineTo(hdc, xmin, ymax);         //рисуем туда линию
            MoveToEx(hdc, xmin, 0, NULL); //перемещаемся в заданную точку
    LineTo(hdc, xmax, 0);         //рисуем туда линию
    //---------------------------------------------------------------------------
    //формула и вывод
    //---------------------------------------------------------------------------
    HPEN hPen2 = CreatePen(PS_SOLID, 3, RGB(200, 50, 50));
    SelectObject(hdc, hPen2);

    int tStep = 1; //задаем шаг графика
    //double radianPerx = 180 / Pi   ;  //вычисляем угол радиан   (1-udef)/(shag*mnogitel)
    int h=0;
    double uravnoves=(shag*mnogitel);
    MoveToEx(hdc, 0, ((u-udef)/ uravnoves )* yd, NULL); //вычисляем начальную точку
    while( h <= xmax)   //до достижения максимального значения х графика
    {
            h += tStep;
    u = (xx * cos(xx*h*xd /* radianPerx * */+xx*x1)); //вычисляем косинус
    LineTo(hdc, h , ((u-udef)/ uravnoves )* yd+0 ); //рисуем линию
            if(u<(udef-shag*mnogitel)||(u>udef+shag*mnogitel))
                    {
                    if(u>udef+shag*mnogitel)
                            udef+=shag*mnogitel;
                    else
                            udef-=shag*mnogitel+0;
                    mnogitel*=2;
                    h=xmax+1;
                    }
    }
    }
    //---------------------------------------------------------------------------

    Нужен ввод shag, x1, x2, xx
    Подскажите, плз, как делать. Хотяб какими функциями или как.
    Пробовал инпатбоксом, нормально он не работал, либо не было возможности передать значение функции.
    Пробовал меню, дочерние окна, другие окна, ничего не получилось(
  • Программирование :: Delphi
  • Как можно сделать в Delphi обращение к командной строке? Есть ли какая-нибудь функция?
    Например: существует адрес папки, и неодходимо с помощью команды DIR в определенный файл записать все файлы из этой папки с расширениями...
  • Мне не обходимо для начала сделать так, чтобы можно было выбрать папку, в которой находятся файлы, которые будут использоваться, т.е. мне необходимо сохранить ее адрес.Может в Delphi существует атрибут, который выбирает атрибут?Заранее спасибо  :)
  • Программирование :: VisualBasic :: Visual Basic for Applications
  • помогите удалить объект в autocad при помощи VBA, please.
  • И подсветить их, что-ли, или в список вывести... даже не знаю, что лучше и с чего начать. Касается Word. Суть - потом вручную убрать дубли, заменив на синонимы.
  • Программирование :: Программирование 1С
  • Здравствуйте! Подскажите, пожалуйста! Загружаю из Excel данные, хочу обратиться к именованной области, выдает следующую ошибку: "Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
    ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
    по причине:
    Произошла исключительная ситуация (0x800a03ec)"





    Процедура ОсновныеДействияФормыЗагрузить(Кнопка)

    НомерКолонкиАртикул = ЭлементыФормы.ТабличныйДокумент.Область("R2C1";
    НомерКолонкиНаименованияТовара = ЭлементыФормы.ТабличныйДокумент.Область("R2C2";
    НомерКолонкиЕдиницаИзмерения = ЭлементыФормы.ТабличныйДокумент.Область("R2C3";
    НомерКолонкиСтрана = ЭлементыФормы.ТабличныйДокумент.Область("R2C4";

    //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
    Excel = новый COMОбъект("Excel.Application";


    Версия = Лев(Excel.Version,Найти(Excel.Version,"."-1);
    Если Версия = "8" тогда
    ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
    ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
    Иначе
    ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
    ФайлКолонок = Excel.Cells(2,1).SpecialCells(21).Column;
    Конецесли;


    // Выбираем данные из файла
    Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

    //Полуим данные из соответсвующих ячеек
    Артикул = СокрЛП(Excel.Cells(а,Артикул).Value);
    НаименованиеТовара = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
    ЕдиницаИзмерения = СокрЛП(Excel.Cells(а,НомерКолонкиЕдиницаИзмерения).Value);

    Товар = Справочники.Номенклатура.ПустаяСсылка();

    // Ищем товар в справочнике по коду
    Товар = Справочники.Номенклатура.НайтиПоКоду.Артикул;

    // Если не нашли по коду, то ищем по наименованию
    Если Товар.Пустая() Тогда
    Товар = Справочники.Номенклатура.НайтиПоНаименованию.Наименование;
    Конецесли;

    //Если не нашли создаем новый
    Если Товар.Пустая() Тогда
    Товар = Справочники.Номенклатура.СоздатьЭлемент();
    Товар.Наименование = НаименованиеТовара;
    Товар.Артикул = Артикул;
    Товар.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;
    Товар.СтранаПроисхождения = НомерКолонкиСтрана;
    Товар.Записать();
    Конецесли;
    КонецЦикла;


    КонецПроцедуры
  • Как сделать так, чтобы система 1С (сама программа) закрывалась, скажем, в 00:05 часа.
    У меня каждый день автоматически делаЮтся резервные базы, и нужно её закрывать. А про это иногда забываю. Надо, чтобы программа сама закрывалась примерно в такое время.
  • Народ, как как сделать информационную строку из подчинённого справочника?
    Имеется, например, справочник "клиенты", для него есть подчинённый справочник "должники" (в нём показываeся, что должен клиент). Вот как сделать, чтобы в обычной строке, которая находится в "клиентах", показывалось наименование справочника "должники"?
  • Привет всем! Подскажите, пожалуйста. У меня есть отчет, на нем располагается поле выбора из справ. Номенклатура групп и товаров. При выборе некой группы, на прайс должно выйти: Наименование выбранной группы товаров, наименование товаров, которые включены в эту группу, и минимальная цена, что берется из спроавочника Номенклатура. Помогите, пожалуйста, с кодом!
  • Учусь самостоятельно по учебнику, предполагающему, что все надо спрашивать у преподавателя, но преподавателя нет (так получилось) - обьяснений тут вообще почти нет, и поставили задачу:

       Используя обработчик события "Перед записью" модуля обьекта Справочник.ФизическиеЛица.ФормаЭлемента - реализуйте механизм "Автозаполнения" колонки "наименование". Для проверки новый обьект записывается или нет, нужно использовать метод "ЭтоНовый" Для удаления пробелов слева и справа "СокрЛП", для того, чтобы "отрезать" первый символ "Сред(СтроковаяПеременная 1.1)" :liveisgood:

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

    Есть 2 справочника
    иерархический Справочник СекцииНаСкладе и подчинённый ему Справочник Полки.
    Структура СекцииНаСкладе следующая:
     Секции(Хранения,Отгрузки)
         Сегменты(СегментА,СегментВ)
              Ряды(Ряд1,Ряд2)
                 Полки(Справочник Полки).
    Вопрос: Как выбрать все полки из Справочника Полки принадлежащие Секции(Хранения) Сегмента(СегментаА)?

    спасибо большое)))
       
  • Программирование :: Программирование 1С :: 1С 7.x
  • Добрый день.  Мне надо создать два сусбчета в 43 счете. Один субсчет - это отклонение (Есть производство какой-либо продукции, плановая есть себестоимость, например, 100 рублей, а фактическая получается 150, для этого надо сделать субсчет отклонение (43.01), на котором и будет отображаться сумма отклонений) и второй счет (43.02) - это учет цен (хотя, если честно, я так и не понял, зачем его делать, но сделать его надо, я так понял, бухгалтер хочет, чтобы там отражались цены фактической себестоимости).

     Я понять не могу, в модуле проведения документа надо тогда создать две проводки, дебет по 43.01 и по 43.02????
  • Программирование :: Программирование 1С :: 1С 8.x
  • Вопрос на засыпку, как мне сделать так, чтобы формировался еженедельный отчет, а также ежемесячный отчет, и какие мне значения надо добавлять. Вывод еженедельных и ежемесячных результатов расчетов производится при помощи формул. Как мне привязать системный календарь к формированию отчета? Например, если закончилась неделя, то при нажатии кнопки "сформировать" выводился отчет за неделю, точно также и ежемесячно, закончился месяц календарный при нажатии на "сформировать" выводится месячный отчет.
  • Добрый день. Подскажите пожалуйста в чем проблема. Создаю новый отчет и не пользуясь конструктором запроса сам начинаю писать запрос.
       ВЫБРАТЬ
       Документ.ПриходнаяНакладная.Ссылка,
       Документ.ПриходнаяНакладная.Материалы.Состав.(Материал КАК Товар, Количество)
    Вылазит ошибка что не найдено поле Состав.
    Убираем Состав, но тогда в отчете он мне выводит только список Приходных накладных, а мне надо что бы отображался еще товар и количество по каждой накладной. Пытаюсь делать конструктором запроса, получаю тот же самый  результат, вижу только список документов, а что конкретно, какой товар и количество в этом документе не выводится.

    Подскажите что не так я делаю???
  • B 7.7 есть для справочников метод "ИспользоватьВладельца", я переписываю конфигурацию на 8.2, как или чем можно заменить этод метод?
  • Как то так получилось, что в заведеную учетную запись электронной почты в 1С зашло 22000 писем. Просто кто-то настроил, и 1Ска забирала письма. Теперь вот проблема это все поудалять. Подскажет кто-то самый простой способ ликвидировать это все одним махом?
  • Нужно получить отчет по данным регистра сведений непериодического.
    В нем следующие измерения: Дата, Предмет, Преподаватель, Группа; Ресурс: Количество часов.
    В настройках отчета задается параметр Группа, датаНач, датаКон.
    А отчет следующего вида д.б.:

    Предмет   |   Преподаватель   |   Числа месяца             |   Часов за месяц
                     |                               | 1 | 2 | 3 | 4 | 5 | 6 |...31|
    -----------------------------------------------------------------------------------------------
    Пред 1      |  Преп 1                  | 4|     |   |     | 2|     |...    |         6
                     |   Преп 2                 |    |    | 2|      ...               |         2
    Пред 2      |  Преп 3                  |   |     |   |     | 2|     |...    |         2
    ...
       
    Как можно получить такой отчет, если количество дней в месяце разное? А в шапке объединение ячеек программно задавать скорее всего надо, т.к. я наперед не знаю, сколько дней в выбранном пользователем месяце.                       
  • Добрый день. Люди подскажите пожалуйста, как сделать форму отчета(Макет), я сделал запрос, все он мне выводит данные как положено, но мне надо создать для него определенный макет что бы он красивый лежал на столе у директора.
  • Есть такая процедура:
    Код:
     Запрос=Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | РасчетПенсии.Контрагент,
    | РасчетПенсии.Пенсия,
    | НакопленияКонтрагентовОстатки.Контрагенты,
    | НакопленияКонтрагентовОстатки.СуммаОстаток
    |ИЗ
    | Документ.РасчетПенсии КАК РасчетПенсии,
    | РегистрНакопления.НакопленияКонтрагентов.Остатки КАК НакопленияКонтрагентовОстатки ГДЕ Контрагенты=РасчетПенсии.Контрагент";
    Результат = Запрос.Выполнить().Выбрать();
    Выплаты.Очистить();
    Пока Результат.Следующий() > 0  Цикл
    Выплаты.Добавить();
    ЕСЛИ Результат.СуммаОстаток<Результат.Пенсия ТОГДА
    Выплаты.ЗаполнитьЗначения(Результат.Контрагент,"Контрагент");
    Выплаты.ЗаполнитьЗначения(Результат.Пенсия,"КВыплате");
    Выплаты.ЗаполнитьЗначения(Результат.СуммаОстаток,"ОстатокСчета");
    Иначе
    Выплаты.ЗаполнитьЗначения(Результат.Контрагент,"Контрагент");
    Выплаты.ЗаполнитьЗначения(Результат.Пенсия,"КВыплате");
    Выплаты.ЗаполнитьЗначения(Результат.СуммаОстаток,"ОстатокСчета");
    КонецЕсли;
    КонецЦикла; 


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

    ЗЫ: и сразу вдогонку  :mrgreen: программированием 1с занимаюсь третий день только, по этому почти ничего не знаю. Подскажите, пожалуйста, как-то можно оптимизировать эту процедуру? Больше чем уверен, что в данном виде при большом количестве контрагентов, все будет жутко тормозить :)

  • У табличного документа есть метод НачатьГруппуСтрок(<Имя группы>, <Открыта ли группа>)
    Я его использую и не пойму зачем нужен параметр <имя группы>. Его вообще должно быть видно после использования метода ТаблДок.Показать(); или нет. Если все-таки <имя группы> должно визуально отображаться, почему у меня его нет? Т.е. группировка строк есть и я рассчитывал что она будет подписана, но ничего нет.


    ТаблДок.НачатьГруппуСтрок("Регистр",Истина);
  • Операционные системы :: Windows
  • Люди, такая проблема. При включении компьютера идет полоска загрузки Windows. После 2 проходов полоски на секунду мелькает синий экран с белым текстом и происходит перезагрузка ПК. Потом идет предложение запуститЬся в безопасном режиме (в нем не запускается тоже), и так раз за разом.
  • Здравствуйте, возникла такая проблема, не запускается Windows 2003Server. Рассказываю по порядку: у меня два винта, первый винт был разбит на С: D: и  второй винт F:. На C: стояла XP, на D: 2003 Server, все работало нормально. На первом винте оставил место для Linux, условно назовем его Е:. Пока стояли XP и 2003 Server, все было нормально. Потом поставил в Е: Linux Slackware, произошло изменение меток тома C: XP. D: переименовался в F:, а F: в D:. Теперь XP и Linux запускаются, а Windows 2003Server - нет. Видно, произошла смена Основного раздела на логический, выдает следующую ошибку:
    Код:
    Не удаётся запустить Windows из-за испорченного или отсутствующего файла:
    <Windows rooty>\system32\ntoskrnl.exe.
    Установите заново копию указанного выше файла.
    Подскажите, в какую сторону копать, чтобы решить эту проблему.
  • Народ, кто пользовался, поделитесь впечатлениями?
    Собственно, интересует сравнение ее с Win XP. Собираюсь поставить посмотреть, что это и с чем его едят, хотелось бы послушать тех, у кого уже есть опыт. В данный момент у меня Win Xp Pro SP3 без MUI.
  • Направления программирования :: Drivers
  • Помогите получить путь к файлу типа с:\folder\file.exe из пути \Device\HarddiskVolume1\folder\file.exe
    То есть узнать DOS имя файла из native имени, а то юзеру стыдно показать такой путь, ведь все привыкли к именам, начинающемся с буквы.

    Немного я раскопал:
    Символьные ссылки  на устройства типа \Device\HarddiskVolume1 или \Device\CdRom0 можно узнать послав запрос  IOCTL_MOUNTMGR_QUERY_POINTS к устройству монтирования MOUNTMGR_DEVICE_NAME.
    Но если файл с флешки, то полный путь будет типа \Device\Harddisk1\DP(1)0-0+3\folder\file.exe
    А для \Device\Harddisk1\DP(1)0-0+3 уже нельзя получить символьные ссылки тем же способом. [IoCallDriver() выдаёт ошибку STATUS_OBJECT_NAME_NOT_FOUND]

    Я уж молчу про файлы, которые лежат на сетевых дисках, там пути в native формате ещё круче.
    Символьные ссылки на сетевые диски отсутствуют даже в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices. 
  • Доброго времени суток, форумчане.

    Написал простенький драйвер-фильтр ФС.
    IRP'ы и FastIO запросы перехватываю, как по учебнику.  Чтение\запись..., ну и все остальное.

    Меня интересуют передаваемые данные от прикладной программы к драйверу.
    Проблемы (т.е. BSOD'ы) начинаются, когда пытаюсь их, данные, слегка модифицировать.


     Драйвера ФС в основном использут Nether Buffered Nor Direct I\O способ передачи данных от приложения к драйверу.
    То есть, мы, выполняясь в контексте приложения, получаем доступ к его памяти и шаманим :) с ней (модифицируя, копируя, сохраняя...)

    Первые два метода работы с буфером данных Buffered и Direct I\O пока не обрабатываем (только проверяем их использование).

    Опытным путем установил, что большинство запросов чтения\записи данных выполняется именно посредством FastIO.
    В обработчике FastIOWrite пишу следующее (в обработку IRP_MJ_READ\ IRP_MJ_WRITE решил пока не лезть - просто спускаю вниз), в тестовом режиме решил модифицировать исходный буфер только при обработке FastIOWrite

    Код:
    BOOLEAN  
    IntercepterFastIoWrite(
        IN PFILE_OBJECT FileObject,
        IN PLARGE_INTEGER FileOffset,
        IN ULONG Length,
        IN BOOLEAN Wait,
        IN ULONG LockKey,
        IN PVOID Buffer,
        OUT PIO_STATUS_BLOCK IoStatus,
        IN PDEVICE_OBJECT DeviceObject
        )
    {
       // ...
       // немного необходимой рутины по спусканию запроса вниз по стеку
       // ...
      
       DbgPrint (("Buff size: %i \n  buff: '%s'  ", Length, Buffer));
       int ModifOffset = 7; // ModifOffset < Length
       *((char*) Buffer + ModifOffset) = 'W';
      
      // ...
    }


    Для тестов быстренько написал простенькую программу, которая пишет в файл строку "Hello world" посредством CreateFile\WriteFile. Настроил фильтр так, чтобы он реагировал на запросы, отправляемые драйверу, только исходящие от этой программы.

     Хочу, чтобы в драфвере-фильтре буква 'w' заменилась на 'W' (world --> World), и как только я пытаюсь это делать -  BSOD, BSOD и еще раз BSOD :headbang:

     Если закомментировать
    Код:
      // int ModifOffset = 7; // ModifOffset < Length
      // *((char*) Buffer + ModifOffset) = 'W';
       
     
    все работает, и DbgPrint добросовестно выводит записываемую информацию....

    Что не так делаю? :confused:
  • У кого есть исходники к этой книге??  

    В теме "Литература о драйверах" http://forum.shelek.ru/index.php/topic,14645.0.html  даны неправильные ссылки на примеры. =(   Там только сервис-паки, которые устанавливаются поверх оригинальных исходников из книги...  

    Если у кого-нибудь есть, скиньте пожалуйста на onio.by@gmail.com или дайте ссылку скачать ...  :shuffle:
  • Всем привет!
     Очень нуждаюсь в Вашей помощи, господа!
    В двух словах: конечная цель - в usb воткнуто нечто, и это нечто ОДНОВРЕМЕННО считывает значения сопротивления/напряжения  на нескольких (~4) элементах внешнего устройства. Все это отсылается в программу/драйвер на компьютере, производит вычисления и выдает какой-то конечный результат на мониторе. Откровенно признаться, знания в области программирования - поверхностные, хорошо подзабытые C++ и когда-то сам учил delphi (увы, не моя предметная область).  По аппаратной части тоже не знаю, с чего начать(.
    Пожалуйста, скажите с чего начать, где почитать, буду очень признателен. Сейчас купил Агурова .. тяжело идет(.

    Если правильно понимаю - для начала необходимо проработать железо на базе микроконтроллера?
  • Доброго всем времени суток...
    Появилась идейка связать компьютер и внешнее устройство (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;

    Помогите "разложить все по полочкам".
    Конкретные вопросы будут потом.
    СПАСИБО.
  • Направления программирования :: Сети
  • Доброго все времени суток.Мне поставили задачу написать программу передачи файлов по UDP в С++ причем связь является односторонней т.е. сервер посылает клиенту данные файла но ответа от него никакого не получает.В связи с этим возникает правомерный вопрос а реально ли это вообще рализовать если учесть что UDP не надежный протокол и данные могут не дойти что критично для копирования файлов.
  • Всем привет, нам тут в универе задали написать программу SFTP сервера для Windows, я нигде не могу найти, как это делать, помогите, кто чем может, пожалуйста.
  • Направления программирования :: Web
  • Всем привет. я бы хотел создать интернет-магазин стройматериалов. Подскажите пожайлуйста по-этапно с чего начать и что нужно для этого знать.спс
  • Практические разделы :: Графика и дизайн
  • Всем привет, вот решил создать класс небесной оболочки, используя файл эффекта из "Кнут"а.
    После нескольких дней мучений, иправления тонны ошибок , просмотра десятков сайтов по этой тематике дошёл до того что эффект рисует этот куб, но кубическая текстура ресуется только с одной стороной, неправильно повёрнута да ещё и занимает 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:
  • Учимся программировать :: Начинающим
  •  Разработать сценарий для поддержки базы данных входящих документов
    Документ представлен некоторым текстовым файлом. База данных - это отдельный каталог, в котором размещаются документы. Требуется
    -добавить документ в базу
    -просмотреть список документов
    -отобразить содержимое документов
    -получить объём в байтах документа
    Работа с системой с помощью меню и задании параметров, необходимых для выполнения соотв. действия. После выполнения действия пользователю опять предлагается выыбрать один из пунктов меню
    Завершение работы осуществляется посредством выбора Выход

    Вот это - После выполнения действия пользователю опять предлагается выбрать один из пунктов меню -
    можно вот так реализовать через while true, т.е

    Код:
    while true

    do

    PS3="Выберите пункт меню:"

    select ITEM in "Открыть файл" "Добавить документ в базу" "Получить объем в байтах" "Выход"
    do

    case $ITEM in
    "Открыть файл") OPEN;
    esac


    case $ITEM in
    "Добавить документ в базу") ADDD;
    esac

    case $ITEM in
    "Получить объем в байтах") INFO;
    esac

    case $ITEM in
    "Выход")
    esac
    break;
    done

    и описание функций здесь правильно, а то я первый раз пишу на bash
    while true

    Код:
    VHOD() 
    {
    echo Введите путь к каталогу
    read FOLDER
    cd $FOLDER
    #cd /home/an/lab2
    echo Список документов в выбранном каталоге:
    ls
    }
    VHOD

    OPEN()
    {
    echo Введите имя файла
    read INPUT
    if [ ! -e $INPUT ]; then
    echo Нету такого файла; OPEN
    elif [  -e  $INPUT ]; then
    cat $INPUT
    continue
    fi
    }

    INFO()
    {
    echo Введите имя файла информацию о котором хотите узнать:
    read INPUT
    echo Размер  Имя файла; du $INPUT
    }


    ADDD()
    {
    count=0
    echo Введите файл:
    read INPUT
    touch $INPUT
    }
  • В общем, нужна функция поиска по списку по заданному номеру. (номер - это переменная в классе).
    Там есть 3 варианта в начале, середине и конце.

    Код:
    bus* List::Out(int Num1)
    {
    bus* Cur=new bus;
    bus* Tmp=new bus;
    bus* Tmp1=new bus;
    bus* pCurr=new bus;
    Cur=Start;

    //поиск последнего элемента
    while(pCurr->GetNext()!=NULL)
    {
    pCurr = pCurr->GetNext();
    }

    for(; Cur->GetNext()!=NULL; Cur=Cur->GetNext())
    {
    if(Num1==Cur->GetNext()->GetNum())
    {   //если в конце
    if(Cur->GetNext()==pCurr)
    {
    for(Cur=Start;Cur->GetNext()->GetNext()!=NULL;Cur=Cur->GetNext());
    Tmp=Cur->GetNext()->GetNext();
    Tmp1=Cur->GetNext()->GetNext();
    Cur=Cur->GetNext();
    Cur->SetNext(NULL);
    delete Tmp1;
    return Tmp;

    }
    //если в начале
    else if(Cur->GetNext()==Start)
    {
    Tmp=Cur->GetNext();
    Tmp1=Start;
    Start=Start->GetNext();
    delete Tmp1;
    return Tmp;
    }
    //если в середине
    else
    {
    Tmp1=Cur->GetNext();
    Tmp=Cur->GetNext();
    Cur->SetNext(Tmp1->GetNext());
    delete Tmp1;
    return Tmp;
    }
    }
    else
    {
    printf("NET NOMERA\n");
    return NULL;
    }
    }
    }

    В общем, не работает если переменная находится в начале,  т.к. Cur->GetNext()==Start          (где Cur->GetNext()-это как бы текущий элемент), значит Cur-это предыдущий, которого нет. Вот не могу понять как исправить.

    Cur->GetNext() брал как текуий элемент, для того что бы работало удаление из середины.

    и еще вопрос: если нет нужного элемента то

    Код:
      else
    {
    printf("NET NOMERA\n");
    return NULL;
    }

    возникает ошибка при попытке вернуть ноль.
  • Есть ли существенная разница между этим вариантом
    Код:
    for(int i=0; i<N; i++)
    {
        func1();
    }

    for(int i=0; i<N; i++)
    {
        func2();
    }

    и этим:
    Код:
    for(int i=0; i<N; i++)
    {
        func1();
        func2();
    }

    Думаю, что второй вариант быстрее, но все равно на всякий случай уточню:)

    Правка: суть проблемы в том, что удобнее бы было делать как в первом варианте - но только если это не будет значительно медленнее.
  • Надо сделать что-то типа библиотеки в виде списка. Классы я создал и список тоже, но с поиском элементов проблема:
    kniga* knigalist::vzat(int t)
    {kniga* cur;
    int colvo;


    for (cur=START;cur->getNEXT()!=NULL;cur=cur->getNEXT())
    {if(nomer==t)
       {colvo=kolvo;
       colvo--;
       kolvo=colvo;
       return cur;
          printf("kniga vzata\n");

          }

       else {printf("nety\n");
       
       }}
    Работает некорректно, помогите найти ошибку.
  • Скажите, пожалуйста, так верно?

    Код:
    Type **type;

    Alloc(int N, int M)
    {
       type=new Type[N];
       for(int i=0; i<N; i++)
       {
              type[i]=new Type[M];
       }
    }

    ...

    delete []type;
         


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


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


В избранное