C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамический код!  (Прочитано 9768 раз)
Игорюха
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 159

Творю чудеса...


« : 06 апреля 2007, 20:16:28 »

У меня на работе в программу встроен язык программирования нашего продукта, язык написан людьми из нашей фирмы и применяеться только для разработок внутри предприятия. Дак вот там есть компонент в который вводишь текстовую переменную в которой хранится кусок кода она его обрабатывает как программный код! И есть такая функция скажем - iif("условие", text_if_true, text_if_false); Такую функцию удобно в строке использовать и текст менее грамосткий получается.
например:
sText=sText+iif (CheckBox->Checked, '.Create(Form1:"Главная форма":ZForm(0,0){.Width=10;.Height=10 ... куча еще всяких параметров и объектов })', '.Create(Form1:"Не главная форма":ZForm(0,0){.Width=10;.Height=10 ... куча еще всяких параметров и объектов })');
потом делаешь вот так:
ItpIclBlock.OnExecute={sText};
ItpIclBlock.Execute;
он создаст то, что написано в тексте.
Как с такой возможность в C++ обстоят дела? Реально ли реализвать такое, и не кажеться ли вам что давольно удобная штука?
Записан
olegenty
Администратор
***

Сказали спасибо: +16/-7
Offline Offline

Сообщений: 520


« Ответ #1 : 07 апреля 2007, 08:32:01 »

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

и самое главное: ЗАЧЕМ??? если есть такая тяга к скриптованию, купи FastScript, в него скриптовый С++ встроен.
Записан
AVC
Администратор
***

Сказали спасибо: +28/-6
Offline Offline

Сообщений: 1189


« Ответ #2 : 10 апреля 2007, 10:24:15 »

Цитировать
Как с такой возможность в C++ обстоят дела? Реально ли реализвать такое, и не кажеться ли вам что давольно удобная штука?
Реально, и, лично я, часто реализую НО

- скрипт делается/обслуживает не произвольный код а некую, заранее оговоренную, часть

- скрипт хранится вне кода приложения и используется для точной подгонки и адекватной реакции приложения на создавшиеся в данный момент выполнения условия.

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

- по этим же соображениям скриптовый язык не должен черезмерно усложняться языковыми конструкциями

А если вы хотите получить некую абстакцию над интерфейсом и на уровне исходного кода, то можно посмотреть QT, wxWidgets, ...
Записан
khan
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 93


« Ответ #3 : 14 апреля 2007, 17:59:18 »

по-моему 1С из той же серии не так ли?
Записан
Игорюха
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 159

Творю чудеса...


« Ответ #4 : 14 апреля 2007, 18:09:57 »

Почти угодал. Тоже бухгалтерская программа.
Записан
olegenty
Администратор
***

Сказали спасибо: +16/-7
Offline Offline

Сообщений: 520


« Ответ #5 : 16 апреля 2007, 11:16:43 »

я тоже склоняюсь в перспективе к варианту AVC: конструируемые формы базируются на ряде примитивов с четко определенным поведением. при конструировании формы определяется только расположение на ней примитивов, параметры для инициализации каждого, связка между примитивами, если таковая имеется. но это не совсем скриптование.
Записан
Vyacheslav
Expert
****

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 29


WWW
« Ответ #6 : 25 апреля 2007, 14:00:48 »

Вообще то никто не мешает использовать любой скриптовый язык в своих программах,
используя Microsoft Script Control
Меню Project->Import Type Library
выбираем Microsoft Script Control и генерим VCL компонент на его основе.
Потом развлекаемся как хотим
Записан
olegenty
Администратор
***

Сказали спасибо: +16/-7
Offline Offline

Сообщений: 520


« Ответ #7 : 27 апреля 2007, 15:05:57 »

