Re[2]: ActiveX, запись настроек
От: GladiatorX  
Дата: 24.04.12 10:53
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, GladiatorX, Вы писали:


GX>>На Дельфи написана ActiveX-кнопка с дополнительным свойством Command. Я хочу сохранять значение свойства в файле контейнера через IStorage, IStream или др.

GX>>К примеру, контейнером является Excel-документ (файл xls), куда вставляется моя кнопка. Как это реализовать?

Vi2>Нужно реализовать IPersistXXXX интерфейсы, такие как IPersistStorage, IPersistStream (IPersistStreamInit), IPersistPropertyBag etc. Контейнер запросит тот интерфейс, по которому он умеет сохраняться.



Сделал следующее:

TButtonX = class(TActiveXControl, IButtonX, ISpecifyPropertyPages, IPersistStreamInit)
...
// IPersistStreamInit
    function IPersistStreamInit.IsDirty = IPersistStreamInit_IsDirty;
    function IPersistStreamInit_IsDirty: HResult; stdcall;
    function IPersistStreamInit.Load = IPersistStreamInit_Load;
    function IPersistStreamInit_Load(const stm: ActiveX.IStream): HResult; stdcall;
    function IPersistStreamInit.Save = IPersistStreamInit_Save;
    function IPersistStreamInit_Save(const stm: ActiveX.IStream; fClearDirty: BOOL): HResult; stdcall;
    function IPersistStreamInit.GetSizeMax = IPersistStreamInit_GetSizeMax;
    function IPersistStreamInit_GetSizeMax(out cbSize: Largeint): HResult; stdcall;
    function IPersistStreamInit.InitNew = IPersistStreamInit_InitNew;
    function IPersistStreamInit_InitNew: HResult; stdcall;

...

// IPersistStreamInit
function TButtonX.IPersistStreamInit_IsDirty: HResult; stdcall;
begin
  result := S_OK;
end;

function TButtonX.IPersistStreamInit_Load(const stm: ActiveX.IStream): HResult; stdcall;
begin
  result := S_OK;
end;

function TButtonX.IPersistStreamInit_Save(const stm: ActiveX.IStream;
fClearDirty: BOOL): HResult; stdcall;
begin
  result := S_OK;
end;

...


После этого перестали сохраняться и загружаться стандартные свойства кнопки.

Как мне сохранять и считывать все свойства моей кнопки?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.