Для записи я использовал TCC, Крошечный компилятор C , для быстрого тестирования маленького кода. Это может генерировать exe и DLLs.
Вы, возможно, должны были бы загрузить заголовки Windows: это имеет ограниченное подмножество, Вы могли бы хотеть больше.
Цифровой Марс также имеет бесплатный компилятор C/C++ разумного размера.
Хорошо, кое-что:
Function.apply
позволяет вызывать функцию с массивом аргументов.
Вы можете написать это так
function Field_Changed(delegate, args)
{
if (isBlocking()) return false;
if (isDirty(args[0])) { //args[0] is el
delegate.apply(this, args);
waitForCallback();
}
}
И называть это так:
Field_Changed(Agent().Field2_Changed, [el, getApplicationState(), whatever...]);
Я использовал следующую служебную функцию, которую написал много лет назад:
/**
* @classDescription This class contains different utility functions
*/
function Utils()
{}
/**
* This method returns a delegate function closure that will call
* targetMethod on targetObject with specified arguments and with
* arguments specified by the caller of this delegate
*
* @param {Object} targetObj - the object to call the method on
* @param {Object} targetMethod - the method to call on the object
* @param {Object} [arg1] - optional argument 1
* @param {Object} [arg2] - optional argument 2
* @param {Object} [arg3] - optional argument 3
*/
Utils.createDelegate = function( targetObj, targetMethod, arg1, arg2, arg3 )
{
// Create an array containing the arguments
var initArgs = new Array();
// Skip the first two arguments as they are the target object and method
for( var i = 2; i < arguments.length; ++i )
{
initArgs.push( arguments[i] );
}
// Return the closure
return function()
{
// Add the initial arguments of the delegate
var args = initArgs.slice(0);
// Add the actual arguments specified by the call to this list
for( var i = 0; i < arguments.length; ++i )
{
args.push( arguments[i] );
}
return targetMethod.apply( targetObj, args );
};
}
Итак, в вашем примере я бы заменил
function Field1_Changed(el) {
Field_Changed(el, delegate(Agent().Field1_Changed, $j(el).val()), true);
}
чем-то вроде
function Field1_Changed(el) {
Field_Changed(el, Utils.createDelegate(Agent(), Agent().Field1_Changed, $j(el).val()), true);
}
Тогда внутри Agent (). FieldX_Changed
Я бы вручную вызвал getApplicationState ()
(и инкапсулировал эту логику в общий метод обработки изменений полей, которые все из Agent () .FieldX_Changed
методы будут вызывать внутренние).