HotXLS Belgeleri

OnUserFunction / OnUserFunctionEx geri çağrısı

OnUserFunction geri çağrısı, uygulama kodunun Calculate sırasında özel veya başka şekilde desteklenmeyen çalışma sayfası işlevlerini değerlendirmesine olanak tanır Calculate çağrısından önce TXLSWorkbook veya TXLSXWorkbook üzerinde atayın
Geri çağrı geçerli formül bağlamına ihtiyaç duyduğunda OnUserFunctionEx'i kullanın. Bağlam, 1 tabanlı sayfa dizinini ve formül hücresinin 1 tabanlı satır ve sütununu bildirir; bir hücreyi değerlendirmeyen çalışma kitabı düzeyindeki Calculate çağrıları satır ve sütunu 0 olarak bildirir

Sözdizimi

type
  TXLSUserArgKind = (akuValue, akuRangeRef, akuArray);

  TXLSUserFunctionContext = record
    SheetIndex: Integer;
    Row: Integer;
    Col: Integer;
    ArgCount: Integer;
    ArgKinds: array of TXLSUserArgKind;
  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;
property AllowUnsafeFormulaCallbacks: Boolean;

Bağımsız Değişkenler

FunctionName Formül metnindeki fonksiyon adı
Args Değerlendirilen bağımsız değişken değerlerini içeren, sıfır tabanlı bir Variant dizisi Sıfır bağımsız değişkenli fonksiyonlar için bu değer Null'dur
Context OnUserFunctionEx için SheetIndex, Row ve Col değerlerini ve bağımsız değişken tanımlayıcısını bildirir: ArgCount, Args dizisinin uzunluğuyla eşleşir (sıfır bağımsız değişkenli çağrılarda 0) ve ArgKinds, her bağımsız değişkeni akuValue (literal değer), akuRangeRef (hücre veya aralık başvurusu) ya da akuArray (dizi sabiti) olarak sınıflandırır. Hücre formülleri için sayfa, satır ve sütun değerleri 1 tabanlıdır; değerlendirilen bir hücre olmadığında satır ve sütun 0'dır. Türler, bağımsız değişkenler değerlendirilmeden önce yakalanır; böylece SUM ya da MAP tarzı bir işleyici, değerlendirilen Args girdisi yalnızca değeri taşısa bile çağıranın bir başvuru yazdığını anlar
Value Bunu fonksiyon sonucuna ayarlayın
Handled Geri çağrı bir sonuç sağladığında True olarak ayarlayın. Normal desteklenmeyen fonksiyon davranışını sürdürmek için False bırakın

Geri çağrı güvenlik politikası

AllowUnsafeFormulaCallbacks, Klasik XLS ve XLSX çalışma kitaplarında varsayılan olarak False'tur; dolayısıyla bir formülü korumak, ana uygulama koduna tehlikeli bir dış veya makro tarzı işlev adını işleme yetkisi vermez
Varsayılan geçit, tanınan bir future-function öneki normalize edildikten sonra DDE, CALL, REGISTER, REGISTER.ID, WEBSERVICE, RTD, SQL.REQUEST, EXEC, RUN, CREATE.OBJECT, APP.ACTIVATE, SEND.KEYS, OPEN, SAVE, SAVE.AS, FOPEN, FWRITE, FWRITELN, FCLOSE ve FILE.DELETE işlevlerini kapsar
Reddetme işlemi, bağımsız değişken değerlendirmesinden ve çalışma kitabına özel, işlem genelindeki, çözümleyici ya da olay geri çağrılarının çalıştırılmasından önce gerçekleşir; sıradan özel ve desteklenmeyen işlev adları mevcut geri çağrı davranışlarını korur
Çalışma kitabı özelliğini yalnızca her formül ve kayıtlı işleyiciye güvendiğinizde True yapın; bağlamsal değerlendirme bunun yerine TXLSFormulaEvaluationOptions.AllowUnsafeFormulaCallbacks üzerinden tek bir çağrı için katılabilir, açıkça verilen bir False ise çalışma kitabı genelindeki katılmayı geçersiz kılar

Örnek

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)');

Bağlam duyarlı örnek

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');

Aralık bağımsız değişkenlerinin alınması

Bir bağımsız değişken bir çalışma sayfası aralığına çözümlendiğinde Args girdisi, bir ICalcRangeList taşıyan varUnknown türünde bir Variant olur; kapsanan her hücrenin değerlendirilen değeri Variant içine kopyalanmaz. Listeyi döndüren VarIsRange aşırı yüklemesiyle test edip çıkarın, ardından çözümlenmiş dikdörtgenleri TXLSCalcRange üzerinden okuyun
type
  TXLSCalcRange = class
    property row1: Integer;   { 0-based, inclusive }
    property col1: Integer;   { 0-based, inclusive }
    property row2: Integer;
    property col2: Integer;
    property SheetIndex: Integer;
  end;

  ICalcRangeList = interface
    property Count: Integer;
    property Item[Index: Integer]: TXLSCalcRange;
  end;

function VarIsRange(Value: Variant): Boolean; overload;
function VarIsRange(Value: Variant; var Int: ICalcRangeList): Boolean; overload;
function RangeToVariant(Value: TXLSCalcRangeList): Variant;
    
Koordinatlar TXLSGetValue kuralına uyar: sıfır tabanlı ve dahil edicidir. Kendisi bir aralık döndürmek isteyen bir işleyici, bir TXLSCalcRangeList kurar, Value'ya atamadan önce onu RangeToVariant ile sarar; motor da bu durumda skaler bir anlık görüntü yerine aralık başvurusunu bağımlı formüller için saklar

Ayrıca bkz.