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.