Здравствуйте, 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;