API voor werkbladvensterdeelselectie
TXLSWorksheet en TXLSXWorksheet bieden dezelfde vensterdeelbewuste methoden om geselecteerde cel- en bereikgebieden te lezen of te vervangen
Gedeelde typen en methoden
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;
Gebiedstekst gebruikt A1-cel- of bereikverwijzingen, en ActiveAreaIndex is een zero-based index in de teruggegeven of aangeleverde gebiedsreeks
De gebiedsreeks behoudt de bronvolgorde en mag overlappende bereiken bevatten, omdat selectievolgorde en overlap deel uitmaken van de weergavestatus van het werkblad
Eigendom van de momentopname
GetSelectedAreas geeft een nieuwe dynamische array terug waarvan de tekenreeksen en de lengte aan de aanroeper toebehoren, zodat het wijzigen of vrijgeven van het resultaat het werkblad niet kan veranderen
Wanneer het gevraagde vensterdeel geen weergegeven selectiegroep heeft, is het resultaat leeg en is ActiveAreaIndex gelijk aan -1
Het lezen van een ontbrekend vensterdeel maakt nooit een vensterdeel, selectieobject, cel of bereik in de werkmap aan
Recordaggregatie in klassieke XLS
Klassieke XLS houdt voor elk vensterdeel een onafhankelijke logische selectiegroep bij en aggregeert opeenvolgende BIFF-Selection-records met dezelfde vensterdeelcode in bronvolgorde
De actieve rij, actieve kolom en ActiveAreaIndex worden gedeeld door elk record in één groep, en de index adresseert de volledige geaggregeerde gebiedsreeks in plaats van één fysiek record
Het opslaan van een onaangeroerde groep behoudt de oorspronkelijke recordhoofdteksten, terwijl een bewerkte groep wordt weggeschreven in opeenvolgende blokken van ten hoogste 1369 gebieden met dezelfde geaggregeerde actieve index in elk blok
Het bewerken van het ene vensterdeel laat de groepen van de andere vensterdelen ongewijzigd, en kopieën van de werkmap behouden de volledige vensterdeelselectiestatus
Structurele bewerkingen
Toevoegingen of verwijderingen van hele rijen of hele kolommen wijzen de geordende selectiegroepen opnieuw toe voor elk weergegeven vensterdeel in beide werkmapengines
Blijvende gebieden behouden hun volgorde en de identiteit van het actieve gebied; als het actieve gebied wordt verwijderd, wordt de eerstvolgende blijvende opvolger geselecteerd, gevolgd door de laatste blijvende voorganger wanneer er geen opvolger resteert
Als elk gebied wordt verwijderd, wordt de groep één cel op de verwijderingsgrens, terwijl een actieve cel buiten het gekozen blijvende gebied terugvalt op de cel linkboven in dat gebied
Ongeldige klassieke records
Misvormde, niet-aaneengesloten of tegenstrijdige klassieke Selection-records blijven ondoorzichtig en worden niet blootgesteld via de getypeerde gebiedsquery
Een fysiek record dat tijdens recordvalidatie wordt afgewezen meldt xlsDiagnosticSelectionRecordInvalid met diagnostische code 1304, terwijl een alleen de aggregatie betreffende tegenstrijdigheid één groepsdiagnostiek meldt aan het EOF van het werkblad; opslaan speelt elke oorspronkelijke recordhoofdtekst byte voor byte opnieuw af
Grote selecties
Het parseren en normaliseren van gebieden, structurele hertoewijzing en het opbouwen van momentopnames gebruiken eenmalige doorlooptechnieken of geometrische capaciteitsgroei, zodat grote selectiegroepen geamortiseerd lineair blijven
Vensterdeel-scrollcoördinaten
TryGetWindowScroll geeft de eerste zichtbare cel van één logisch vensterdeel terug en ScrollWindow wijzigt die, met 1-gebaseerde werkbladrij- en kolomcoördinaten in beide engines
Bovenste vensterdelen delen de rij van het totale venster, onderste vensterdelen delen de rij van het onderste vensterdeel, linker vensterdelen delen de kolom van het totale venster en rechter vensterdelen delen de kolom van het rechter vensterdeel
Een ontbrekend vensterdeel geeft False terug zonder weergavestatus aan te maken, waarbij de query-uitvoer op nul wordt gezet; ongeldige coördinaten geven ook False terug voordat een as wordt gewijzigd
Klassieke XLS bewaart de bovenste en linker assen in Window2 en de onderste en rechter assen in Pane, terwijl XLSX de overeenkomstige sheetView- en pane-topLeftCell-waarden onafhankelijk behoudt
Atomieke updates
SelectAreas valideert elke A1-verwijzing en de actieve index voordat de schrijftransactie van het werkblad wordt verkregen
De methode geeft False terug voor misvormde of lege invoer, een ongeldige actieve index of een vensterdeel dat niet bestaat in de huidige splitsings- of blokkeergeometrie, waarbij de vorige selectie ongewijzigd blijft
Een geslaagde aanroep geeft True terug en behoudt de bestaande enginespecifieke selectieobjecten en verouderde API's
Delphi-voorbeeld
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);
Compatibiliteit
De klassieke overload SelectAreas(const Areas; ActiveAreaIndex) en de XLSX-overload SelectAreas(const Areas; ActiveAreaIndex; APane) blijven ongewijzigd beschikbaar
De klassieke eigenschappen ScrollRow en ScrollColumn en de zero-based XLSX-leden SetPaneScroll, GetPaneScroll, ScrollRow en ScrollCol blijven eveneens ongewijzigd beschikbaar
De gedeelde façade converteert logische vensterdeelnamen expliciet, zodat aanroepers niet afhankelijk zijn van de numerieke vensterdeelcodes die een van beide bestandsformaten gebruikt