Compound-File-Speicher
lxCompoundFile liest und schreibt Compound File Binary-Container über Pascal-Streams, einschließlich verschachtelter Storage-Scopes, MiniFAT-Payloads und verketteter DIFAT-Sektoren; die nativen Classic-BIFF8-Arbeitsmappen-APIs nutzen dieses Backend unter Linux und macOS
Verwenden Sie für Tabellenkalkulationsarbeit die gewöhnlichen Open- und SaveAs-Aufrufe der Arbeitsmappe; die nachfolgenden APIs auf niedrigerer Ebene sind nützlich, um verschachtelte Streams zu inspizieren, Container zu bauen und Storage-Metadaten zu erhalten
Container lesen oder bauen
TlxCompoundFile.LoadFromStream(AStream, AOwnsStream) lädt Verzeichnis- und Allokationsmetadaten; AOwnsStream steht standardmäßig auf False, und der zugrunde liegende Stream muss während der Extraktion seiner Inhalte verfügbar bleiben
CreateNew(AStream, AOwnsStream) bereitet einen neuen Container vor, AddStorage und AddStream stellen Inhalte in die Warteschlange, und Save schreibt einen Container der Version 3 mit allen benötigten DIFAT-Erweiterungssektoren
| Member | Verhalten |
|---|---|
RootIndex | Die Identität des Wurzelverzeichniseintrags, dient als Elternknoten für Storage und Streams der obersten Ebene |
AddStorage(Name, ParentIndex) | Stellt einen verschachtelten Storage in die Warteschlange und liefert seine Verzeichnisidentität zum Hinzufügen von Kindern |
AddStream(Name, Data) | Stellt einen Byte-Stream auf Root-Ebene in die Warteschlange |
AddStream(Name, Data, ParentIndex) | Stellt einen Byte-Stream im gewählten Eltern-Scope in die Warteschlange und liefert seine Identität |
OpenStream(Name), OpenStream(Name, ParentIndex) | Extrahiert einen Root- oder Scoped-Stream in einen eigenen TlxCfbStream; ein fehlender Stream liefert nil |
OpenEntryStream(Index) | Extrahiert einen Verzeichnis-Stream per Identität; ein ungültiger oder Nicht-Stream-Eintrag liefert nil |
HasStream(Name), HasStream(Name, ParentIndex) | Prüft das Vorhandensein eines Streams im Root- oder im gewählten Eltern-Scope |
FindStorage(Name, ParentIndex) | Liefert eine Storage-Identität im gewählten Elternknoten oder -1, wenn kein passender Storage existiert |
EntryCount, Entries(Index) | Dient der Inspektion geladener Verzeichniseinträge; Indizes sind nullbasiert und müssen gültig sein |
SetEntryMetadata(Index, Entry) | Kopiert nur Class-ID, State-Bits und Zeitstempel in einen gültigen Eintrag in der Warteschlange oder in den Root; strukturelle Identitäten und Payloads bleiben unverändert |
Der TlxCfbEntry-Record legt Name, EntryType, StartSector, Size, LeftSibling, RightSibling, Child und den abgeleiteten ParentIndex offen; Verzeichnislinks sind Indizes, und -1 kennzeichnet eine fehlende Identität
Seine Metadatenfelder sind ClassID, StateBits, CreationTime und ModificationTime; Zeitstempel behalten rohe FILETIME-Ticks ab der 1601-UTC-Epoche, statt ein gebietsabhängig formatiertes Datum zu liefern
TlxCfbEntryType umfasst cfbEmpty, cfbStorage, cfbStream und cfbRoot; TlxCfbStream legt Name, Size, Data, Read, Seek und CopyTo offen
Extrahierte Streams besitzen abgekoppelte Bytes und müssen vom Aufrufer freigegeben werden; Korruption, unvollständige Ketten, ungültiger Besitz und zyklische Verzeichnis- oder Allokationsgraphen weisen zurück, statt abgeschnittene Payloads zu liefern
lxCfbCompareNames(A, B) wendet die Compound-File-Binary-Sortierung mit Länge zuerst und festgelegter einfacher BMP-Uppercase-Zuordnung an; doppelte Namen sind auf ihren Elternknoten beschränkt, und identische Namen in getrennten verschachtelten Storages bleiben unterscheidbar
Native Storage-Interfaces
Auf Nicht-Windows-Zielen liefert lxOLE die Storage-Interface-Implementierung, die das Laden und Speichern von Classic-Arbeitsmappen benötigt; ihre IStorage-, IStream- und IEnumStatStg-Schnittstellen behalten expliziten Interface-Besitz und abgekoppelten nativen Containerzustand
| Factory oder Helper | Kontrakt |
|---|---|
XlsOpenCompoundStorage(Source, Storage) | Lädt einen nur lesenden Container ab Stream-Offset null |
XlsOpenCompoundStorage(Source, Start, Storage) | Lädt den Container ab dem expliziten nichtnegativen Offset |
XlsCreateCompoundStorage(Storage) | Erstellt schreibbaren nativen Storage mit verschachtelten Scopes und Streams |
XlsWriteCompoundStorage(Storage, Destination) | Serialisiert den nativen Root-Storage in den gelieferten Stream; fremde Implementierungen und Nicht-Root-Storage weisen zurück |
XlsFreeCompoundStorageName(Name) | Gibt native Namen frei, die Storage-Statistiken oder Enumerationen geliefert haben; nil wird akzeptiert |
Die Factories liefern HResult; prüfen Sie Succeeded(Result), bevor Sie das zurückgegebene Interface verwenden, und geben Sie Interface-Referenzen frei, wenn Sie fertig sind
Veränderung im Nur-Lese-Modus schlägt fehl, geklonte Stream-Cursor behalten unabhängige Positionen, und verschachtelte Kopien erhalten Elternidentität und unterstützte Metadaten; die direkte Serialisierung liefert nicht den Kontrakt der höherwertigen Arbeitsmappen-Zieltransaktion
Kanonische Arbeitsmappen-Identifikatoren
XlsIdentifierKeyText(const A: WideString): WideString in lxStandard liefert die UTF-16-Textrepräsentation des bestehenden festgelegten Unicode-Identifikatorschlüssels, sodass der Classic-Speicher definierter Namen kanonische Gleichheit mit anderen Arbeitsmappen-Engines teilen kann
Diese Schlüsselrepräsentation dient der Identität und dem Lookup, nicht der angezeigten Schreibweise; verfasste Namen bleiben unverändert, und der CFB-Verzeichnis-Komparator behält seine separate, vom Format vorgeschriebene Sortierung
Siehe Free-Pascal-Unterstützung für native Build-Anforderungen und den verifizierten BIFF8-Arbeitsmappenkontrakt sowie Classic-Verschlüsselung für unterstütztes Verschlüsselungs- und Klartext-Property-Stream-Verhalten