Re[4]: ActiveX, запись настроек
От: Аноним  
Дата: 24.04.12 13:48
Оценка:
Здравствуйте, Vi2, Вы писали:

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


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

GX>>Как мне сохранять и считывать все свойства моей кнопки?

Vi2>Что сохранишь, то и поимеешь. Каждый IPersistXXXX имеет свою собственную семантику, и какой из них лучше — хз. Иногда определяется контейнером: именно контейнер определяет тип хранилища. Иногда он сам упаковывает один тип хранилища в другое, чтобы не насиловать сам контрол.


Vi2>IPersistXXXX.Load загружает из хранилища XXXX данные. Если ты оттуда читать не будешь, значит, свойства контрола будут такими, как при создании контрола. IPersistXXXX.Save сохраняет в хранилище XXXX данные. Если ты туда писать не будешь, значит, и оттуда нечего читать будет.


Vi2>IPersistStream::Load(IStream *pStm), следовательно, твой контрол должен читать из pStm его методами свои данные, т.е. используя IStream::Read(void *pv, ULONG cb, ULONG *pcbRead). Что-то наподобие:

Vi2>
Vi2>hr = pStm->Read(&coordX, sizeof(coordX), NULL);
Vi2>hr = pStm->Read(&coordY, sizeof(coordY), NULL);
Vi2>

Vi2>IPersistPropertyBag::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog), следовательно, твой контрол должен читать из pPropBag его методами свои свои данные, т.е. используя IPropertyBag::Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog). Что-то наподобие:
Vi2>
Vi2>hr = pPropBag->Read(L"coordX", &v, NULL); coordX присвоить из v;
Vi2>hr = pPropBag->Read(L"coordY", &v, NULL); coordY присвоить из v;
Vi2>




При чтении вылетает исключение. Что я сделал не так?


type
  PBtnProps = ^TBtnProps;
  TBtnProps = record
    Caption: string;
  end;

var
  BtnProps: PBtnProps;

function TButtonX.IPersistStreamInit_Load(const stm: ActiveX.IStream): HResult; stdcall;
var
 BytesRead: Longint;
begin
  New(BtnProps);
  try
    stm.Read(BtnProps, SizeOf(TBtnProps), @BytesRead);
    if BytesRead > 0 then
    begin
      ShowMessage('Load=' + BtnProps.Caption);
    end;
  finally
    Dispose(BtnProps)
  end;
  result := S_OK;
end;

function TButtonX.IPersistStreamInit_Save(const stm: ActiveX.IStream; fClearDirty: BOOL): HResult; stdcall;
var
  BytesWrite: Longint;
begin
  ShowMessage('Save=' + FDelphiControl.Caption);
  New(BtnProps);
  try
    BtnProps^.Caption := FDelphiControl.Caption;
    stm.Write(BtnProps, SizeOf(TBtnProps), @BytesWrite);
    if BytesWrite > 0 then
    begin
      ShowMessage('Save=' + IntToStr(BytesWrite));
    end;
  finally
    Dispose(BtnProps)
  end;
  result := S_OK;
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.