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