Enheden lxOutline leverer motornøutral geometri og mutationsplanlægning for række- og kolonnedispositioner
Den gemmer kun materialiserede intervaller, genkender oversigtsknuder ud fra tilstødende dispositionsniveauovergange og skaber komprimerede tilstandsændringer til layout med oversigt-efter og oversigt-før uden at allokere en post for hver regnearkskoordinat
Kernetyper
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;
Række- og kolonneindeks er 1-baserede, dispositionsniveauer er ikke-negative, og intervaller skal tilføjes i strengt stigende, ikke-overlappende rækkefølge
Tilstødende intervaller med identisk niveau, skjult tilstand og sammenfoldet tilstand flettes automatisk; udeladte indeks har implicit niveau nul, synlig tilstand og intet sammenfoldelsesmærke
Begge klasser husker deres Axis fra konstruktionen, Clear tømmer en plan eller geometri til genbrug uden at reallokere de interne buffere, og SpanCount rapporterer, hvor mange flettede intervaller geometrien i øjeblikket indeholder
Knudesemantik
| NodeIndex | Den fysiske oversigtsrække eller -kolonne, som kalderen forespørger |
| FirstDetailIndex / LastDetailIndex | Det sammenhængende detaljeområde, hvis niveau er dybere end oversigtselementet |
| SummaryLevel | Det dispositionsniveau, der er gemt på oversigtselementet, eller nul, når det element ikke er materialiseret |
| Level | Det gruppeniveau, som knuden repræsenterer, lig med SummaryLevel + 1 |
| SummaryHidden | Den skjulte tilstand, der er gemt på oversigtselementet |
| Collapsed | Det eksplicitte sammenfoldelsesmærke, der er gemt på oversigtselementet |
| SummaryAfter | True, når detaljer går forud for oversigtselementet, false når detaljer følger det |
Indlejrede grupper forbliver uafhængige, fordi hver forespørgsel standser ved det første tilstødende interval, hvis niveau ikke er dybere end det valgte oversigtselement
Et hul afslutter også detaljeområdet, så sparsomme metadata ikke ved et uheld kan bygge bro over uanvendte koordinater til én gruppe
Mutationsplaner
En mutationsplan indeholder ordnede 1-baserede områder og en feltmaske, der angiver, om hvert område ændrer skjult tilstand, sammenfoldet tilstand eller begge; tilstødende ækvivalente ændringer flettes automatisk
| xocPreserve | Ændrer den valgte knude, mens underordnedes sammenfoldelsesmærker bevares, hvilket er standardadfærden for indlejrede grupper |
| xocCollapse | Markerer underordnede knuder sammenfoldet, når de er inden for den valgte knude eller skjult under det ønskede visningsniveau |
| xocExpand | Rydder underordnede knuders sammenfoldelsesmærker, når de er inden for den valgte knude eller skjult under det ønskede visningsniveau |
Udvidelse af en overordnet med xocPreserve afslører umiddelbare detaljer, mens detaljer, der tilhører sammenfoldede underordnede, forbliver skjulte; udvidelse af et underordnet inde i en sammenfoldet forfader eksponerer ikke indhold gennem den forfader
Visningsniveauer er 1-baserede: niveau 1 folder hver gruppe på øverste niveau sammen, og hver højere værdi afslører ét yderligere dispositionsniveau, samtidig med at de matchende grænseknude-mærker sættes
Opbygning af den samme ønskede tilstand ud fra geometri, der allerede indeholder den, giver en tom plan, og forespørgsel af en ikke-knude returnerer false med en tom plan
Knudeoperationer efterlader det valgte oversigtselements uafhængige skjulte tilstand uændret, og planer for visningsniveauer gør ikke niveau-nul-elementer synlige, der blev skjult uden for en dispositionsgruppe
Regnearksadaptere
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 og TXLSXWorksheet eksponerer de samme tre metoder, så kalderen kan forespørge eller ændre en 1-baseret række- eller kolonneoversigtsknude uden at bygge geometrien manuelt
Den klassiske adapter læser kun allokerede rækkeblokke og tildelte kolonnemetadata, mens XLSX-adapteren fletter sine sparsomme lister over dispositionsniveau, skjult tilstand og sammenfoldning, inden én komprimeret mutationsplan anvendes i en enkelt skrivetransaktion
OpenDocument række- og kolonnegrupper bevarer deres oprindelige indlejrede table:display-tilstand; direkte metadataredigeringer og strukturelle række- eller kolonneændringer projicerer sikkert den tilstand til den logiske oversigtsknude, og konvertering til XLSX skriver sammenfoldelsesmærket på XLSX-oversigtselementet frem for på hvert gruppemedlem
De eksisterende TXLSXWorksheet.ToggleRowGrouped- og ToggleColGrouped-metoder forbliver tilgængelige som kompatibilitetswrappere; deres argument er den første detaljerække eller -kolonne, og wrapperen opløser den retningsbevidste oversigtsknude, før den skiftes
Delphi-eksempel
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-eksempel
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;
}
Ydelse og omfang
Knudeopslag bruger binær søgning efterfulgt kun af de tilstødende materialiserede intervaller, som den valgte gruppe krydser, hvilket giver O(log n + k) arbejde for n intervaller og k besøgte intervaller
Planlægning af bulk-mutationer opdager hver materialiseret knude med et lineært gennemløb med en monoton stak, fletter sammenfoldede synlighedsintervaller og udsender komprimerede områdeændringer uden at besøge uanvendte koordinater
Byggeren accepterer den sidste XLSX-regnearksrække, mens den kun fastholder de angivne intervaller, så en høj koordinat ikke indebærer en allokering eller scanning af en million poster
Regnearksadapterens regressionsgate udfører de samme 32.768 knudeforespørgsler og 2.048 sammenfold- eller udvid-mutationer over seks materialiserede rækkeposter nær række 8 og række 1.048.576, kræver nul cellematerialisering og afgrænser omkostningen ved høj koordinat mod basislinjen med lav koordinat
TXLSOutlineGeometry skriver aldrig projektmappedata direkte; motoradaptere validerer og anvender den returnerede plan, så geometrianalyse og tilstandsmutation forbliver adskilt
Se også