توفر الوحدة lxOutline هندسة محايدة للمحرك وتخطيطًا للتعديلات الخاصة بمخططات الصفوف والأعمدة التفصيلية
تخزن الامتدادات المجسدة فقط، وتتعرف على العقد الملخصة من انتقالات مستويات المخطط المتجاورة، وتنشئ تغييرات حالة مضغوطة لتخطيطي الملخص بعده والملخص قبله دون تخصيص مدخل لكل إحداثية من إحداثيات ورقة العمل
الأنواع الأساسية
TXLSOutlineAxis = (xoaRows, xoaColumns);
TXLSOutlineChildMode = (xocPreserve, xocCollapse, xocExpand);
TXLSOutlineMutationPlan = class
constructor Create(AAxis: TXLSOutlineAxis);
procedure Clear;
property Axis: TXLSOutlineAxis;
property Count: Integer;
property Changes[Index: Integer]: TXLSOutlineStateChange;
end;
TXLSOutlineGeometry = class
constructor Create(AAxis: TXLSOutlineAxis;
ASummaryAfter: Boolean);
procedure Clear;
property Axis: TXLSOutlineAxis;
property SpanCount: Integer;
procedure AddSpan(AFirstIndex, ALastIndex, ALevel: Integer;
AHidden, ACollapsed: Boolean);
function TryGetNode(ANodeIndex: Integer;
out ANode: TXLSOutlineNode): Boolean;
function TryBuildNodeCollapsePlan(ANodeIndex: Integer;
ACollapsed: Boolean; AChildMode: TXLSOutlineChildMode;
APlan: TXLSOutlineMutationPlan): Boolean;
procedure BuildDisplayLevelPlan(ADisplayLevel: Integer;
AChildMode: TXLSOutlineChildMode;
APlan: TXLSOutlineMutationPlan);
end;
فهارس الصفوف والأعمدة تبدأ من الواحد، ومستويات المخطط غير سالبة، ويجب إضافة الامتدادات بترتيب صارم متزايد وغير متداخل
تُدمج الامتدادات المتجاورة ذات المستوى والحالة المخفية وحالة الطي نفسها تلقائيًا؛ والفهارس المحذوفة لها مستوى ضمني يساوي صفرًا وحالة مرئية وبلا علامة طي
يتذكر كلا الفصيلتين Axis الخاص به من لحظة الإنشاء، ويفرّغ Clear خطة أو هندسة لإعادة الاستخدام دون إعادة تخصيص المخازن المؤقتة الداخلية، ويبلّغ SpanCount عن عدد الامتدادات المدمجة التي تحتفظ بها الهندسة حاليًا
دلالات العقد
| NodeIndex | صف أو عمود الملخص الفعلي الذي استعلم عنه المستدعِي |
| FirstDetailIndex / LastDetailIndex | نطاق التفاصيل المتصل الذي يكون مستواه أعمق من عنصر الملخص |
| SummaryLevel | مستوى المخطط المخزن على عنصر الملخص، أو صفر عندما لا يكون ذلك العنصر مجسدًا |
| Level | مستوى المجموعة الذي تمثله العقدة، ويساوي SummaryLevel + 1 |
| SummaryHidden | الحالة المخفية المخزنة على عنصر الملخص |
| Collapsed | علامة الطي الصريحة المخزنة على عنصر الملخص |
| SummaryAfter | صحيح عندما تسبق التفاصيل عنصر الملخص، وخطأ عندما تلحق به |
تبقى المجموعات المتداخلة مستقلة لأن كل استعلام يتوقف عند أول امتداد متجاور يكون مستواه ليس أعمق من عنصر الملخص المختار
تُنهي الفجوة أيضًا نطاق التفاصيل، فلا تستطيع البيانات الوصفية المتناثرة أن تربط صدفةً إحداثيات غير مستخدمة في مجموعة واحدة
خطط التعديل
تحوي خطة التعديل نطاقات مرتبة تبدأ من الواحد وقناع حقول يبيّن ما إذا كان كل نطاق يغيّر الحالة المخفية أو حالة الطي أو كلتيهما؛ وتُدمج التغييرات المتجاورة المكافئة تلقائيًا
| xocPreserve | تغيّر العقدة المختارة مع الاحتفاظ بعلامات طي الأبناء، وهو السلوك الافتراضي للمجموعات المتداخلة |
| xocCollapse | تعيّم عقد الأبناء على أنها مطوية عندما تكون داخل العقدة المختارة أو مخفية دون مستوى العرض المطلوب |
| xocExpand | تمحو علامات طي عقد الأبناء عندما تكون داخل العقدة المختارة أو مخفية دون مستوى العرض المطلوب |
يكشف توسيع أحد الآباء بوضع xocPreserve التفاصيل المباشرة بينما تبقى التفاصيل التابعة لأبناء مطويين مخفية؛ ولا يؤدي توسيع ابن داخل سلف مطوي إلى كشف المحتوى عبر ذلك السلف
مستويات العرض تبدأ من الواحد: يطوي المستوى 1 كل مجموعة من المستوى الأعلى، ويكشف كل مستوى أعلى مستوى مخطط إضافيًا واحدًا مع ضبط علامات عقد الحدود المطابقة
يؤدي بناء الحالة المطلوبة نفسها من هندسة تحتويها أصلًا إلى خطة فارغة، والاستعلام عن غير عقدة يعيد القيمة false مع خطة فارغة
تترك عمليات العقد الحالة المخفية المستقلة لعنصر الملخص المختار دون تغيير، ولا تكشف خطط مستوى العرض عناصر المستوى صفر التي أُخفيت خارج مجموعة مخطط
مهايئات ورقة العمل
function TryGetOutlineNode(AAxis: TXLSOutlineAxis;
ANodeIndex: Integer; out ANode: TXLSOutlineNode): Boolean;
function SetOutlineNodeCollapsed(AAxis: TXLSOutlineAxis;
ANodeIndex: Integer; ACollapsed: Boolean;
AChildMode: TXLSOutlineChildMode = xocPreserve): Boolean;
procedure SetOutlineDisplayLevel(AAxis: TXLSOutlineAxis;
ADisplayLevel: Integer;
AChildMode: TXLSOutlineChildMode = xocPreserve);
تكشف TXLSWorksheet وTXLSXWorksheet عن الأساليب الثلاثة نفسها، بحيث يمكن للمستدعِين الاستعلام عن عقدة ملخص لصف أو عمود يبدأ من الواحد أو تغييرها دون بناء الهندسة يدويًا
يقرأ المهايئ الكلاسيكي كتل الصفوف المخصصة وبيانات الأعمدة الوصفية المعينة فقط، بينما يدمج المهايئ الخاص بـ XLSX قوائم مستوى المخطط والحالة المخفية والطي المتناثرة لديه قبل تطبيق خطة تعديل مضغوطة واحدة في معاملة كتابة واحدة
تحتفظ مجموعات صفوف وأعمدة OpenDocument بحالة table:display المتداخلة الأصلية لديها؛ وتُسقط تعديلات البيانات الوصفية المباشرة والتغييرات الهيكلية للصفوف أو الأعمدة تلك الحالة بأمان إلى عقدة الملخص المنطقية، ويكتب التحويل إلى XLSX علامة الطي على عنصر ملخص XLSX بدلًا من كل عضو في المجموعة
تبقى الأسلوبان القائمان TXLSXWorksheet.ToggleRowGrouped وToggleColGrouped متاحين بوصفهما غلافي توافق؛ والوسيط لهما هو أول صف أو عمود تفاصيل، ويحل الغلاف عقدة الملخص المراعاة للاتجاه قبل تبديلها
مثال بلغة Delphi
Geometry := TXLSOutlineGeometry.Create(xoaRows, True);
Plan := TXLSOutlineMutationPlan.Create(xoaRows);
try
Geometry.AddSpan(2, 4, 1, False, False);
Geometry.AddSpan(5, 5, 0, False, False);
if Geometry.TryGetNode(5, Node) then
UseOutlineNode(Node.FirstDetailIndex,
Node.LastDetailIndex, Node.Collapsed);
if Geometry.TryBuildNodeCollapsePlan(5, True,
xocPreserve, Plan) then
ApplyOutlineChanges(Plan);
finally
Plan.Free;
Geometry.Free;
end;
مثال بلغة C++Builder
Lxoutline::TXLSOutlineGeometry *geometry =
new Lxoutline::TXLSOutlineGeometry(Lxoutline::xoaColumns, false);
try {
geometry->AddSpan(3, 3, 0, false, true);
geometry->AddSpan(4, 7, 1, true, false);
Lxoutline::TXLSOutlineNode node;
if (geometry->TryGetNode(3, node))
UseOutlineNode(node.FirstDetailIndex, node.LastDetailIndex,
node.Collapsed);
}
__finally {
delete geometry;
}
الأداء والنطاق
يستخدم بحث العقدة بحثًا ثنائيًا يتبعه فقط الامتدادات المجسدة المتجاورة التي يعبرها المجموع المختار، بما يعطي جهدًا قدره O(log n + k) من أجل n امتدادًا وk امتدادًا مزارًا
يكتشف تخطيط التعديل الجماعي كل عقدة مجسدة بجولة أحادية على مكدس رتيب، ويدمج فواصل الرؤية المطوية، ويصدر تغييرات نطاقات مضغوطة دون زيارة الإحداثيات غير المستخدمة
يقبل المنشئ آخر صف بورقة عمل XLSX مع الاحتفاظ بالامتدادات المقدمة فقط، لذا فإن الإحداثية العالية لا تعني تخصيص مليون مدخل أو مسحها
تجري بوابة الانحدار لمهايئ ورقة العمل استعلامات العقد البالغ عددها 32,768 نفسها وعمليات الطي أو التوسيع البالغ عددها 2,048 نفسها على ستة امتدادات صفوف مجسدة قرب الصف 8 والصف 1,048,576، وتتطلب عدم تجسيد أي خلية، وتحصر كلفة الإحداثية العالية مقارنة بخط الأساس ذي الإحداثية المنخفضة
لا تكتب TXLSOutlineGeometry بيانات المصنف مباشرة أبدًا؛ فمهايئات المحرك تتحقق من الخطة المعادة وتطبقها، مما يبقي تحليل الهندسة وتعديل الحالة منفصلين
انظر أيضًا