De unit lxOutline biedt engineneutrale geometrie en mutatieplanning voor rij- en kolomoutlines
Ze slaat alleen gematerialiseerde segmenten op, herkent samenvattingsknooppunten aan aangrenzende overgangen van het outlineniveau en maakt gecomprimeerde statuswijzigingen aan voor samenvatting-na- en samenvatting-voor-lay-outs, zonder voor elke werkbladcoördinaat een item toe te wijzen
Kerntypes
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;
Rij- en kolomindices hebben basis 1, outlineniveaus zijn niet-negatief, en segmenten moeten in streng oplopende, niet-overlappende volgorde worden toegevoegd
Aangrenzende segmenten met identieke level-, hidden- en collapsed-status worden automatisch samengevoegd; weggelaten indices hebben impliciet niveau nul, zichtbare status en geen samenvouwmarkering
Beide klassen onthouden hun Axis vanaf de constructie, Clear maakt een plan of geometrie leeg voor hergebruik zonder de interne buffers opnieuw toe te wijzen, en SpanCount meldt hoeveel samengevoegde segmenten de geometrie momenteel bevat
Knooppuntsemantiek
| NodeIndex | De fysieke samenvattingsrij of -kolom die de aanroeper raadpleegt |
| FirstDetailIndex / LastDetailIndex | Het aaneengesloten detailbereik waarvan het niveau dieper is dan het samenvattingsitem |
| SummaryLevel | Het outlineniveau dat op het samenvattingsitem is opgeslagen, of nul wanneer dat item niet is gematerialiseerd |
| Level | Het groepsniveau dat het knooppunt vertegenwoordigt, gelijk aan SummaryLevel + 1 |
| SummaryHidden | De hidden-status die op het samenvattingsitem is opgeslagen |
| Collapsed | De expliciete samenvouwmarkering die op het samenvattingsitem is opgeslagen |
| SummaryAfter | True wanneer de details vóór het samenvattingsitem liggen, false wanneer ze erop volgen |
Geneste groepen blijven onafhankelijk omdat elke query stopt bij het eerste aangrenzende segment waarvan het niveau niet dieper is dan het gekozen samenvattingsitem
Een tussenruimte beëindigt ook het detailbereik, zodat sparse metadata ongebruikte coördinaten niet per ongeluk in één groep kan overbruggen
Mutatieplannen
Een mutatieplan bevat geordende bereiken met basis 1 en een veldmasker dat aangeeft of elk bereik de hidden-status, de collapsed-status of beide wijzigt; aangrenzende gelijkwaardige wijzigingen worden automatisch samengevoegd
| xocPreserve | Wijzigt het gekozen knooppunt en behoudt daarbij de samenvouwmarkeringen van afstammelingen, wat het standaardgedrag voor geneste groepen is |
| xocCollapse | Markeert afstammingsknooppunten als samengevouwen wanneer ze binnen het gekozen knooppunt liggen of verborgen zijn onder het gevraagde weergaveniveau |
| xocExpand | Wist de samenvouwmarkeringen van afstammingsknooppunten wanneer ze binnen het gekozen knooppunt liggen of verborgen zijn onder het gevraagde weergaveniveau |
Het uitklappen van een bovenliggend item met xocPreserve toont directe details, terwijl details die bij samengevouwen kinderen horen verborgen blijven; het uitklappen van een kind binnen een samengevouwen voorouder legt geen inhoud bloot via die voorouder
Weergaveniveaus hebben basis 1: niveau 1 vouwt elke groep op het hoogste niveau samen, en elke hogere waarde legt één extra outlineniveau bloot terwijl de bijpassende grensknooppuntmarkeringen worden gezet
Het opbouwen van een al aanwezige gevraagde status vanuit de geometrie levert een leeg plan op, en het raadplegen van een niet-knooppunt geeft false terug met een leeg plan
Knooppuntbewerkingen laten de onafhankelijke hidden-status van het gekozen samenvattingsitem onveranderd, en weergaveniveauplannen maken items op niveau nul die buiten een outlinegroep verborgen waren niet weer zichtbaar
Werkbladadapters
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 en TXLSXWorksheet leggen dezelfde drie methoden bloot, zodat aanroepers een samenvattingsknooppunt van een rij of kolom met basis 1 kunnen raadplegen of wijzigen zonder de geometrie handmatig op te bouwen
De klassieke adapter leest alleen toegewezen rijblokken en toegewezen kolommetadata, terwijl de XLSX-adapter zijn sparse lijsten voor outlineniveau, hidden en collapsed samenvoegt voordat hij één gecomprimeerd mutatieplan toepast in een enkele schrijftransactie
OpenDocument-rij- en kolomgroepen behouden hun native geneste table:display-status; directe metadatawijzigingen en structurele rij- of kolomwijzigingen projecteren die status veilig naar het logische samenvattingsknooppunt, en conversie naar XLSX schrijft de samenvouwmarkering op het XLSX-samenvattingsitem in plaats van op elk groepslid
De bestaande methoden TXLSXWorksheet.ToggleRowGrouped en ToggleColGrouped blijven beschikbaar als compatibiliteitswrappers; hun argument is de eerste detailrij of -kolom, en de wrapper lost het richtingsgevoelige samenvattingsknooppunt op voordat hij het omschakelt
Delphi-voorbeeld
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-voorbeeld
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;
}
Prestaties en reikwijdte
Knooppuntopzoeking gebruikt een binaire zoekactie gevolgd door alleen de aangrenzende gematerialiseerde segmenten die de gekozen groep kruist, en levert daarmee O(log n + k) werk voor n segmenten en k bezochte segmenten
Bulkmutatieplanning vindt elk gematerialiseerd knooppunt met een lineaire ronde over een monotone stapel, voegt samengevouwen zichtbaarheidsintervallen samen en geeft gecomprimeerde bereikwijzigingen door zonder ongebruikte coördinaten te bezoeken
De builder accepteert de laatste XLSX-werkbladrij terwijl hij alleen de geleverde segmenten vasthoudt, zodat een hoge coördinaat geen toewijzing of scan van een miljoen items impliceert
De regressiepoort van de werkbladadapters voert dezelfde 32.768 knooppuntquery's en 2.048 samenvouw- of uitklapmutaties uit over zes gematerialiseerde rijitems nabij rij 8 en rij 1.048.576, vereist nul celmaterialisatie en begrenst de kosten van hoge coördinaten tegen de basislijn van lage coördinaten
TXLSOutlineGeometry schrijft nooit rechtstreeks werkmapgegevens; engineadapters valideren het teruggegeven plan en passen het toe, zodat geometrieanalyse en statusmutatie gescheiden blijven
Zie ook