Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анализ ввода, как оформить? 
:(
    Опции темы
Лена
Дата 22.2.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Подскажите, как реализовать следующий алгоритм:
На форме есть 10 штук компонента Edit. Пользователь может ввести в эти окна в произвольном порядке следующие значения: int, short, double, VARIANT, BSTR, bool, long плюс значения (см. рисунок).
Мне нужен алгоритм, который, проанализировав ввод пользователя, определил, сколько параметров заполнил пользователь и какие они имею значения.
Например, пользователь написал в первом поле int 2, а во втором bool false. Алгоритм, проанализировав строки, дает понять, что в функцию надо передать цифру 2 и значение false. 
Помогите написать такой алгоритм анализа ввода. Я его уже реализовала, но это получился километр кода с огромным кол-вом операторов if. Очень не красиво.  А если добавить еще один Edit то вообще получиться два километра кода.  smile 


Ниже фрагмент моего кода где анализируется ситуация если пользователь заполнил только один Edit. Анализировать этот код не надо – он правильный, но такой подход порождает километр кода за ним. 
Подскажите, как сделать красиво?  smile 

Код

//три строки ниже определены в другом месте
//AnsiString Types[10];
//AnsiString P1Znachenie[10]; содержит значение за типом
//AnsiString ALLParamsR; определено в другом месте
//GetPropWord анализируется в другом месте программы

//анализ если введено значение только в первый Edit
//главное понять, что написал пользователь и занести это в  Variant par1;

 case 1:
       {
     Variant par1;
     //bool
     if(Types[0] == "bool" || Types[0] == "BOOL")
       {
           if (P1Znachenie[0] == "1" || P1Znachenie[0] == "TRUE" || P1Znachenie[0] == "true")
             {
              bool v = true;
              Variant varS;
              varS.vt = VT_BOOL;
              varS.iVal = v;
              par1 = varS;
             }
             if (P1Znachenie[0] == "0" || P1Znachenie[0] == "FALSE" || P1Znachenie[0] == "false")
             {
              bool v = false;
              Variant varS;
              varS.vt = VT_BOOL;
              varS.iVal = v;
              par1 = varS;
             }
       }
    if(Types[0] == "short" || Types[0] == "SHORT")
       {
         short newpar1 = P1Znachenie[0].ToInt();
         Variant varS;
  varS.vt = VT_I2;
  varS.iVal = newpar1;
  par1 = varS;

       }
     if(Types[0] == "long" || Types[0] == "LONG")
       {
         long newpar1 = P1Znachenie[0].ToDouble();
         Variant varS;
  varS.vt = VT_I4;
  varS.lVal = newpar1;
  par1 = varS;

       }
     if(Types[0] == "double" || Types[0] == "DOUBLE")
       {
         double newpar1 = P1Znachenie[0].ToDouble();
         Variant varS;
  varS.vt = VT_R8;
  varS.dblVal = newpar1;
  par1 = varS;

       }
      if(Types[0] == "int" || Types[0] == "INT")
       {
         int newpar1 = P1Znachenie[0].ToInt();
         Variant varS;
  varS.vt = VT_INT;
  varS.intVal = newpar1;
  par1 = varS;

       }
       if(Types[0] == "float" || Types[0] == "FLOAT")
       {
         float newpar1 = P1Znachenie[0].ToDouble();
         Variant varS;
         varS.vt = VT_R4;
  varS.fltVal = newpar1;
         par1 = varS;

       }
       if(Types[0] == "bstr" || Types[0] == "BSTR")
       {

           BSTR x = SysAllocString(WideString(P1Znachenie[0]).c_bstr());
           Variant varS;
           varS.vt = VT_BSTR;
           varS.bstrVal = x;
           par1 = varS;
           SysFreeString(x);

       }

       //для Variant
       if(Types[0] == "VARIANT")
       {
        par1 = P1Znachenie[0];
       }
//именно сюда надо передать то, что нужно из окна edit
            TAutoArgs<1> args;
            args[1] = par1; //здесь главное!!!

            try{

           if(ALLParamsR == "void" || ALLParamsR == "void*") 
                   {
                     if(GetPropWord == "PROPERTYPUT")
                       Form1->OleContainer1->OleObject.OlePropertySet(NFunck,static_cast<TAutoArgsBase&>(args));
                     if(GetPropWord == "PROPERTYGET")
                       Form1->OleContainer1->OleObject.OlePropertyGet(NFunck,static_cast<TAutoArgsBase*>(&args));
                     if(GetPropWord == "FUNC")
                       Form1->OleContainer1->OleObject.OleFunction(NFunck,static_cast<TAutoArgsBase*>(&args));
                    }
                   else
                       {

                               Variant X;
                               if(GetPropWord == "PROPERTYGET")
                                 X = Form1->OleContainer1->OleObject.OlePropertyGet(NFunck,static_cast<TAutoArgsBase*>(&args));
                               if(GetPropWord == "FUNC")
                                 X = Form1->OleContainer1->OleObject.OleFunction(NFunck,static_cast<TAutoArgsBase*>(&args));
                                 Form1->Edit2->Text = X;


                       }
               }
                catch(...)  {
                            ShowMessage("Не удалось вызвать функцию c параметрами " + NFunck);
                            return;
                            }
               //return;
    //конец одного параметра;

   break;  }

//далее километр из других case…
//для двух, трех и т.д. edit-ов.





Присоединённый файл ( Кол-во скачиваний: 21 )
Присоединённый файл  1.gif 18,60 Kb
PM MAIL   Вверх
Vyacheslav
Дата 22.2.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Да  я не вижу большой проблемы 
Напишите функция, которая на входе получает строку, на выходе Variant и обработайте все свои десять едитов в цикле.
Вот примерно как будет выглядеть функция
Код

Variant __fastcall TForm1::GetValue( const AnsiString& Value)
{
  static String  types[] = { "int",  "short",  "double", "variant", "bstr", "bool", "long" };
  String temp = Value.Trim().LowerCase();
  Variant result;
  for(int = 7; i--; ) {
    if( temp.AnsiPos( types[i] ) ){
        temp = temp.SubString(types[i].Lenght() + 1, temp.Lenght() - types[i].Lenght() - 1).Trim();
        switch( i )
        {
          case 0:  result = temp.ToInt();  break;
          case 1:  result = (short) temp.ToInt();  break;
          case 2:  result =  temp.ToDouble(); break;
          case 3:  // тут код для  VAriant
          break
          case 4: result = WideString(temp).b_str();  break;
          case 5: result = (type == "true")? true:false; break;
          case 6: result =  (long) temp.ToDouble(); break;
        }
     }
  }
  return result;





}
 



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
FFFFFFF7
Дата 24.2.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.10.2006

Репутация: 2
Всего: 2



Цитата(Лена @  22.2.2007,  16:47 Найти цитируемый пост)
Пользователь может ввести в эти окна в произвольном порядке следующие значения: int, short, double, VARIANT, BSTR, bool, long плюс значения

кстати, вот вопрос. А зачем пользователю вводить имя типа?
Почему бы не воспользоваться typeid()?
Код

typeid(txt->Text).name() //вернет имя типа

?
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
FFFFFFF7
Дата 25.2.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.10.2006

Репутация: 2
Всего: 2



или нет... Ошибся. Всегда будет возвращать std::AnsiString. Прошу прощения.
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Лена
Дата 18.3.2007, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Vyacheslav, подскажите пожалуйста подробнее вашу идею.
Например, пользователь заполнил только три Edit-a, следующим образом:
short 4; short 6; bool true;
Тогда вызов вашей функции как правильно оформить в моем случае, так?:
Код

    case 3: {

                   Variant par1 = GetValue(Edit1->Text);
                   Variant par2 = GetValue(Edit2->Text);
                   Variant par3 = GetValue(Edit3->Text);

      //передать в  TAutoArgs 
        TAutoArgs<3> args;
             args[1] = par1;
             args[2] = par2;
             args[3] = par3;

             try{

            if(ALLParamsR == "void" || ALLParamsR == "void*")
                    {
                      if(GetPropWord == "PROPERTYPUT")
                        Form1->OleContainer1->OleObject.OlePropertySet(NFunck,static_cast<TAutoArgsBase&>(args));
                      if(GetPropWord == "PROPERTYGET")
                        Form1->OleContainer1->OleObject.OlePropertyGet(NFunck,static_cast<TAutoArgsBase*>(&args));
                      if(GetPropWord == "FUNC")
                        Form1->OleContainer1->OleObject.OleFunction(NFunck,static_cast<TAutoArgsBase*>(&args));
                     }
                    else
                        {

                                Variant X;
                                //if(GetPropWord == "PROPERTYPUT")
                                  //v = Form1->OleContainer1->OleObject.OlePropertySet(NFunck,static_cast<TAutoArgsBase&>(args));
                                if(GetPropWord == "PROPERTYGET")
                                  X = Form1->OleContainer1->OleObject.OlePropertyGet(NFunck,static_cast<TAutoArgsBase*>(&args));
                                if(GetPropWord == "FUNC")
                                  X = Form1->OleContainer1->OleObject.OleFunction(NFunck,static_cast<TAutoArgsBase*>(&args));
                                  Form1->Edit2->Text = X;


                        }
                }
                 catch(...)  {
                             ShowMessage("Не удалось вызвать функцию c параметрами " + NFunck);
                             return;
                             }
             break;
             //конец трех параметров;
            }





Это сообщение отредактировал(а) Лена - 18.3.2007, 21:21
PM MAIL   Вверх
Лена
Дата 19.3.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 16.8.2006

Репутация: 11
Всего: 11



Все, разобралась. Работает. smile 
Оставила немного переделанный вариант:
Код

Variant __fastcall TForm1::GetValue( const AnsiString& Value)
{

  static String  types[] = { "int",  "short",  "double", "variant", "bstr", "bool", "long", "float" };
  String temp = Value.Trim().LowerCase();
  Variant result;
  for(int i = 7; i>0; i--)
  {
    if(temp.AnsiPos(types[i]))
    {
        temp = temp.SubString(types[i].Length()+2, temp.Length() - types[i].Length()+1).Trim();

        switch( i )
        {
          case 0:
                {
                result = temp.ToInt();
                int newpar1 = result;
                result.vt = VT_INT;
                  result.intVal = newpar1;
                break;
                }
          case 1:
                {
                result = (short) temp.ToInt();
                short newpar1 = result;
                result.vt = VT_I2;
                  result.iVal = newpar1;
                  break;
                }
          case 2:
                {
                result =  temp.ToDouble();
                double newpar1 = result;
                result.vt = VT_R8;
                  result.dblVal = newpar1;
                break;
                }
          case 3:
                {
                 result = Value;
                 break;
                }
          case 4:
                {
                 BSTR x = SysAllocString(WideString(temp).c_bstr());
                 result.vt = VT_BSTR;
                 result.bstrVal = x;
                 SysFreeString(x);
                 break;
                }
          case 5:
                {
                 result = (types[i] == "true")? true:false;
                 bool v = result;
                 result.vt = VT_BOOL;
                 result.iVal = v;
                 break;
                }
          case 6:
                {
                 result =  (long) temp.ToDouble();
                 long newpar1 = result;
                 result.vt = VT_I4;
                   result.lVal = newpar1;
                 break;
                }
          case 7:
                {
                 result =  (float) temp.ToDouble();
                 float newpar1 = result;
                 result.vt = VT_R4;
                   result.fltVal = newpar1;
                 break;
                }
        }
     }
  }
  return result;

}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.