Rozhraní trvalosti
Objekty, které mají trvalý stav jakéhokoli druhu, musí implementovat alespoň jedno rozhraní IPersist* a nejlépe více rozhraní, aby bylo možné kontejneru poskytnout nejflexibilnější volbu, jak chce uložit stav ovládacího prvku.
Pokud má ovládací prvek jakýkoli trvalý stav, musí jako minimum implementovat buď IPersistStream nebo IPersistStreamInit (oba se vzájemně vylučují a neměly by být implementovány společně pro většinu). Tato možnost se používá, když ovládací prvek chce vědět, kdy je vytvořen nový, a ne znovu načíst z existujícího trvalého stavu (IPersistStream nemá vytvořenou novou schopnost). Existence obou rozhraní označuje, že ovládací prvek může uložit a načíst jeho trvalý stav do datového proudu, tj. instance IStream.
Kromě těchto dvou rozhraní založených na datových proudech lze rozhraní IPersist* uvedená v následující tabulce volitelně poskytnout, aby podporovala trvalost na jiných místech než rozšiřitelný IStream.
Sada kategorií součástí je identifikována tak, aby pokrývala podporu rozhraní pro trvalost, viz Kategorie komponent.
Rozhraní | Zvyk |
---|---|
IPersistMemory |
Objekt může uložit a načíst svůj stav do sekvenčního bajtového pole s pevnou délkou (v paměti). |
IPersistStorage |
Objekt může uložit a načíst svůj stav do instance IStorage. Ovládací prvky, které mají být označeny jako vložitelné jako jiné složené objekty dokumentu (pro vložení do kontejnerů s podporou ovládacích prvků), musí podporovat toto rozhraní. |
IPersistPropertyBag |
Objekt může uložit a načíst svůj stav jako jednotlivé vlastnosti zapsané do IPropertyBag, který kontejner implementuje. Používá se pro funkci Uložit jako text v některých kontejnerech. |
IPersistMoniker |
Objekt může uložit a načíst svůj stav do umístění pojmenovaného monikerem. Ovládací prvek volá IMoniker::BindToStorage k načtení rozhraní úložiště, které vyžaduje, například IStorage, IStream, ILockBytes, IDataObjectatd. |
I když je podpora IPersistPropertyBag volitelná, důrazně se doporučuje jako optimalizace pro kontejnery s funkcemi Uložit jako text, jako je Visual Basic.
S výjimkou IPersistStream::GetSizeMax, IPersistStreamInit::GetSizeMaxa IPersistMemory::GetSizeMax, všechny metody každého rozhraní musí být plně implementovány.