توثيق HotXLS

معاودة الاتصال OnUserFunction / OnUserFunctionEx

تتيح معاودة الاتصال OnUserFunction لكود التطبيق تقييم دوال ورقة العمل المخصصة أو غير المدعومة أثناء Calculate. عيِّنها على TXLSWorkbook أو TXLSXWorkbook قبل استدعاء Calculate
استخدم OnUserFunctionEx عندما تحتاج معاودة الاتصال إلى سياق الصيغة الحالي. يُبلِّغ السياق عن فهرس الورقة القائم على 1 بالإضافة إلى صف وعمود خلية الصيغة القائمَين على 1؛ تُبلِّغ استدعاءات Calculate على مستوى المصنف التي لا تُقيِّم خلية بصف وعمود = 0

البنية

type
  TXLSUserFunctionContext = record
    SheetIndex: Integer;
    Row: Integer;
    Col: Integer;
  end;

  TXLSUserFunctionEvent = procedure(
    Sender: TObject;
    const FunctionName: WideString;
    const Args: Variant;
    var Value: Variant;
    var Handled: Boolean) of object;

  TXLSUserFunctionExEvent = procedure(
    Sender: TObject;
    const FunctionName: WideString;
    const Args: Variant;
    const Context: TXLSUserFunctionContext;
    var Value: Variant;
    var Handled: Boolean) of object;

property OnUserFunction: TXLSUserFunctionEvent;
property OnUserFunctionEx: TXLSUserFunctionExEvent;

المتغيرات

FunctionName دالة اسم من صيغة نص
Args zero-مستند Variant array containing evaluated argument قيم. لـ zero-argument دوال هذا قيمة هو Null
Context لـ OnUserFunctionEx, reports SheetIndex, Row, و Col. ورقة, صف و عمود قيم هي 1-مستند لـ خلية صيغ; صف و عمود هي 0 عند no خلية هو being evaluated
Value ضبط هذا إلى دالة result
Handled ضبط إلى True عند callback supplies result. Leave False إلى keep normal unsupported دالة behavior

مثال

procedure TForm1.WorkbookUserFunction(Sender: TObject;
  const FunctionName: WideString; const Args: Variant;
  var Value: Variant; var Handled: Boolean);
begin
  if SameText(FunctionName, 'DOUBLEPLUS') then
  begin
    Value := Double(Args[0]) * 2 + Double(Args[1]);
    Handled := True;
  end;
end;

Workbook.OnUserFunction := WorkbookUserFunction;
Value := Workbook.Calculate('=DOUBLEPLUS(A1;5)');

مثال مُدرك للسياق

procedure TForm1.WorkbookUserFunctionEx(Sender: TObject;
  const FunctionName: WideString; const Args: Variant;
  const Context: TXLSUserFunctionContext;
  var Value: Variant; var Handled: Boolean);
begin
  if SameText(FunctionName, 'ROWBONUS') then
  begin
    Value := Double(Args[0]) + Context.Row + Context.Col;
    Handled := True;
  end;
end;

Workbook.OnUserFunctionEx := WorkbookUserFunctionEx;
Value := Worksheet.Calculate('=C2');

انظر أيضاً