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

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

Предисловие переводчика

Тестирование программного обеспечения — очень важная часть процесса разработки, оказывающая определяющее влияние на качество результата в целом. Тем не менее его роль долгое время недооценивалась. Книги, изданные в России на данную тему, можно пересчитать по пальцам. Известные мне учебные курсы по подготовке программистов игнорировали тестирование (не удивлюсь, если и неизвестные мне тоже). Многие знакомые мне программисты-практики с немалым стажем также считают тестирование пустой тратой времени, ограничиваясь случайными неформальными проверками.

Ситуация несколько улучшилась с появлением «гибких» (agile) технологий программирования, которые уж совсем никак не могут существовать без тестирования. Появились инструменты для тестирования (некоторые даже доступны бесплатно) и, главное, книги по методикам использования этих инструментов. Начала входить в обиход «разработка через тестирование» (Test-Driven Design, TDD), когда сначала пишутся тесты, и лишь потом — код, который должен этим тестам соответствовать.

Работая в области разработки корпоративных приложений в среде .NET, я настолько привык к TDD, что уже не представляю другого подхода, когда пишется код, не обеспеченный тестами должного количества и качества. Когда же появилась реальная возможность поработать в области firmware, я сразу же почувствовал существенный дискомфорт. Мало того, что пришлось отвыкать от ставшего привычным комфорта ООП и вспоминать полузабытый архаичный C (впрочем, по сравнению с ассемблером даже он кажется великим благом). Ни в одном из многочисленных учебников по программированию микроконтроллеров ни слова не упоминалось о профессиональном тестировании firmware, а у меня успел сложиться устойчивый стереотип: программу, код которой не имеет достаточного покрытия тестами, нельзя считать написанной.

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

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

Резюме

В конце 2005 года мы получили возможность начать наш первый проект по разработке встроенной системы. Мы применяем гибкие технологии в разных областях — от веб-разработки до промышленного тестового оборудования. Основной проблемой в этой новой работе было не освоение новой среды и технологии; проблема крылась в применении гибких технологий к маленькому, но сложному миру встроенных систем. Мы встретились с множеством препятствий: боролись с древностью многочисленных инструментов для встроенных систем, отсутствием интеграции с инструментами, подобными Rake, для обеспечения легкой автоматизации, а также слабой поддержкой объектно-ориентированной разработки. Мы преодолели все эти трудности. Данный отчет подводит итоги годовых усилий по применению наших технологий к разработке встроенных систем.

1. Введение

Atomic Object разрабатывал ПО в течение шести лет с использованием экстремального программирования. Мы пишем небольшие тесты, затем немного кода, снова тесты и опять немного кода. Разработка через тестирование (TDD) в нашем офисе — не факультативная технология. Мы "тест-инфицированы" и гордимся этим.

Два года назад фирма Savant Automation поручила нам переписать программное обеспечение для двух из полудюжины плат, управляющих производимыми этой фирмой автоматическими тележками. Эти тележки передвигаются по складам и хранилищам, следуя по запрограммированному маршруту. Несколько из нас в Atomic Object надеялись изучить программирование встроенных систем. Мы с энтузиазмом взялись за этот проект.

TDD не является привычным в мире встроенных систем. Немногие, в их числе James Grenning [1], Micah Dowty [2] и Nancy Van Schooenderwoert [3], ввели TDD и другие гибкие технологии в практику разработки встроенных систем, но множество инженеров-разработчиков firmware попросту не проявляют интерес к гибким технологиям или же не верят, что они применимы к разработке встроенных систем. Поэтому мы хотели не только поработать с интересными встроенными системами, но и, основываясь на опыте предыдущей работы, внедрить технологии тестирования в новую для нас область и продвинуть гибкую разработку встроенных систем.

