A unidade lxOutline fornece geometria neutra de mecanismo e planejamento de mutação para estruturas de tópicos de linhas e colunas
Ela armazena apenas intervalos materializados, reconhece nós de resumo a partir de transições adjacentes de nível de estrutura de tópicos e cria alterações de estado comprimidas para layouts com resumo após e resumo antes, sem alocar uma entrada para cada coordenada da planilha
Tipos principais
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;
Os índices de linhas e colunas têm base um, os níveis de estrutura de tópicos não são negativos e os intervalos devem ser adicionados em ordem estritamente crescente e sem sobreposição
Intervalos adjacentes com estado idêntico de nível, oculto e recolhido são unidos automaticamente; índices omitidos têm nível zero implícito, estado visível e nenhum marcador de recolhimento
Ambas as classes lembram seu Axis da construção, Clear esvazia um plano ou geometria para reutilização sem realocar os buffers internos, e SpanCount informa quantos intervalos unidos a geometria contém atualmente
Semântica de nós
| NodeIndex | A linha ou coluna de resumo física consultada pelo chamador |
| FirstDetailIndex / LastDetailIndex | O intervalo contíguo de detalhes cujo nível é mais profundo que o item de resumo |
| SummaryLevel | O nível de estrutura de tópicos armazenado no item de resumo, ou zero quando esse item não está materializado |
| Level | O nível de grupo representado pelo nó, igual a SummaryLevel + 1 |
| SummaryHidden | O estado oculto armazenado no item de resumo |
| Collapsed | O marcador de recolhimento explícito armazenado no item de resumo |
| SummaryAfter | True quando os detalhes precedem o item de resumo, false quando os detalhes o seguem |
Grupos aninhados permanecem independentes porque cada consulta para no primeiro intervalo adjacente cujo nível não é mais profundo que o item de resumo selecionado
Uma lacuna também encerra o intervalo de detalhes, de modo que metadados esparsos não podem unir acidentalmente coordenadas não utilizadas em um só grupo
Planos de mutação
Um plano de mutação contém intervalos ordenados com base um e uma máscara de campos que indica se cada intervalo altera o estado oculto, o estado recolhido ou ambos; alterações equivalentes adjacentes são unidas automaticamente
| xocPreserve | Altera o nó selecionado mantendo os marcadores de recolhimento dos descendentes, que é o comportamento padrão de grupos aninhados |
| xocCollapse | Marca nós descendentes como recolhidos quando estão dentro do nó selecionado ou ocultos abaixo do nível de exibição solicitado |
| xocExpand | Limpa os marcadores de recolhimento dos descendentes quando estão dentro do nó selecionado ou ocultos abaixo do nível de exibição solicitado |
Expandir um pai com xocPreserve revela os detalhes imediatos, enquanto os detalhes pertencentes a filhos recolhidos permanecem ocultos; expandir um filho dentro de um ancestral recolhido não expõe o conteúdo por meio desse ancestral
Os níveis de exibição têm base um: o nível 1 recolhe todos os grupos de nível superior, e cada valor mais alto revela um nível adicional de estrutura de tópicos, definindo os marcadores correspondentes dos nós de limite
Construir o mesmo estado solicitado a partir de uma geometria que já o contém produz um plano vazio, e consultar um não-nó retorna false com um plano vazio
As operações de nós deixam inalterado o estado oculto independente do item de resumo selecionado, e os planos de nível de exibição não reexibem itens de nível zero que estavam ocultos fora de um grupo de estrutura de tópicos
Adaptadores de planilha
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 e TXLSXWorksheet expõem os mesmos três métodos, de modo que os chamadores podem consultar ou alterar um nó de resumo de linha ou coluna com base um sem construir geometria manualmente
O adaptador clássico lê somente blocos de linhas alocados e metadados de colunas atribuídos, enquanto o adaptador XLSX mescla suas listas esparsas de nível de estrutura de tópicos, oculto e recolhido antes de aplicar um plano de mutação comprimido em uma única transação de gravação
Grupos de linhas e colunas do OpenDocument retêm seu estado table:display aninhado nativo; edições diretas de metadados e alterações estruturais de linhas ou colunas projetam esse estado com segurança para o nó de resumo lógico, e a conversão para XLSX grava o marcador de recolhimento no item de resumo XLSX em vez de em cada membro do grupo
Os métodos TXLSXWorksheet.ToggleRowGrouped e ToggleColGrouped existentes permanecem disponíveis como wrappers de compatibilidade; seu argumento é a primeira linha ou coluna de detalhes, e o wrapper resolve o nó de resumo sensível à direção antes de alterná-lo
Exemplo em 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;
Exemplo em 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;
}
Desempenho e escopo
A pesquisa de nós usa uma busca binária seguida apenas pelos intervalos materializados adjacentes cruzados pelo grupo selecionado, resultando em trabalho O(log n + k) para n intervalos e k intervalos visitados
O planejamento de mutações em massa descobre cada nó materializado com uma passada linear de pilha monotônica, mescla intervalos de visibilidade recolhidos e emite alterações de intervalo comprimidas sem visitar coordenadas não utilizadas
O construtor aceita a última linha da planilha XLSX retendo apenas os intervalos fornecidos, de modo que uma coordenada alta não implica alocação ou varredura de um milhão de entradas
O portão de regressão dos adaptadores de planilha executa as mesmas 32,768 consultas de nós e 2,048 mutações de recolher ou expandir sobre seis entradas de linhas materializadas perto da linha 8 e da linha 1,048,576, exige materialização zero de células e limita o custo de coordenadas altas em relação à linha de base de coordenadas baixas
TXLSOutlineGeometry nunca grava dados da pasta de trabalho diretamente; os adaptadores de mecanismo validam e aplicam o plano retornado, permitindo que a análise de geometria e a mutação de estado permaneçam separadas
Veja também