Az lxOutline egység enginsemleges geometriát és mutációtervezést biztosít sor- és oszlopvázlatokhoz
Csak a materializált szakaszokat tárolja, a szomszédos vázlatszint-átmenetekből felismeri az összegző csomópontokat, és tömörített állapotváltozásokat hoz létre az összegzés-utáni és összegzés-előti elrendezésekhez anélkül, hogy minden munkalapkoordinátához bejegyzést foglalna
Alaptípusok
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;
A sor- és oszlopindexek 1-alapúak, a vázlatszintek nem negatívak, és a szakaszokat szigorúan növekvő, nem átfedő sorrendben kell hozzáadni
Az azonos szintű, rejtett és összecsukott állapotú szomszédos szakaszok automatikusan egyesülnek; a kihagyott indexek implicit nullaszintűek, látható állapotúak és nincs összecsukás-jelölőjük
Mindkét osztály megjegyzi a konstrukcióból származó Axis értékét, a Clear kiüríti a tervet vagy geometriát az újrahasznosításhoz a belső pufferek újrafoglalása nélkül, a SpanCount pedig jelenti, hány egyesített szakaszt tart a geometria jelenleg
Csomópont-szemantika
| NodeIndex | A hívó által lekérdezett fizikai összegző sor vagy oszlop |
| FirstDetailIndex / LastDetailIndex | Az összefüggő részletartomány, amelynek szintje mélyebb, mint az összegző elemé |
| SummaryLevel | Az összegző elemen tárolt vázlatszint, vagy nulla, ha az elem nincs materializálva |
| Level | A csomópont által reprezentált csoportszint, egyenlő SummaryLevel + 1 értékkel |
| SummaryHidden | Az összegző elemen tárolt rejtett állapot |
| Collapsed | Az összegző elemen tárolt explicit összecsukás-jelölő |
| SummaryAfter | True, ha a részletek megelőzik az összegző elemet, false, ha követik azt |
A beágyazott csoportok függetlenek maradnak, mert minden lekérdezés megáll az első olyan szomszédos szakasznál, amelynek szintje nem mélyebb, mint a kiválasztott összegző elemé
Egy hézag is lezárja a részletartományt, így a ritka metaadatok nem hidalhatják át véletlenül a nem használt koordinátákat egyetlen csoporttá
Mutációtervek
A mutációterv rendezett, 1-alapú tartományokat és olyan mezőmaszkot tartalmaz, amely jelzi, hogy az egyes tartományok a rejtett állapotot, az összecsukott állapotot vagy mindkettőt változtatják-e meg; a szomszédos egyenértékű változások automatikusan egyesülnek
| xocPreserve | A kiválasztott csomópontot változtatja meg az utódok összecsukás-jelölőinek megtartásával, ami a beágyazott csoportok alapértelmezett viselkedése |
| xocCollapse | Összecsukottnak jelöli az utódcsomópontokat, ha azok a kiválasztott csomóponton belül vannak, vagy a kért megjelenítési szint alatt rejtve vannak |
| xocExpand | Törli az utódok összecsukás-jelölőit, ha azok a kiválasztott csomóponton belül vannak, vagy a kért megjelenítési szint alatt rejtve vannak |
Egy szülő kibontása xocPreserve esetén felfedi a közvetlen részleteket, miközben az összecsukott gyerekekhez tartozó részletek rejtve maradnak; egy összecsukott ősön belüli gyerek kibontása nem fed fel tartalmat ezen az ősn keresztül
A megjelenítési szintek 1-alapúak: az 1-es szint minden legfelső szintű csoportot összecsuk, és minden magasabb érték egy további vázlatszintet fed fel, miközben beállítja a megfelelő határcsomópont-jelölőket
Ugyanazon kért állapot felépítése olyan geometriából, amely már tartalmazza azt, üres tervet eredményez, és egy nem csomópont lekérdezése false értéket ad üres tervvel
A csomópontműveletek változatlanul hagyják a kiválasztott összegző elem független rejtett állapotát, és a megjelenítési szintű tervek nem fednek fel olyan nullaszintű elemeket, amelyeket egy vázlatcsoporton kívül rejtettek el
Munkalap-adapterek
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);
A TXLSWorksheet és a TXLSXWorksheet ugyanazt a három metódust fedi fel, így a hívók 1-alapú sor- vagy oszlop-összegző csomópontot kérdezhetnek le vagy módosíthatnak geometria kézi felépítése nélkül
A klasszikus adapter csak a lefoglalt sorblokkokat és a hozzárendelt oszlop-metaadatokat olvassa, míg az XLSX adapter az egyetlen tömörített mutációterv egyetlen írási tranzakcióban történő alkalmazása előtt egyesíti a ritka vázlatszint-, rejtett és összecsukott listáit
Az OpenDocument sor- és oszlopcsoportok megőrzik natív, beágyazott table:display állapotukat; a közvetlen metaadat-szerkesztések és a strukturális sor- vagy oszlopváltozások biztonságosan vetítik ezt az állapotot a logikai összegző csomópontra, az XLSX-re konverzió pedig az összecsukás-jelölőt az XLSX összegző elemére írja, nem pedig minden csoporttagra
A meglévő TXLSXWorksheet.ToggleRowGrouped és ToggleColGrouped metódusok kompatibilitási burkolókként továbbra is elérhetők; argumentumuk az első részletsor vagy -oszlop, a burkoló pedig az irányérzékeny összegző csomópontot oldja fel, mielőtt átváltaná azt
Delphi-példa
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-példa
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;
}
Teljesítmény és hatókör
A csomópontkeresés bináris keresést használ, amelyet csak a kiválasztott csoport által átszelt szomszédos materializált szakaszok követnek, ami O(log n + k) munkát ad n szakaszra és k meglátogatott szakaszra
A tömeges mutációtervezés lineáris, monoton veremes menettel tárja fel az összes materializált csomópontot, egyesíti az összecsukott láthatósági intervallumokat, és tömörített tartományváltozásokat bocsát ki a nem használt koordináták meglátogatása nélkül
Az építő elfogadja az utolsó XLSX munkalapsort, miközben csak a megadott szakaszokat tartja meg, így egy magas koordináta nem jelent milliónyi bejegyzés foglalását vagy átvizsgálását
A munkalap-adapter regressziós kapuja ugyanazt a 32,768 csomópontlekérdezést és 2,048 összecsukási vagy kibontási mutációt futtatja le a 8. sor és az 1,048,576. sor közelében lévő hat materializált sorbejegyzésen, nulla cellamaterializálást igényel, és a magas koordinátájú költséget az alacsony koordinátájú kiindulási értékhez viszonyítva korlátozza
A TXLSOutlineGeometry soha nem ír közvetlenül munkafüzetadatokat; az enginadapterek validálják és alkalmazzák a visszaadott tervet, így a geometriaelemzés és az állapotmutáció külön marad
Lásd még