Этот отчет подводит итог нашей годовой работы с платами фирмы Savant. В разделе 2 описывается наш опыт создания firmware для первой системы — платы «управления скоростью». Раздел 3 описывает вторую систему, плату «монитора батареи», а также изменения и улучшения, сделанные нами на основе опыта работы с платой скорости. И в заключение мы обсуждаем наиболее важный из усвоенных нами уроков: нет никаких реальных препятствий к применению мощных гибких технологий в области разработки встроенных систем разработчиками, которые в этом действительно заинтересованы.



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

  • Программирование :: .NET технология от и до
  • Есть форма, в форме кнопка.
    По OnClick запускается процедура, довольно долгоиграющая.
    Пока крутится процедура, окно формы совершенно мертвое. Добавил "this.Refresh()". В окне стали отображаться изменения, происходящие в процессе. Но при попытке прокрутить слайдер окно опять застревает в положении "не отвечает".

    Черт с ней, запустил процедуру как поток. И получил сообщение:
    Цитировать
    Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "textBox1" не из того потока, в котором он был создан.

    Что тут еще можно сделать?
  • Программирование :: .NET технология от и до :: ASP.NET
  • Здравствуйте! Помогите. На C# только учусь писать, c ASP  та же история, поэтому заранее прошу прощения за, возможно глупые, вопросы!!!!!

    Задача: На Web странице есть TreeView данные в который выгружаются динамически из бд (порядка полутора тысяч объектов). Дерево выстраивается в зависимости от того какой элемент выбран в DropDownList, данные в который грузятся так же из бд. Это пока всё что я написала:

    Код:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Drawing.Design;


    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
           
        }


        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
           // lableStatus.Text = "ты выбрал: " + TreeView1.SelectedNode.Text;
        }

        protected void TreeView1_TreeNodePopulate(object sender, System.Web.UI.WebControls.TreeNodeEventArgs e)   
        {
            if (e.Node.ChildNodes.Count == 0)
            {

                switch (e.Node.Depth)
                {
                    case 0:
                        PopulateCategories(e.Node);     
                        break;
                    case 1:
                        PopulateProducts(e.Node);       
                        break;
                    case 2:
                        PopulateProducts_TreeLayer(e.Node);   
                        break;
                    case 3:
                        PopulateProducts_TreeNextLayer(e.Node);   
                        break;
                    case 4:
                        PopulateProducts_TreeNextLayer_1(e.Node);   
                        break;
                    case 5:
                        PopulateProducts_TreeNextLayer_2(e.Node);   
                        break;
                    case 6:
                        PopulateProducts_TreeNextLayer_3(e.Node);     
                        break;
                }
            }
        }


        private DataSet RunQuery(SqlCommand sqlQuery) 
        {
            string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection DBConnection = new SqlConnection(connectionString);
            SqlDataAdapter dbAdapter = new SqlDataAdapter();
            dbAdapter.SelectCommand = sqlQuery;
            sqlQuery.Connection = DBConnection;
            DataSet resultsDataSet = new DataSet();
            try
            {
                dbAdapter.Fill(resultsDataSet);
            }
            catch
            {
                lableStatus.Text = "Unable to connect to SQL Server";
            }
            return resultsDataSet;
        }




        void PopulateProducts_TreeNextLayer_3(TreeNode node)
        {
            string parentID3 = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ........ = '" + parentID3 + "'";
            DataSet ResultSet = RunQuery(sqlQuery);


            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }

        }




        void PopulateProducts_TreeNextLayer_2(TreeNode node) 
        {
            string parentID2 = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ....... = '" + parentID2 + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

           
            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }

        }

        void PopulateProducts_TreeNextLayer_1(TreeNode node) 
        {
            string parentID1 = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ....... = '" + parentID1 + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

             foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
         
        }





        void PopulateProducts_TreeNextLayer(TreeNode node) // класс построения четвёртого уровня дерева
        {
            string parentID = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT .......... = '" + parentID + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
        }





        void PopulateProducts_TreeLayer(TreeNode node)
        {
            string parextID = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT ............ = '" + parextID + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1738"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);
            }
        }




        void PopulateProducts(TreeNode node)
        {
            string parID = node.Value.Trim();
            SqlCommand sqlQuery = new SqlCommand();
            sqlQuery.CommandText = "SELECT .............. = '" + parID + "'";
            DataSet ResultSet = RunQuery(sqlQuery);

            foreach (DataRow row in ResultSet.Tables[0].Rows)
            {
                TreeNode NewNode = new TreeNode("<font color = 000000>" + row["CODE"].ToString() + "</font>" + "_ " + row["SP1731"].ToString(), row["ID"].ToString());
                NewNode.PopulateOnDemand = true;
                NewNode.SelectAction = TreeNodeSelectAction.Select;
                node.ChildNodes.Add(NewNode);

            }
        }




        void PopulateCategories(TreeNode node)   
        {
           string value_Item = DropDownList1.SelectedValue.Trim();
            SqlCommand sqlQuery = new SqlCommand("SELECT ........... = '" + value_Item + "'");
            DataSet resultSet;
            resultSet = RunQuery(sqlQuery);
            if (resultSet.Tables.Count > 0)   
            {
                foreach (DataRow row in resultSet.Tables[0].Rows)   
                {
                    TreeNode NewNode = new TreeNode(row["SP1731"].ToString(), row["ID"].ToString());
                    NewNode.ImageUrl = "http://...";
                    NewNode.PopulateOnDemand = true;   
                    NewNode.SelectAction = TreeNodeSelectAction.Select;
                    node.ChildNodes.Add(NewNode);
                }
            }
        }
        protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
        {

        }
    protected void DropDownList1_SelectIndexChange(object sender, EventArgs e)
    {

    }
    }
    Теперь непосредственно в чём проблемы:

    1) При каждом изменении в DropDownList перестраивать дерево(на данный момент оно 2 раза перестраивает дерево, а на третий уже построенное дерево просто не меняется, не понимаю почему)

    2) Как правильно выводить сообщение-предупреждение пользователю, дорустим о том что что сначала неоюходимо выбрать элемент в  DropDownList? (MessegeDox-не работает, это WindowsForms, alert-тоже, это javascript? не понимаю)

    3) Необходимо реализовать поиск объектов в дереве, с раскрытием необходимого узла дерева автоматически! Как? ведь оно грузится динамически? это вообще возможно реализовать?

    4) Ещё хотелось бы рядом с каждым treenode разместить нечто типа imegebutton, либо всплывающего меню, цель которого открыть открыть новую страницу, на которой в textbox отобразится имя выбранного в дереве обьекта, ну и парочку таблиц с информацией по данному объекту, в общем выполнить межстраничную передачу данных, но чтоб новая страница открывалась в новой вкладке или новом окне IE.
  • Программирование :: С/С++ :: ANSI С/С++
  • Попался на глаза очень компактный и в то же время содержательный тест на знание языка С. Может пригодиться тем, кто проводит собеседование с кандидатами на работу:

    http://chipenable.ru/index.php/programming-c/68-c-test-the-0x10-best-questions-for-would-be-embedded-programmers.html

    Конечно, сейчас на С пишут все меньше, но все же может оказаться полезным. Не обращайте внимания на якобы ориентацию на встраиваемые системы, там они вскользь упоминаются в единственном вопросе. Никакой привязки к конкретной реализации языка нет.
  • Программирование :: С/С++ :: WinAPI & Visual C++
  • Доброго врмемени суток.

    подскажите, как можно, используя cin<<х
    задать значение х не из командной строки, а из другой функции.
    если не сложно, то маленький пример.

    второй вопрос.
    как отследить, какие длл использует программа.
    а то написал прогу. а она не без MSVS не работает. просит тамышние библиотеки.
    хочу эти длл собрать в одну папку, пусть кушает.

    зы зарание благодарю

  • доброго времени суток

    меня интрерсует использование ResumeThread  и SuspendThread.

    я создаю поток
    AfxBeginThread (thread, THREAD_PRIORITY_NORMAL, 0,CREATE_SUSPENDED ,NULL ); //CREATE_SUSPENDED

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

    есть ли статьи по использованию  SuspendThread и ResumeThread
  • Программирование :: Delphi
  • Добрый день!  :oh:
    На самостоятельное изучение дали тему "Применение параметров при реализации SQL-запросов". Программа должна реализовывать следующее:
    * Добавлять записи в таблицу (INSERT)
    * Удалять записи из таблицы (DELETE)
    * Редактировать записи в таблице (UPDATE)
    * Выдавать информацию о товарах из таблицы, которых на складе осталось меньше введённого количества.
    И всё это исключительно с помощью параметров.
    Таблица в БД у меня такая:
    Поле IDCode (счётчик, первичный ключ)
    Поле TovarName (текстовый)
    Поле Price (числовой, двойное с плавающей точкой)
    Поле Sklad (числовой, длинное целое)
    Причём в методичке сказано что данные в неё вносить не нужно, это осуществится с помощью Дельфи, поэтому таблица пустая.
    Ну а в Дельфи соответственно 4 ADOQuery, в каждом свои параметры.
    Проблемы возникли уже на первой операции (INSERT). Параметры в запросе следующие:
    * TName:
    DataType - ftString
    А вот Value он почему-то "не захотел" делать String, упорно ставит её OleStr. В этом я думаю и заключается проблема... :chainik:
    * Price:
    DataType - ftFloat
    Value "само по себе делается" Double и по-другому никак не хочет
    * Sklad:
    DataType - ftInteger
    Value - Integer
    В ADOQuery в свойстве SQL код:
    Код:
    INSERT INTO Table1 (TovarName, Price, Sklad)
    Values( :TName, :Price, :Sklad);
    Вот текст всей программы:
    Код:
    unit LAB7Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, Grids, DBGrids, DB, ADODB;

    type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Label5: TLabel;
        Edit4: TEdit;
        BitBtn4: TBitBtn;
        ADOQuery2: TADOQuery;
        DataSource2: TDataSource;
        ADOQuery3: TADOQuery;
        DataSource3: TDataSource;
        ADOQuery4: TADOQuery;
        DataSource4: TDataSource;
        Edit5: TEdit;
        Label6: TLabel;
        procedure BitBtn4Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
      X: integer;

    implementation

    {$R *.dfm}

    procedure TForm1.BitBtn4Click(Sender: TObject); {инф-ия о товаре из табл.1, кот. на складе осталось меньше указанного кол-ва}
    begin
    ADOQuery1.Active:=false;
    ADOQuery1.Parameters.ParamByName('NS').Value:=StrToInt(Edit4.Text);
    ADOQuery1.Active:=true;
    ADOQuery1.SQL.Add('SELECT * FROM Table1');
    end;

    procedure TForm1.BitBtn1Click(Sender: TObject); {Добавить записи в табл.1}
    begin
    ADOQuery2.Parameters.ParamByName('TName').Value:=Edit1.Text;
    ADOQuery2.Parameters.ParamByName('Price').Value:=StrToFloat(Edit2.Text);
    ADOQuery2.Parameters.ParamByName('Sklad').Value:=StrToInt(Edit3.Text);
    ADOQuery2.ExecSQL;
    ADOQuery2.SQL.Add('SELECT * FROM Table1');
    end;

    procedure TForm1.BitBtn3Click(Sender: TObject); {редактировать запись}
    begin
    ADOQuery3.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
    ADOQuery3.Parameters.ParamByName('TName').Value:=Edit1.Text;
    ADOQuery3.Parameters.ParamByName('Price').Value:=StrToFloat(Edit2.Text);
    ADOQuery3.Parameters.ParamByName('Sklad').Value:=StrToInt(Edit3.Text);
    ADOQuery3.ExecSQL;
    ADOQuery3.SQL.Add('SELECT * FROM Table1');
    end;

    procedure TForm1.BitBtn2Click(Sender: TObject); {удалить запись}
    begin
    ADOQuery4.Parameters.ParamByName('ID_Code').Value:=StrToInt(Edit5.Text);
    ADOQuery4.SQL.Add('SELECT * FROM Table1');
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ADOQuery1.SQL.Add('SELECT * FROM Table1');
    ADOQuery2.SQL.Add('SELECT * FROM Table1');
    ADOQuery3.SQL.Add('SELECT * FROM Table1');
    ADOQuery4.SQL.Add('SELECT * FROM Table1');
    end;

    end.
    Запустила, вввела в Edit'ы наименование товара, цену, склад, нажимаю кнопку "Добавить" - прога вылетает с ошибкой "Обнаружены символы за пределами инструкции SQL". :-/ Ну а другие операции я даже проверить не могу пока эта не станет работать... :lamer2:
    Подскажите пожалуйста, как побороть эту ошибку?! :ahh:
  • Всем доброго времени суток. У меня имеется следующая проблема: надо написать прогу под консоль Винды на Delphi с выводом русских букв.
    Решил попробовать сделать через WinAPI так же, как это делается на C++, т.е.
    Цитировать
    #include <conio.h>
    #include <iostream>
    #include <windows.h>
    using namespace std;

    typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);
     SETCONSOLEFONT SetConsoleFont;

    int main{

    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
     
    HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");
    SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");
    if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}
    SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),1);
    cout<<"Test test"<<endl;

    getch();
    return 0;
    }

    и получил следующий код:
    Цитировать
    type
      funcdll = function (handle:THandle; NumFont:DWORD):LongBool;

    var
      dllHandle:THandle;
      SetConsoleFont:funcdll;
      b:boolean;
    begin
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      dllhandle:=GetModuleHandle('KERNEL32.DLL');
      @SetConsoleFont:=GetProcAddress(dllhandle,'SetConsoleFont');
      b:=SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),1);
      if(b) then writeln('УРА') else writeln(GetLastError);
      readln;
    end.

    В итоге: GetLastError возвращает 6, т.е. неверный дескриптор.
    В чем мной была допушена ошибка, если на C++ код работает?
  • И снова здравствуйте... :lady2:
    У меня клиентское приложение по продаже автомобилей.
    Автомобили, имеющиеся в наличии выводятся в DBGrid (25 разных записей).
    При щелчке на ячейке с названием машины на форме должна возникать фотография этой машины, которая должна загружаться из БД (объект Image1), в БД есть поле Photo (тип-текстовый), где прописан путь к изображению (напр.: L:\Проектир_ИС_лаб\bmw.bmp)
    Вот как я пыталась это сделать:
    Код:
    unit LAB6Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Buttons, RpRender, RpRenderHTML, RpCon,
      RpConDS, RpDefine, RpRave, DB, ADODB, Grids, DBGrids;

    type
      TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        RvProject1: TRvProject;
        RvDataSetConnection1: TRvDataSetConnection;
        RvRenderHTML1: TRvRenderHTML;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        Memo1: TMemo;
        BitBtn3: TBitBtn;
        RvProject2: TRvProject;
        RvDataSetConnection2: TRvDataSetConnection;
        Image1: TImage;
        Label1: TLabel;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ADOQuery2: TADOQuery;
        DataSource1: TDataSource;
        DataSource2: TDataSource;
        procedure BitBtn1Click(Sender: TObject);
        procedure DBGrid1CellClick(Column: TColumn);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.BitBtn1Click(Sender: TObject); {информация о моделях, имеющихся в наличии}
    begin
    ADOQuery1.Active:=False;
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('SELECT Name, Price, Data, Comments, Photo');
    ADOQuery1.SQL.Add('FROM Table1');
    ADOQuery1.Open;
    ADOQuery1.Active:=True;
    end;

    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    var
    FN: string;
    begin
    Label1.Caption:=ADOQuery1.FieldByName('Name').AsString;
    Memo1.Lines.Text:=ADOQuery1.FieldByName('Comments').AsString;
    FN:=ADOQuery1.FieldByName('Photo').AsString;
    if FileExists(FN) then
    Image1.Picture.LoadFromFile(FN);
    end;
    end.
    Но программа вылетает с ошибкой raised exception class Einvalid Graphic with message 'Bitmap image is not valid'
    Также пробовала делать
    Код:
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
    Label1.Caption:=ADOQuery1.FieldByName('Name').AsString;
    Memo1.Lines.Text:=ADOQuery1.FieldByName('Comments').AsString;
    Image1.Picture.LoadFromFile(Table1.FieldByname('Photo').AsString);
    end;
    Но тут уже ошибка "неизвестная переменная", да это и понятно... :fie:
    Подскажите пожалуйста, как сделать чтобы при щелчках на ячейках фотографии машин загружались и отображались нормально! :lamer2:
  • доброго времени суток вам!!вот нынче занят написанием прожки, без проски все проходит на ура а вот при подключении прокси получаеться крепкая ботва!!
    подключал прокси вот так:

    Код:
    fs:TmemoryStream;
    compressor:tIdCompressorZLibEx;
    stack:tidIOHandlerStack;
    sock:tidsocksinfo;
    begin
    proxyadr :='221.231.139.5:1080';
    idhttp1.ReadTimeout := 30000;
    idhttp1.ConnectTimeout := 10000;
    idhttp1.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)';
    //idhttp1.Request.AcceptEncoding := 'gzip,deflate';
    sock := tidsocksinfo.create (idhttp1);
    sock.authentication := sanoauthentication;
    sock.version := svsocks5;
    sock.host := copy (proxyadr, 1, pos (':', proxyadr) - 1);
    sock.port := strtoint (copy (proxyadr, pos (':', proxyadr) + 1, 5));
    stack := tidIOHandlerStack.Create (idhttp1);
    stack.TransparentProxy := sock;
    idhttp1.IOHandler := stack;
    compressor := tIdCompressorZLibEx.Create (idhttp1);
    idhttp1.Compressor := compressor;
    fs:=TmemoryStream.Create;
    da:=TStringList.Create;
    da.Add('Login='+e1.Text);
    da.Add('Domain='+e2.Text);
    da.Add('Password='+e3.Text);
    s:=idHTTP1.Post('http://win.mail.ru/cgi-bin/auth',da);


    и далее еще кучазапросов.

    Но при первом же пост запросе он отправляет:
    login
    domain
    password
    domain
    password
    domain
    password
    и точно так же в последующих запросах он мне отправляет:
    login, domain хотя их там в помине не должно быть!!
    Подскажите плиз в чем беда??
    З.Ы. делфи7 инди 10.0.52

    Добавлено в 2010-09-29, 18:32:54:
    неужели ни у кого не было такого??
  • Программирование :: VisualBasic
  •   У меня проблема. Не получается вывести вторую матрицу в файл, которая получилась после того, как поменялись по условию столбцы матрицы. Выводит матрицу, похожую на транспонированную,т.е.столбцы становятся строками. Подскажите, как мне решить эту проблему.

    Задание программы:

    В выбранной матрице столбец, содержащий максимальный элемент матрицы, поменять местами со столбцом, содержащим число, наиболее близкое к среднему значению элементов матрицы.
    Вывести исходную и полученную матрицу в файл с помощью Print или Write.

    Код программы:

    Код:
    Private Sub lab2()
    Dim MAX, Cmax
    Dim NB, Cnb
    Dim MIN
    Open "D:\TESTFILE.TXT" For Output As #1
    Print #1, "Матрица"
    MsgBox "Здравствуйте! Давайте начнем!", vbCritical, "Приветствие"

    Cells.ClearContents
    S = 0

    metka:

    n = InputBox("Введите количество столбцов и строк матрицы", "Ввод", 10)

    If n > 10 Then
        MsgBox "Количество столбцов более 10 не обрабатываю!", 48, "Ошибка!"
        GoTo metka
    End If

    ReDim matr(1 To n, 1 To n)
     Randomize
     
    For i = 1 To n
         For j = 1 To n
              matr(i, j) = Int(100 * Rnd + 10)
                   
                   Лист1.Cells(i + 1, j).Value = matr(i, j)
                   Print #1, Tab, matr(i, j);
                      S = S + matr(i, j)
        Next j
        Print #1,
    Next i

    SA = S / n / n
    MsgBox SA, 64, "Среднее арифметическое"

    MAX = matr(1, 1)
    Cmax = 1
    NB = matr(1, 1)
    Cnb = 1
    MIN = Abs(matr(1, 1) - SA)

    For i = 1 To n
         For j = 1 To n
         
         
         If MAX < matr(i, j) Then MAX = matr(i, j): Cmax = j
         
         If MIN > Abs(matr(i, j) - SA) Then NB = matr(i, j): Cnb = j: MIN = Abs(matr(i, j) - SA)
         
         Next j
    Next i
    Print #1, "Новая матрица"
    For j = 1 To n


          For i = 1 To n
         
          Select Case j
         
          Case Cmax
          Лист1.Cells(i + n + 2, Cnb).Value = matr(i, j)
       
         
          Case Cnb
          Лист1.Cells(i + n + 2, Cmax).Value = matr(i, j)
         
          Case Else
          Лист1.Cells(i + n + 2, j).Value = matr(i, j)
          End Select
          Print #1, Tab, matr(i, j);
          Next i
          Print #1,
    Next j
    SA = "Максимальный элемент матрицы  " & MAX & vbCrLf _
    & "находился в столбце № " & Cmax & vbCrLf _
    & "Среднее арифметическое матрицы " & SA & vbCrLf _
    & "Наиболее приближённый к среднему элемент  " & NB & vbCrLf _
    & "находился в столбце № " & Cnb
     
    MsgBox SA, 64, "Полученные результаты"
    MsgBox "До свидания!", vbCritical, "Прощание"
    Close #1
    End Sub
  • Программирование :: Ассемблер
  • Здравствуйте,

    Прошу помощи в решении проблемы.
    Имеется некий агрегат, внутри которого установлена EEPROM 93S46.
    В ней производится фиксация запусков узла агрегата.
    Изначальное значение - 10000.
    При каждом запуске узла на индикаторе высвечивается цифра на 1 меньше предыдущей.
    Сейчас число запусков перевалило за 10000 и соответственно на индикаторе высветился 0, а при последующем запуске цыфры стали увеличиваться с индикацией дополнительных сегментов.
    Мы считали содержимое памяти при положительных (после перехода через 0) числах (119, 120, 121, 122,123).
    После состояния счетчика - 123 перепрошили память опять на 119.
    Память прошилась нормально и на индикаторе вновь появилось 119.

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

    Заранее благодарю.
  • В сегменте данных определил массив на 10 байтов:
    Код:
    db 10 dup(0)
    Далее в коде написал:
    Код:
    mov [di],1
    ... и получил предупреждение "argument needs type override".
    Исправил на:
    Код:
    mov [di],byte ptr 1
    Но, погуглив по описанию ошибки, нашел следующее решение:
    Код:
    mov WORD PTR[bx],1
    Есть ли разница? Или просто компилятору первым или вторым операндом нужно указать, что необходимо работать именно с байтом?
  • Программирование :: Java
  • Подскажите как можно реализовать алгоритм по нахождению пути по наименьшей стоимости в графе....так, чтобы были заранее заданы стоимости в виде матрицы....мы вводим первый и второй узел и получаем путь с наименьшей стоимостью, при этом надо, чтобы еще был показан ход нахождения пути...
  • Добрый день !
    Я начинающий программист в этой среде.(можно сказать совсем чайник)
    Сейчас делаю программу ,редактирования текста!
    Нужна ваша помощь,а то мне самому что-то тяжеловато разобраться.

    При открытий текста , хочу , чтоб выбираемый текстовый файл появлялся в TextArea....так как хочу его в дальнейшем редактировать..

    что надо писать в поле   textarea.read(new , evt)

    Код:
    package jfilechooserdemo;

    public class NewJFrame extends javax.swing.JFrame {

       
        public NewJFrame() {
            initComponents();
        }

     
        @SuppressWarnings("unchecked")
                           
        private void initComponents() {

            fileChooser = new javax.swing.JFileChooser();
            jScrollPane1 = new javax.swing.JScrollPane();
            textarea = new javax.swing.JTextArea();
            jMenuBar1 = new javax.swing.JMenuBar();
            jMenu1 = new javax.swing.JMenu();
            openFileMenuItem = new javax.swing.JMenuItem();
            jMenu2 = new javax.swing.JMenu();

            fileChooser.setDialogTitle("Это мое диалоговое окно открытия");

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            textarea.setColumns(20);
            textarea.setRows(5);
            jScrollPane1.setViewportView(textarea);

            jMenu1.setText("File");

            openFileMenuItem.setText("Открыть текстовый файл");
            openFileMenuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    openFileMenuItemActionPerformed(evt);
                }
            });
            jMenu1.add(openFileMenuItem);

            jMenuBar1.add(jMenu1);

            jMenu2.setText("Edit");
            jMenuBar1.add(jMenu2);

            setJMenuBar(jMenuBar1);

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(64, Short.MAX_VALUE))
            );

            pack();
        }// </editor-fold>                       

        private void openFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        fileChooser.showOpenDialog(openFileMenuItem);

            [color=red][font=Verdana]  // Действие, которое необходимо произвести с файлом, например, просмотр в TextArea
              textarea.read(new , evt);[/font][/color]

        }                                               

       
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new NewJFrame().setVisible(true);
                }
            });
        }

        // Variables declaration - do not modify                     
        private javax.swing.JFileChooser fileChooser;
        private javax.swing.JMenu jMenu1;
        private javax.swing.JMenu jMenu2;
        private javax.swing.JMenuBar jMenuBar1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JMenuItem openFileMenuItem;
        private javax.swing.JTextArea textarea;
        // End of variables declaration                   

    }

    Добавлено через 1 день, 27 минут и 53 секунды:
    Я понимаю, что для некоторых это может и фигня, но ответьте пожалуйста, очень надо....это по учебе!!!
  • Имеется пара классов A и B, так что B extends A.

    У этих классов разные по числу параметров конструкторы A(int a) и B(int a, int b).

    Экземпляры этих классов создаются в результате парсинга строчек, так что:
    Код: (Java)
    A create(String s) {
      // ...
      return new A(a);
    }

    B create(String s) {
      // ...
      return new B(a, b);
    }
    Для удобства доступа есть желание поместить эти методы в некий общий класс Factory, чтобы эту фабрику можно было бы хранить в переменной и передавать в разные места как одно целое. Естественно, поместить в класс два метода, различающиеся лишь типом результата нельзя, но теоретически и по смыслу задачи можно специализировать вызовы для каждого случая использования.

    Если брать C++, получается такое решение:
    Код: (C++)
    #include <iostream>

    using namespace std;

    class A {
    public:
    A(int a) {
    cout << "A" << endl;
    }
    };

    class B: public A {
    public:
    B(int a, int b): A(a) {
    cout << "B" << endl;
    }
    };

    class Factory {
    public:
    template<class T>
    T *create() {
    return new T();
    }

    template<>
    A *create() {
    return new A(0);
    }

    template<>
    B *create() {
    return new B(0, 1);
    }
    };

    int main() {
    Factory factory;
    delete factory.create<A>();
    delete factory.create<B>();
    return 0;
    }

    В данном случае используется механизм специализации шаблона. Для каждого вызова create из main по шаблонному параметру выбирается, какую из трёх реализаций выбирать: обобщённую (generic) для неизвестных типов, либо одну из специализированных, если параметром задан класс A или B. В специальных реализациях вызываются нужные конструктры (со своим количеством параметров для каждого случая).

    В Java некоторые элементы специализации шаблонов имеются. В Java можно написать нечто вида X<T extends U> или для метода <T extends U>T f(). Но компилятор либо не использует информацию об ограничении типа параметра generic-типа или -функции, либо я чего-то не знаю. Можно ли такое сделать?

    P.S. Варианты с использованием Reflections и RTTI (конструкции наподобие instanceof или if(x.class == ...) ) не предлагать. Хочется иметь "автоматический" выбор нужной реализации фабричного метода на этапе компиляции.
  • Доброго времени суток.
    Такая проблема. Я только начал изучать java. Есть простая задача считать выходные параметры передаваемые через командную строку.
    Код, который приведен ниже, нормально работает через консоль. Параметры указываю русские и английские в перемешку

       
    Код:
     public static void main(String[] args){

    //            for(int i=0; i<args.length-1; i++){
    //                try{
    //                    args[i] = new String(args[i].getBytes("ISO-8859-1"));
    //                }catch(Exception e){
    //
    //                };
    //            }
           
            for (String arg: args)
                System.out.println(arg);
     }

    Ручками запускаю
     
    Код:
    java -Dfile.encoding=KOI8r MyPrj "Д" "Param 2" "asdf фыва3"
    Однако если запускать в intellij, то вместо русских букв (видно в отладчике) считываются символы в неверной кодировке, и выводятся знаки вопроса.
    Указываю параметры в Run -  Edit configurations - Program parametrs
    Если раскоментировать часть кода выполняющего преобразование из "ISO-8859-1" -> Unicode, то все хорошо под отладчиком, но при ручном запуске фигня. Тут скорее всего какие-то настроки в самой IDE, только вот не могу понять какие. Помогите кто чем может  :-/  :)

    OS: Mac OS X 10.6.4
    JDK: 1.6
    Intellij IDE: 9.0.3
  • Программирование :: Программирование 1С :: 1С 7.x
  • Очередная неприятность.
    Есть документ внутреннее перемещение ТМЦ, вернее их даже несколько
    Объединяет их   дата и получатель ТМЦ
    В движениях документа (меню документ - движения документа) показаны нормальные движения, те расход с отправителя и приход получателю
    НО
    При формировании отчета по движениям регистра по получателю за этот день нет прихода
    при этом в движениях отправителя расход есть

    Я предполагаю что в этот день произошел сбой в движениях регистра ТМЦ

    Я боролся раньше с данными глюками гоняя ТА до дня сбоя и обратно, если не помогало - полный пересчет итогов в Тестировании/исправлении

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

    Кто встречался с подобными проблемами и знает их решение, подскажите.

    PS. Движений не наблюдаю до конца месяца по получателю:(
  • Доброго времени суток! создавая отчет в 1с, увяз на одном этапе:
    мне нужно, чтобы при нажатии первой кнопки открывался список с цехами(справочник.ИК_Цеха), из которого я добавляю нужные цеха в первый список(с идентификатором "подбор")
    при нажатии второй кнопки должен открываться список с профессиями(справочник.Должности), из которого я добавляю нужные долности в другой список(с идентификатором "долности")

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

    Код:
    Процедура Подбор(); 

    ОткрытьПодбор("Справочник.ИК_Цеха", "ИК_Цеха");
    КонецПроцедуры    
    //**************************************************
    Процедура Подбор2();


    ОткрытьПодбор("Справочник.Должности", "Должности");
    КонецПроцедуры            

    //**************************************************
    Процедура ОбработкаПодбора(Элемент,КонтФормы)
      
    Если ПустоеЗначение(Элемент)=0 Тогда
    Если Элемент.ЭтоГруппа()=0 Тогда
    Если ИК_Цеха.НайтиЗначение(Элемент)=0 Тогда
    ИК_Цеха.ДобавитьЗначение(Элемент,""+Элемент+?(Элемент.Наименование = Элемент,""," "));
    Иначе
    Предупреждение("Цех уже выбран в списке!",10);
    КонецЕсли;                                            
    КонецЕсли;
    КонецЕсли;

    //Если ПустоеЗначение(Элемент)=0 Тогда
    // Если Элемент.ЭтоГруппа()=0 Тогда
    // Если Должности.НайтиЗначение(Элемент)=0 Тогда
    // Должности.ДобавитьЗначение(Элемент,""+Элемент+?(Элемент.Наименование = Элемент,""," "));
    // Иначе
    // Предупреждение("Профессия уже выбрана в списке!",10);
    // КонецЕсли;                                            
    // КонецЕсли;
    // КонецЕсли;  // таким образом  добавляется в оба списка//
              
    КонецПроцедуры // ОбработкаПодбора

    //**************************************************  

        Процедура ОбработкаПодбора2(ЭЛ,Конт)


    Если ПустоеЗначение(ЭЛ)=0 Тогда
    Если ЭЛ.ЭтоГруппа()=0 Тогда
    Если Должности.НайтиЗначение(ЭЛ)=0 Тогда
    Должности.ДобавитьЗначение(ЭЛ.Наименование,"ЭЛ" );
    Иначе
    Предупреждение("Профессия уже выбрана в списке!",10);
    КонецЕсли;                                            
    КонецЕсли;
    КонецЕсли;
              
    КонецПроцедуры  //а так только в первый
  • Здраствуйте.
    Установлена 1С Предприятие 7.7 По просьбе бухгалтерии создал отчет "Реестр движения документов МПЗ". В отчете выходит таблица: Документ, Подразделение-получатель, Общая сумма по документу.
    Теперь надо сделать так, чтобы по двойному щелчку мыши в строке отчета открывался соответствующий документ. Такое уже реализованно в "Карточка МПЗ" (не знаю, это в типовой конфигурации или у нас созданный отчет), но разобраться не могу, как это сделано.
    Поскажите, как это сделать.
  • Не могу найти как поменять шрифт в поиске он очень мелкий и его не видно где то 2 стоит, много что перерыл но бесполезно. Еще с календарем проблема запускаешь отображает кракозыбры, как это можно устранить. Может кто что подскажет.
  • Есть ли какая-нибудь команда, чтобы показывать(скрывать) панель инструментов?
    Например, сделать кнопку, которая выведет сверху панель СТАНДАРТНАЯ или СЕРВИС?
  • Документ-Форма
    -ПолноеНаименование(строка-50)(слой-"Наим")
    -Адрес (строка-50)(слой-"Адр")
    -ВидКонтрагента(Перечисление.ВидКонтрагентов)
       ВидКонтрагентов
       -Физические
       -Юридические
    -----------------------------------------------------------------------
    Форма-Документ-Модуль
    Процедура ПриОткрытии()
       Форма.ИспользоватьЗакладки(1);
       Форма.Закладки.ДобавитьЗначение (1,"Контрагент");
       Форма.ИспользоватьСлой("Наим");
       Если ВидКонтрагента = Перечисление.ВидКонтрагентов.Физические Тогда
               Форма.ИспользоватьСлой("Наим");
       КонецЕсли;
        ПриЗаписиПерепроводить(1);
    КонецПроцедуры
    ------------------------------------------------------------------------------

    Справочник – Контрагенте тоже ест ВидКонтрагента.
    тоже ВидКонтрагента(Перечисление.ВидКонтрагентов)

    Как изменяется ВидКонтрагента в Справочник-Контрагенте через Документ.
    Но в Справочик – Контрагент ВидКонтрагента связано с Слоями.(Форма)
  • Операционные системы :: Unix и другие :: Linux
  • Коллеги, кто нибудь использовал/знает какуюнить вэб смотрелку сообщений syslog?

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

    Я вот сейчас скачал PhpSyslogViewer, посмотрим что он умеет.

    Кто что посоветует?
  • Направления программирования :: Drivers
  • Решаю всю ту же проблему, что была обозначена в конце темы http://forum.shelek.ru/index.php/topic,24622.0.html. А именно, мой USB-девайс при работе с драйвером, созданным в DS 3.2 пропускает данные на медленных машинах (PIV) и не пропускает данные на машине Core 2 Duo, при условии, если не запущены приложения, требующие значительных ресурсов (Opera). Отсюда сделал вывод, что пропуски могут проходить на уровне драйвера. Девайс работает следующим образом: подготовив данные для передачи по USB (заполнив FIFO UDP-модуля контроллера, отвечающего за работу с USB), ставит флаг готовности для передачи пакета данных размером 60 байт по USB. Далее ожидает, пока придет запрос от Хоста и уже после этого начинает передачу данных. Запросы формирует драйвер, который в свою очередь принимает их от приложения. Если я правильно понял, то в медленных или загруженных другими приложениями эти запросы могут задерживаться и в случае маленького буфера для запросов - теряться. Таким образом, какой смысл делать большой буфер для принимаемых драйвером от девайса данных, если при этом запросы на считывание этих данных приложением будут поступать с той же  частотой или реже?
    Что вы посоветуете для решения подобной проблемы?
    Заранее благодарен!
  • Всем привет!

    Тема создаётся в продолжение этой темы.
    Здесь я хочу попытаться выяснить, что же всё-таки делает функция GetScatterGatherList().

    Есть у меня в драйвере обработчик запроса чтения IRP_MJ_READ.
    В этом обработчике среди прочего я вычисляю необходимое кол-во регистров отображения:
    Код:
    	mapRegsNeeded = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(pIrp->MdlAddress), 
      pDevExt->ReadTotalLength - pDevExt->ReadOffset);

    Затем определяю виртуальный адрес пользовательского буфера
    Код:
    	baseVa = MmGetMdlVirtualAddress(pIrp->MdlAddress + pDevExt->ReadOffset);

    И запускаю непосредственно GetScatterGatherList()
    Код:
    status = pDevExt->pReadAdapter->DmaOperations->GetScatterGatherList(pDevExt->pReadAdapter, 
    pDeviceObject,
    pIrp->MdlAddress,
    baseVa,
    pDevExt->ReadLength,
    ReadAdapterControl,
    pIrp,
    FALSE)// transfer to buffer from device

    Вот создала эта функция Scatter-Gather список. Дальше автоматом вызывается функция ReadAdapterControl().

    Вопросы.

    Нужно ли в функции ReadAdapterControl() делать явное копирование данных в MDL-буфер?
    Если не нужно, то в какой момент данные попадают в MDL-буфер?

    Примечание. Вообще-то я думал, что функция GetScatterGatherList() как-то сама перемещает данные из устройства в MDL-буфер, а функция ReadAdapterControl() нужна только для того, чтобы сохранить указатель на S/G-список и перейти к следующему элементу S/G-списка. Но попробовал на практике и само собой после выполнения GetScatterGatherList() исходный MDL-буфер остался нетронутым. Поэтому и спрашиваю.


    P.S. Очкарик, я прошу прощения, потому что наверно достал тут уже всех своими темами, но разобраться очень надо :shuffle:
  • Направления программирования :: Web
  • Доброго всем дня! Интересует следующее..
      Нужно создать горизонтальное меню, отображающее путь пользователя от главной страницы проекта до текущей (например:Моя страница » мои альбомы » Питер). Подскажите, как это можно реализовать.. Смысл в чем?  :-/
  • Вопрос такой.
    Есть форма которая добавляет данные в БД.
    есть функция отвечающая за это
    Код:
    function addNews(){
    $.ajax({
       type: "GET",
       url: 'ajax.php?mode=add&added='+$('#newsAdded').attr('value')+'&title='+$('#newsTitle').attr('value')+'&body='+$('#newBody').attr('value'),
       success: function(data){
        data=removeSpaces(data);
                if (data!='fail'){
                    var appVar='<tr id="tr'+data+'"><td id="added'+data+'">'+$("#newsAdded").attr("value")+'</td><td id="title'+data+'">'+$("#newsTitle").attr("value")+'</td><td id="body'+data+'">'+$("#newBody").attr("value")+
                    '<td><input type="button" id="delete'+data+'" value="X" onClick="deleteNews('+data+')"></td><td><input type="button" id="editButton'+data+'" value="edit" onClick="editNews('+data+')"></td>';
                    $("#NewsTable").append(appVar);
                  }}
                });     

    но при вводе в поле <textare>примерно такой код <img src="rfhnbyrf">тут картинка то html код он обрезает только оставляет тут картинка
    вся проблема из append(appVar); как можно решить данный вопрос? кто подскажет.
    спасибо.
  • Может показаться странным, но я занимаюсь созданием сайтов, при этом довольно смутно представляю себе магию SEO.
    А продвиженцы этим пользуются и каждый убеждённо диктует свои требования к коду.
    Среди этих убеждённых требований есть и всякие нарушающие валидность тэги <index>, от которых я уже научилась отбиваться (или гасить их вредное влияние ценой некрасивости в коде, если уж отбиться никак), и прочие странности.

    На сей раз господа продвиженцы добрались до css.

    У кого есть более-менее обоснованные представления, как обстоит дело в реальности, поделитесь знаниями (и если можно, ссылками на авторитетные источники).

    • Есть мнение, что id для h1 — ой как не нравится поисковикам, и будто бы они начинают подозревать нас в чём-то нехорошем вроде поискового спама путём скрытия значимых элементов скриптами. Но если следовать этой логике, то следует избегать использования css и js вообще. На том же css можно добраться до любого элемента, вообще не используя id и классы. Неужели поисковики исповедуют принцип презумпции виновности?
    • Также продвиженцы ругаются на наличие чего-либо в заголовках (h1, h2 и т.д.) кроме простого текста. То есть, если разместить в заголовке также и картинку, то сеошники расстраиваются. Есть ли у них основания для беспокойств?
    • Скрытие текста средствами css. Например, я иногда делаю так: <h1 id="logo">Название фирмы</h1>, затем #logo { text-indent: -4096px; background: url(logo.png); }. То есть, средствами css подменяю текст на картинку. Могу поверить, что тут можно заподозрить неладное. Но так ли это на самом деле? Хотелось бы уяснить истинную картину. И вообще: неужели поисковики читают css или даже js? Как-то слабо верится.
  • Направления программирования :: Web :: HTML/DHTML
  • Бардак здесь: http://jk.news.az:8080/
    У главной менюшки (верхней горизонтальной) есть выпадающие подменю в некоторых пунктах.
    Всё бы хорошо, но в этих подменюшках пропадает маркер у первого пункта в IE7.
    Маркеры сделаны не через list-style, а фоновой картинкой.

    Первая мысль была такая: у родительского списка первому элементу фон отменяется сознательно, так может IE7 распространяет это правило и на вложенные списки. Но нет: если правило :first-child { background:none; } убрать, то глюк в IE7 всё равно остаётся, и объяснения ему уже не находится.

    Чего я не вижу? Где собака порылась?
  • Направления программирования :: Web :: Непрограммистские вопросы по web
  • Всем доброго времени суток;

    Вычитал следующие
    Файл .htaccess может быть размещен в корневом каталоге веб-сервера (прямо в каталоге www). В этом случае директивы из такого .htaccess действуют по всему веб-серверу. Также .htaccess  может находиться и в конкретном подкаталоге сервера. Тогда директивы, которые указаны в этом файле, «перекрывают» действие директив из «основного» файла, который размещен в каталоге www или в любом каталоге более высокого уровня.

    Вопрос:
    Cуществует ли такие  дерективы  в .htaccess которые запрещают  "перекрывть" действие деректив из "основного" файла ( в  данном случае ледащему  в www)
    Мне нужен .htaccess (лежащий в www) который перекрывает все дерективы в файлах .htaccess  лежащих в подкатологах.
  • Практические разделы :: Базы данных
  • имеется вот такой код встроенной процедуры для интербейсовской базы (СУБД- FireBird 1.5)
    (на названия идентификаторов не смеяться, они мне по наследству достались :) )



    Код:
    CREATE PROCEDURE PR_SHOWLOG_GET_MESSAGES(
        ID_TOLOADRFOMEXCLUDING BIGINT,
        ID_MAX BIGINT,
        MESSFILTER_BARR VARCHAR(513),
        MESSFILTER_LARS VARCHAR(37),
        MESSFILTER_REST SMALLINT)
    RETURNS (
        MESSAGE_ID BIGINT,
        QUIT_DATE TIMESTAMP,
        DMESSAGE TIMESTAMP,
        NOMER SMALLINT,
        RAZDEL SMALLINT,
        MESS_TYPE SMALLINT,
        QUIT_REASON SMALLINT,
        COLOR SMALLINT,
        NUA_TYPE SMALLINT,
        NEW_COD_X11_MESS SMALLINT,
        DATAWORD INTEGER,
        CANAL_NUMBER SMALLINT,
        CANALNUMBER_PER SMALLINT,
        POWER_LEVEL VARCHAR(2),
        USERID SMALLINT,
        OPERID SMALLINT,
        F_18_GUARDEDNOW SMALLINT,
        TAGPOINTID32 INTEGER,
        NON_TECH_SMS_COUNT SMALLINT,
        ADR_GUID_M4S VARCHAR(32),
        CHOP_NUM_M4S SMALLINT,
        DELTA_TIME_CHOP_M4S INTEGER)
    AS
     begin
        -- :messfilter_barr имеет вид '~dec1~dec2~dec3~' (например, '~20~45~17~')
        -- :messfilter_Lars имеет вид '~dec1~dec2~dec3~'
       for
       SELECT
             MESSAGE_ID
           , DMESSAGE
           , MESS_TYPE
           , NUA_TYPE
           , COLOR
           , NOMER
           , RAZDEL
           , USERID
           , OPERID
           , QUIT_DATE
           , QUIT_REASON
           , CANAL_NUMBER
           , CANALNUMBER_PER
           , POWER_LEVEL
           , DATAWORD
           , NEW_COD_X11_MESS
           , F_18_GUARDEDNOW
           , TAGPOINTID32
           , NON_TECH_SMS_COUNT
           , ADR_GUID_M4S
           , CHOP_NUM_M4S
           , DELTA_TIME_CHOP_M4S
       FROM MESS_LOG
       WHERE
            MESSAGE_ID>:ID_toLoadrfomExcluding
        AND MESSAGE_ID<=:ID_Max
        AND (
                     (nua_type!=78) -- !='N'
                 AND (nua_type!=85) -- !='U'
                 AND (nua_type!=65) -- !='A'
               OR
                     (nua_type=85 OR nua_type=65) -- ='U' OR ='A'
                 AND (:messfilter_Rest IS NULL OR :messfilter_Rest=1)
               OR
                 nua_type=78 -- ='N'
                 AND (mess_type!=92) -- != cNT_4p2_CMD_92_txt
                 AND (:messfilter_barr IS NULL OR :messfilter_barr CONTAINING '~'||mess_type||'~') -- ... OR '~20~45~17~'CONTAINING ~17~
               OR
                 nua_type=78 -- ='N'
                 AND (mess_type =92) -- =cNT_4p2_CMD_92_txt
                 AND (:messfilter_Lars is NULL or :messfilter_Lars containing '~'||typefor_clientfilter||'~')
            )
       ORDER BY MESSAGE_ID DESC
       into
            :MESSAGE_ID
           ,:DMESSAGE
           ,:MESS_TYPE
           ,:NUA_TYPE
           ,:COLOR
           ,:NOMER
           ,:RAZDEL
           ,:USERID
           ,:OPERID
           ,:QUIT_DATE
           ,:QUIT_REASON
           ,:CANAL_NUMBER
           ,:CANALNUMBER_PER
           ,:POWER_LEVEL
           ,:DATAWORD
           ,:NEW_COD_X11_MESS
           ,:F_18_GUARDEDNOW
           ,:TAGPOINTID32
           ,:NON_TECH_SMS_COUNT
           ,:ADR_GUID_M4S
           ,:CHOP_NUM_M4S
           ,:DELTA_TIME_CHOP_M4S
       do suspend;
     
     end
     

     все RETURN параметры - это поля из таблицы MESS_LOG. Записей в таблице очень много, поэтому хочется узнать, можно ли оптимизировать запрос.


    Собственно, интересует именно громоздкий момент условия

    Код:
        -- :messfilter_barr имеет вид '~dec1~dec2~dec3~...~' (например, '~20~45~17~')
        -- :messfilter_Lars имеет вид '~dec1~dec2~dec3~...~'
    ...
    ...
        AND (
                     (nua_type!=78) -- !='N'
                 AND (nua_type!=85) -- !='U'
                 AND (nua_type!=65) -- !='A'
               OR
                     (nua_type=85 OR nua_type=65) -- ='U' OR ='A'
                 AND (:messfilter_Rest IS NULL OR :messfilter_Rest=1)
               OR
                 nua_type=78 -- ='N'
                 AND (mess_type!=92) -- != cNT_4p2_CMD_92_txt
                 AND (:messfilter_barr IS NULL OR :messfilter_barr CONTAINING '~'||mess_type||'~') -- ... OR '~20~45~17~'CONTAINING ~17~
               OR
                 nua_type=78 -- ='N'
                 AND (mess_type =92) -- =cNT_4p2_CMD_92_txt
                 AND (:messfilter_Lars IS NULL OR :messfilter_Lars CONTAINING '~'||typefor_clientfilter||'~')
            )

    строки messfilter_barr и messfilter_Lars формируются программой и передаются как параметры процедуры. Они задают фильтрацию записей по полю mess_type


    сам не знаю, как запрос можно оптимизировать, но чувствую, что это возможно

    PS вложенные запросы тут, в FB1.5, не работают.
     
  • Практические разделы :: Железо
  • Пардон за глупое название темы, вопрос решится, выкину тему.

    Теперь по делу.

    Имеется ноут, (наверное, уже весь форум запомнил этот мой чертов ноут) Sony-Vaio, лет ему уже, я так думаю, 5. Все у него было хорошо, вот только примерно с месяц назад начал он грузиться под свое особое настроение. Сегодня, говорит, не хочу грузиться, на вот тебе черный экран. Так что видела я только заставку BIOS, а потом, где положено появляться семерочному цветочку - черный экран.
    Иногда находило на ноут озарение, и он предлагал мне запустить Startup Recovery. Я благоразумно соглашалась. Но максимум через день начиналось все то же свечение черными экранами.
    Надоело.
    Я переустановила Вин-7. Через формат на всякий случай. :-D Несколько дней ноут весело моргал усеченным экраном, т.к. поставить родные дрова на дисплей у меня руки не доходили. Дошли. На мою голову. После установки дров я улицезрела все тот же черный экран.
    Не буду описывать пляски с бубном, но в результате удалось скормить ноуту свеженькие дрова, взятые с оф-сайта Sony. Съел. Заработал. И тут я решила поставить софт для моего плеера. Тоже Sony. Софт поставился, предложил перегрузиться. Как настоящая блондинка, я согласилась. Да и почему бы не согласиться, если эта софтина на этом самом ноуте раньше отлично работала?...
    Это было вчера.
    Возвращаться из перезагрузки ноут не желает никоим образом. Показывает мне экран BIOS, а потом демонстрирует веселенький такой синий смерть. 0х0....А. Это я записала. В Инете почитала.
    Но мало.
    Я тихо подозреваю, что у меня назрела железная проблема...
    Что я могу сделать, чтобы понять, в чем же-таки проблема???
    Я понимаю, что, возможно, софтина не хочет больше дружиться с семеркой, потому что семерка (как и положено нормальной лицензионной семерке) обновила себя сама и видимо, съела что-то, что конфликтует со старым софтом от плеера. Ну, могу я переустановиться заново (благо, не успела программ наставить), а где гарантия, что через пару дней не начнется такая же игра черно-синими экранами??
    Сервис-центра у нас в городе нет. Гарантии, понятное дело, тоже нет. Ничего нет. В М-ву в сервис-центр я так и не попала и не попаду.
    Ну, могу попробовать поставить Вин-ХР. СтОит?

    Как мне понять, железная у меня проблема или софтовая?
  • Привет всем!
    Хотел установить ОС на ноутбук HP Compaq 6730s, и никак не могу найти CD в загрузочном меню. Сам комп видит этот привод, но в списке нет. Может какие настройки в биосе выставить?
  • Учимся программировать :: Срочно пАмАгите!!!
  • Есть уравнение cos(x-1)-2x=0. Необходимо решить методами секущих, Ньютона и простых итераций. Если с методом бисекции и хорд я ещё кое-как справилась, то с остальными не очень - никак не могу написать функцию, вычисляющую производную :( Буду рада люой помощи в этом вопросе!
  • Учимся программировать :: Начинающим
  • Здравствуйте)

    Код:
    multimap<int,multimap<string,int> >knot;
    //заполняем ее...
    //хотим посмотреть:

    void Base::show_map()
    {
    typedef multimap <int, multimap<string,int> > Map;

    Map::iterator it,st;
    for(it=knot.begin();it!=knot.end();it=st)
    {
    int key=(*it).first;
    cout<<key<<"-"<<endl;
    pair<Map::const_iterator,Map::const_iterator> mpair=knot.equal_range(key);
    for(st=mpair.first;st!=mpair.second;++st)
                                    {тратата}
    }


    }
    Ругается на for(st=mpair.first;st!=mpair.second;++st){}
    Почему? Ведь такое работает:

    Код:
    typedef multimap<string, int> Map; 
    typedef Map::iterator mapIter;  
    Map mymap;    
    //заполняем ее..
    //хотим посмотреть:
    mapIter it, st;    
    for (it = mymap.begin();  it != mymap.end();  it = st)    
    {
             string Key = (*it).first;
            
             cout << Key << "-" << endl;
             pair<mapIter, mapIter> mpair = mymap.equal_range(Key);
          
             for (st = mpair.first;  st != mpair.second;  ++st)
             { tratata}    
    }    

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


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