کلاس TXLSFormulaDebugger
TXLSFormulaDebugger یک فرمول را در زمینه یک کاربرگ XLSX تجزیه و تحلیل میکند و یک TXLSFormulaDebugSession مالکیتدار برمیگرداند
نشست درخت عبارت کامل تجزیهشده را با ترتیب ارزیابی واقعی، مقادیر میانی، مختصات وابستگی، شاخههای تنبل انتخابشده، عبارتهای ردشده و اولین مبدأ خطا ترکیب میکند
فراخواننده مالک هر نشستی است که توسط Analyze بازگردانده میشود و باید آن را آزاد کند
اعلام
type
TXLSFormulaDebugger = class
constructor Create(Worksheet: TXLSXWorksheet);
function Analyze(const Formula: WideString):
TXLSFormulaDebugSession;
end;
اعضای نشست
| Formula | منبع عادیسازیشده بدون علامت مساوی اختیاری ابتدایی |
| FinalValue | مقدار اسکالر محاسبهشده یا خطای فرمول استاندارد Variant |
| Nodes | گرههای تجزیهشده به ترتیب والد-قبل-فرزند |
| Dependencies | وابستگیهای سلول، محدوده یا نام تعریفشده با مختصات کاربرگ حلشده در صورت موجود بودن |
| StepNodes | گرهها به ترتیب ارزیابی قطعی، شامل گرههای ردشده |
| CurrentNode | گره انتخابشده توسط مکاننمای ناوبری تعاملی |
| ErrorOriginNodeId | عمیقترین گرهی که خطای فرمول نهایی را ایجاد کرده است، یا 1- زمانی که نتیجه نهایی خطا نیست |
| ErrorCode | کد خطای اکسل حملشده توسط مقدار خطای نهایی |
| ErrorText | متن نمایشی اکسل مانند #DIV/0! یا #N/A |
تشخیص گره
هر TXLSFormulaDebugNode والد، عمق، بازه منبع، نوع گره، نام عملگر یا تابع، شناسههای گره عملوند، مقادیر عملوند، مقدار نتیجه، نمایه ارزیابی، وضعیت، شاخه انتخابشده و جزئیات خطای خود را گزارش میدهد
وضعیت گره fdsPending، fdsEvaluated، fdsSkipped یا fdsError است
تشخیص شاخه مسیرهای true و false IF، مسیرهای مقدار و بازگشت IFERROR یا IFNA و شاخه انتخابشدهٔ CHOOSE، IFS یا SWITCH را متمایز میکند
خطاهای داخلی بازیابیشده حتی زمانی که نتیجه فرمول نهایی معتبر است روی گرههای خود قابل مشاهده میمانند
ناوبری
MoveFirstاولین گام ارزیابی را انتخاب میکندMoveNextوMovePreviousمکاننمای جاری را بدون محاسبه مجدد جابهجا میکنندSeekNodeیک گره را با شناسه پایدار محلی نشست انتخاب میکندResetمکاننما را پاک میکند و در عین حال همه تشخیصها را حفظ میکند
مثال
Debugger := TXLSFormulaDebugger.Create(Sheet);
try
Session := Debugger.Analyze('=IF(A1=0,42,B1/C1)');
try
if Session.MoveFirst then
repeat
Writeln(Session.CurrentNode.Source);
until not Session.MoveNext;
finally
Session.Free;
end;
finally
Debugger.Free;
end;