arthur2 писал(а):значит в классе StdPicture реализован тот интерфейс, которым объявлен p.
arthur2 писал(а):Я думал, что если хоть один метод в IPicture был бы некорректно объявлен, присвоение бы не последовало.
Теперь - непонятно, почему тогда не работает присвоение моему классу (пусть в нем реализован неправильный интерфейс, но ведь иид-то правильное).
Dim c As cMyPic
Set c = Me.Picture
arthur2 писал(а):брр, наоборот: set picture=new cmypic
Как сделать правильно? И как проверить, что всё правильно?
[
odl,
uuid(7BF80980-BF32-101A-8BBB-00AA00300CAB),
helpstring("Picture Object"),
hidden
]
interface IPicture : IUnknown {
[propget]
HRESULT _stdcall Handle([out, retval] OLE_HANDLE* phandle);
[propget]
HRESULT _stdcall hPal([out, retval] OLE_HANDLE* phpal);
[propget]
HRESULT _stdcall Type([out, retval] short* ptype);
[propget]
HRESULT _stdcall Width([out, retval] OLE_XSIZE_HIMETRIC* pwidth);
[propget]
HRESULT _stdcall Height([out, retval] OLE_YSIZE_HIMETRIC* pheight);
HRESULT _stdcall Render(
[in] int hdc,
[in] long x,
[in] long y,
[in] long cx,
[in] long cy,
[in] OLE_XPOS_HIMETRIC xSrc,
[in] OLE_YPOS_HIMETRIC ySrc,
[in] OLE_XSIZE_HIMETRIC cxSrc,
[in] OLE_YSIZE_HIMETRIC cySrc,
[in] void* prcWBounds);
[propput]
HRESULT _stdcall hPal([in] OLE_HANDLE phpal);
[propget]
HRESULT _stdcall CurDC([out, retval] int* phdcOut);
HRESULT _stdcall SelectPicture(
[in] int hdcIn,
[out] int* phdcOut,
[out] OLE_HANDLE* phbmpOut);
[propget]
HRESULT _stdcall KeepOriginalFormat([out, retval] VARIANT_BOOL* pfkeep);
[propput]
HRESULT _stdcall KeepOriginalFormat([in] VARIANT_BOOL pfkeep);
HRESULT _stdcall PictureChanged();
HRESULT _stdcall SaveAsFile(
[in] void* pstm,
[in] VARIANT_BOOL fSaveMemCopy,
[out] long* pcbSize);
[propget]
HRESULT _stdcall Attributes([out, retval] long* pdwAttr);
HRESULT _stdcall SetHdc([in] OLE_HANDLE hdc);
};
Что надо изменить?
arthur2 писал(а):все OLE_ на лонги, VARIANT_BOOL на шорт.
Хакер писал(а):В данном случае, как я сказал, ошибку выбрасывает реализация Set-хендлера. Надо быть даже очень мало соображающим, чтобы понимать, что реализация Set-хендлера не может анализировать твою TLB на предмет правильности. Отсюда делаем вывод, что источником проблем может быть (остаётся только это) реализация методов.
Что "это"? Мешает - то, что я не знаю, не только как сделать "это", но даже и что именно это "это".Хакер писал(а):Что мешает тебе сделать это?
arthur2 писал(а):Что "это"? Мешает - то, что я не знаю, не только как сделать "это", но даже и что именно это "это".
У меня такой стройности в голове относительно программирования, увы, нет. Знания мои в этой области - крайне несистемные, нахватанные.Хакер писал(а):Это какой-то неправильный порочной подход. У меня все события, понятия, мысли, принципы и тому подобное обраует в голове стройное дерево отношений. Нет ничего, что висело бы просто так.
arthur2 писал(а):У меня такой стройности в голове относительно программирования, увы, нет. Знания мои в этой области - крайне несистемные, нахватанные.
arthur2 писал(а):Я вообще не встречал внятного мануала по кому для непосвященных
Public Function doSomething(testVar As String) As String
End Function
Option Explicit
Implements ITest
Private Function ITest_doSomething(testVar As String) As String
MsgBox testVar, , "from interface"
End Function
Public Function doSomething(testVar As String) As String
MsgBox testVar, , "from method"
End Function
Option Explicit
Implements ITest
Private Function ITest_doSomething(testVar As String) As String
MsgBox testVar, , "from new class"
End Function
Sub main()
Dim pc As New stdTest 'объект рс будет символизировать me.picture
' Dim i As ITest ' проверим, что всё работает
' pc.doSomething "lalala"
' Set i = pc
' i.doSomething "trampampam"
Set pc = New cMyTest
'так же, как Set Me.Picture = New VeryNonStdPicture
'Несоответствие типа!
End Sub
arthur2 писал(а):Ты объясняешь, почему не работает так, как я написал. А нужно - как написать так, чтобы работало
Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот], Yandex-бот и гости: 22