вот мой вариант "динамического" кода:
Код
void __fastcall TfmUnitEdit::actOperInsertExecute(TObject *Sender)
{
   PTable Data(new CTable());
 
   CFields Operation;
   Operation.Add("FieldName", "Operation");
   Operation.Add("Caption", "Номер операции");
   Operation.Add("Description", "Порадковый номер операции, в идеале должен соответствовать номеру операции в техпроцессе");
   Operation.Add("Value", (short)NULL);
   Operation.Add("ValueType", OUniEditor::evtInteger);
   Operation.Add("Check", CheckOperationValue_);
   Operation.Add("FinalCheck", FinalCheckOperation_);
   Data->Append(Operation);
 
   CFields Name;
   Name.Add("FieldName", "Name");
   Name.Add("Caption", "Наименование операции");
   Name.Add("Description", "Наименование операции, по возможности должно быть максимально ёмким");
   Name.Add("Value", "");
   Name.Add("ValueType", OUniEditor::evtString);
   Name.Add("Check", CheckOperationNameValue_);
   Data->Append(Name);
 
   CFields Position;
   Position.Add("FieldName", "Position");
   Position.Add("Caption", "Позиция конвейера");
   Position.Add("Description", "Позиция конвейера");
   Position.Add("Value", (short)0);
   Position.Add("DisplayValue", (short)0);
   Position.Add("ValueType", OUniEditor::evtList);
   Position.Add("Check", CheckOperationPositionValue_);
   Position.Add("GetList", ListOperationPositions_);
   Data->Append(Position);
 
   CFields SideID;
   SideID.Add("FieldName", "SideID");
   SideID.Add("Caption", "Сторона");
   SideID.Add("Description", "Сторона, на которой выполняется данная операция");
   SideID.Add("Value", 1);
   SideID.Add("DisplayValue", "Слева");
   SideID.Add("ValueType", OUniEditor::evtList);
   SideID.Add("GetList", ListOperationSide_);
   Data->Append(SideID);
 
   CFields WorkplaceID;
   WorkplaceID.Add("FieldName", "WorkplaceID");
   WorkplaceID.Add("Caption", "Номер рабочего места");
   WorkplaceID.Add("Description", "Номер рабочего места на позиции");
   WorkplaceID.Add("Value", 0);
   WorkplaceID.Add("DisplayValue", "0");
   WorkplaceID.Add("ValueType", OUniEditor::evtList);
   WorkplaceID.Add("GetList", ListOperationWorkplace_);
   Data->Append(WorkplaceID);
 
   CFields Worktime;
   Worktime.Add("FieldName", "Worktime");
   Worktime.Add("Caption", "Трудоёмкость");
   Worktime.Add("Description", "Трудоёмкость операции");
   Worktime.Add("Value", 0.0);
   Worktime.Add("ValueType", OUniEditor::evtFloat);
   Data->Append(Worktime);
 
   CFields QualitySpec;
   QualitySpec.Add("FieldName", "QualitySpec");
   QualitySpec.Add("Caption", "Требования");
   QualitySpec.Add("Description", "Требования к качеству выполнения операции. Контроль. Перенос строки Ctrl+Enter.");
   QualitySpec.Add("Value", "");
   QualitySpec.Add("ValueType", OUniEditor::evtText);
   Data->Append(QualitySpec);
 
   CFields Description;
   Description.Add("FieldName", "Description");
   Description.Add("Caption", "Доп. информация");
   Description.Add("Description", "Заполнение не обязательно. Дополнительные отметки заполняющего.");
   Description.Add("Value", "");
   Description.Add("ValueType", OUniEditor::evtString);
   Data->Append(Description);
 
   PResTable Result = (*Adapter)("Addons.UniEditor.Edit", Data);
   if (Result.get() && Result->Valid())
   {
       CFields &Fields = (*Result)[0];
       try
       {
           try
           {
               mtOperation->DisableControls();
               mtOperation->Append();
               mtOperationOperation->AsInteger   = Fields["Operation"];
               mtOperationPosition->AsInteger    = Fields["Position"];
               mtOperationWorkplaceID->AsInteger = Fields["WorkplaceID"];
               mtOperationWorktime->AsFloat      = Fields["Worktime"];
               mtOperationName->AsString         = Fields["Name"];
               mtOperationDescription->AsString  = Fields["Description"];
               mtOperationQualitySpec->AsString  = Fields["QualitySpec"];
               mtOperation->Post();
               mtOperation->RefreshRecord();
               mtOperation->SortByFields("Position;Num;Operation");
           } catch(const Exception &E)
           {
               OUtils::CatchExceptionMessage("Ошибка добавления операции", E);
           }
       } __finally
       {
           mtOperation->EnableControls();
       }
   }
}
 
Записан
xapac
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 6


« Ответ #8 : 12 декабря 2008, 09:41:30 »

Lua или Phyton, или еще какойнибуть интерпретируемый скриптовый язык поключаем, и получится то что нужно
Подмигивающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: