API de selección en paneles de hoja de cálculo
TXLSWorksheet y TXLSXWorksheet exponen los mismos métodos conscientes de los paneles para leer o reemplazar las áreas seleccionadas de celdas y rangos
Tipos y métodos compartidos
TXLSPanePosition = (xlspTopLeft, xlspTopRight, xlspBottomLeft, xlspBottomRight); TXLSSelectedAreas = array of WideString; function GetSelectedAreas(APane: TXLSPanePosition; out ActiveAreaIndex: Integer): TXLSSelectedAreas; function SelectAreas(APane: TXLSPanePosition; const Areas: array of WideString; ActiveAreaIndex: Integer = 0): Boolean; function TryGetWindowScroll(APane: TXLSPanePosition; out ARow, ACol: Integer): Boolean; function ScrollWindow(APane: TXLSPanePosition; ARow, ACol: Integer): Boolean;
El texto de las áreas usa referencias A1 de celda o de rango, y ActiveAreaIndex es un índice de base cero en la secuencia de áreas devuelta o suministrada
La secuencia de áreas conserva el orden de origen y puede contener rangos superpuestos, porque el orden de selección y la superposición forman parte del estado de vista de la hoja de cálculo
Propiedad de la instantánea
GetSelectedAreas devuelve un arreglo dinámico nuevo cuyas cadenas y cuya longitud pertenecen al llamador, de modo que modificar o liberar el resultado no puede alterar la hoja de cálculo
Cuando el panel solicitado no tiene ningún grupo de selección representado, el resultado está vacío y ActiveAreaIndex es -1
Leer un panel inexistente nunca crea un panel, un objeto de selección, una celda ni un rango en el libro de trabajo
Agregación de registros de XLS clásico
XLS clásico mantiene un grupo de selección lógico independiente para cada panel y agrega los registros Selection de BIFF consecutivos con el mismo código de panel en orden de origen
La fila activa, la columna activa y ActiveAreaIndex son compartidos por todos los registros de un grupo, y el índice direcciona la secuencia agregada completa de áreas en lugar de un único registro físico
Guardar un grupo intacto preserva los cuerpos originales de sus registros, mientras que un grupo editado se escribe en bloques consecutivos de como máximo 1369 áreas con el mismo índice activo agregado en cada bloque
Editar un panel deja sin cambios los grupos de los demás paneles, y las copias del libro de trabajo conservan el estado completo de selección por paneles
Ediciones estructurales
Las inserciones o eliminaciones de filas o columnas completas reasignan los grupos de selección ordenados de cada panel representado en ambos motores del libro de trabajo
Las áreas que sobreviven conservan su orden y la identidad del área activa; si se elimina el área activa, se selecciona el primer sucesor superviviente, seguido del último predecesor superviviente cuando no queda ningún sucesor
Si se eliminan todas las áreas, el grupo pasa a ser una sola celda en el límite de la eliminación, mientras que una celda activa fuera del área superviviente elegida recurre a la celda superior izquierda de esa área
Registros clásicos no válidos
Los registros Selection clásicos malformados, no contiguos o contradictorios permanecen opacos y no se exponen a través de la consulta con tipos de áreas
Un registro físico rechazado durante la validación de registros notifica xlsDiagnosticSelectionRecordInvalid con el código de diagnóstico 1304, mientras que una contradicción relativa solo a la agregación notifica un diagnóstico de grupo al EOF de la hoja de cálculo; al guardar se reproducen byte a byte los cuerpos de todos los registros originales
Selecciones grandes
El análisis y la normalización de áreas, la reasignación estructural y la construcción de instantáneas usan generadores de una sola pasada o crecimiento geométrico de capacidad, de modo que los grupos de selección grandes siguen siendo lineales amortizados
Coordenadas de desplazamiento por panel
TryGetWindowScroll devuelve la primera celda visible de un panel lógico y ScrollWindow la cambia, usando coordenadas de fila y columna de la hoja de cálculo con base uno en ambos motores
Los paneles superiores comparten la fila de la ventana global, los inferiores comparten la fila del panel inferior, los paneles izquierdos comparten la columna de la ventana global y los derechos comparten la columna del panel derecho
Un panel inexistente devuelve False sin crear estado de vista, con los resultados de la consulta establecidos en cero; las coordenadas no válidas también devuelven False antes de cambiar cualquier eje
XLS clásico persiste los ejes superior e izquierdo en Window2 y los ejes inferior y derecho en Pane, mientras que XLSX conserva de forma independiente los valores topLeftCell correspondientes de sheetView y pane
Actualizaciones atómicas
SelectAreas valida cada referencia A1 y el índice activo antes de obtener la transacción de escritura de la hoja de cálculo
El método devuelve False para una entrada malformada o vacía, un índice activo no válido o un panel que no existe en la geometría actual de división o inmovilización, dejando la selección anterior sin cambios
Una llamada correcta devuelve True y preserva los objetos de selección existentes propios del motor y las API heredadas
Ejemplo de Delphi
if Sheet.SelectAreas(xlspBottomRight,
['C4:E5', 'D5:F6', 'G7'], 1) then
begin
Areas := Sheet.GetSelectedAreas(xlspBottomRight,
ActiveAreaIndex);
UseSelection(Areas, ActiveAreaIndex);
end;
if Sheet.ScrollWindow(xlspBottomRight, 20, 8) and
Sheet.TryGetWindowScroll(xlspBottomRight, Row, Col) then
ShowVisibleCell(Row, Col);
Compatibilidad
La sobrecarga clásica SelectAreas(const Areas; ActiveAreaIndex) y la sobrecarga de XLSX SelectAreas(const Areas; ActiveAreaIndex; APane) siguen disponibles sin cambios
Las propiedades clásicas ScrollRow y ScrollColumn y los miembros de XLSX con base cero SetPaneScroll, GetPaneScroll, ScrollRow y ScrollCol también siguen disponibles sin cambios
La fachada compartida convierte explícitamente los nombres lógicos de los paneles, de modo que los llamadores no dependen de los códigos numéricos de panel que use cualquiera de los dos formatos de archivo