Простейший примерчик вырезания рисунка из StdPicture

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 08.10.2010 (Пт) 6:55

Ты не должен никому и ничего :)

Дело не в реализации, а в принципе: ты не объяснил его внятно.

Артур писал(а):Как сделать этот "даже свой" объект?

Хакер писал(а):Создать свой класс, который реализует интерфейс IPicture(Disp).

Артур писал(а):дальше куда?

Хакер писал(а):Всё, используешь объекты своего класса как объекты, поддерживающие IPicture(Disp).
Например так:
Код: Выделить всё
Set Me.Picture = New VeryNonStdPicture

где VeryNonStdPicture — твой класс, поддерживающий IPicture(Disp).


Хакер писал(а):Делая Set Me.Picture = New VeryNonStdPicture ты пытаешься у объекта класса VeryNonStdPicture запросить интерфейс _StdPicture. Естественно, класс VeryNonStdPicture не поддерживает _StdPicture, а поддерживает только _VeryNonStdPicture и IPicture(Disp).
Последний раз редактировалось arthur2 08.10.2010 (Пт) 6:57, всего редактировалось 1 раз.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 08.10.2010 (Пт) 6:56

arthur2 писал(а):ты пытаешься у объекта класса VeryNonStdPicture запросить интерфейс _StdPicture.

Вот тут ты ошибся: не _StdPicture, а IPictureDisp. VeryNonStdPicture поддерживает IPictureDisp.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 08.10.2010 (Пт) 7:05

Хакер писал(а):твой код воспроизводит не мой метод, а что-то левое.

Приведи пример "правильного" воспроизведения твоего метода.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 08.10.2010 (Пт) 7:11

У тебя pc — локальная переменная, а должно (потому что Picture — это свойство) быть свойство (с Set-хендлером). У тебя переменная pc имеет тип StdTest, а должна иметь тип ITest.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 08.10.2010 (Пт) 17:58

Хакер писал(а):У тебя переменная pc имеет тип StdTest, а должна иметь тип ITest
Все-таки, я не понимаю. Picture имеет тип IPictureDisp? Или она просто реализует интерфейс IPictureDisp, вместе с другими интерфейсами? Что такое StdPicture? Разве это то же самое, что и IPictureDisp?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 08.10.2010 (Пт) 23:46

arthur2 писал(а):Picture имеет тип IPictureDisp?

Picture — это не переменная, это свойство, Set-хендлер ждёт «интерфейсную ссылку типа IPictureDisp на объект».

arthur2 писал(а):Или она просто реализует интерфейс IPictureDisp, вместе с другими интерфейсами?


Она — это кто?
arthur2 писал(а):Что такое StdPicture? Разве это то же самое, что и IPictureDisp?

StdPicture — это класс. Кастомный, VB-шный.
IPictureDisp — это интерфейс. ОбщеCOMовский.

Тут только одна есть фишка: у всех классов есть интерфейс-по-умолчанию. VB для каждого пользовательского касса Class1 содздаёт интерфейс по умолчанию _Class1. А в данном случае интерфейсом по умолчанию для StdPicture указан IPictureDisp, а не какой-то отдельный новый интерфейс.

Ещё раз повторяю: по моим предсказаниям припроды вещей: это внутри Set-хендлера делается Err.Raise, а не какие-то приведения типов и кастования интерфейсов дают ошибку. Хватит уже возиться с этим и делать неправдивые тесты-аналоги на базе переменных, которые никогда ничего такого не покажут.

(Писал сонный, утром поправлю, если что)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 09.10.2010 (Сб) 5:25

Хакер писал(а):Хватит уже возиться с этим и делать неправдивые тесты-аналоги на базе переменных, которые никогда ничего такого не покажут.
Я делаю тесты, потому что хочу понять механизм, который ты не хочешь понятно объяснить :)
Хотя, как обычно, начинает проступать что-то понятное :)
Хакер писал(а):Тут только одна есть фишка: у всех классов есть интерфейс-по-умолчанию. VB для каждого пользовательского касса Class1 содздаёт интерфейс по умолчанию _Class1. А в данном случае интерфейсом по умолчанию для StdPicture указан IPictureDisp, а не какой-то отдельный новый интерфейс.

Ага!
Код: Выделить всё
    typedef [public]
    Picture IPictureDisp;

    [
      uuid(0BE35204-8F91-11CE-9DE3-00AA004BB851)
    ]
    coclass StdPicture {
        [default] dispinterface Picture;
        interface IPicture;
    };

Теперь осталось понять, как
Хакер писал(а):Disp просто сделай основным интерфейсом класса. Т.е. выдай DispId-ы нормальным методам.
Артур
 
   

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение SLIM » 09.10.2010 (Сб) 7:44

arthur2 писал(а):еперь осталось понять, как

Если не ошибаюсь - Disp-интерфейс - это и есть интерфейс по умолчанию.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 09.10.2010 (Сб) 8:13

arthur2 писал(а):Теперь осталось понять, как
Хакер писал(а):Disp просто сделай основным интерфейсом класса. Т.е. выдай DispId-ы нормальным методам.


Только трюком: заимплементить пустышку IPictureDisp, а его методы реализовать в _VeryNonStdPicture, полагаясь на то, что реализация IDispatch::Invoke у обоих будет общей.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 09.10.2010 (Сб) 15:46

Хакер писал(а):Только трюком: заимплементить пустышку IPictureDisp, а его методы реализовать в _VeryNonStdPicture, полагаясь на то, что реализация IDispatch::Invoke у обоих будет общей.

еще бы понять, что это означает :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 09.10.2010 (Сб) 15:54

Описать в TLB пустой интерфейс IPictureDisp, унаследованный от IDispatch и имеющий правильный IID.
В классе написать Implements MyTlb.IPictureDisp.

Методы IPictureDisp-а писать не как Private ... IPictureDisp_xxxx, а как обычные методы класса Public ... xxx. Своим методам проставить нужные (как у оригинального IPictureDisp) DispId-ы.

Должно заработать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 09.10.2010 (Сб) 16:34

Хакер писал(а):Своим методам проставить нужные (как у оригинального IPictureDisp) DispId-ы.

Те, которые [id(0x00000003)]? Для своего класса тоже нужно делать интерфейс в тлб? или как-то по-другому нужно эти DispId-ы ставить?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 09.10.2010 (Сб) 16:52

arthur2 писал(а):или как-то по-другому нужно эти DispId-ы ставить?

Что, никогда свои коллекции с ньюэнумом не далал? :roll:
setting_dispid_imgdemo.png
setting_dispid_imgdemo.png (34.54 Кб) Просмотров: 2049
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 09.10.2010 (Сб) 17:29

Нет, это я нашел, но вопрос - сами id
arthur2 писал(а):Те, которые [id(0x00000003)]?

И - в этом поле дают ставить только отрицательные числа
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 09.10.2010 (Сб) 17:38

arthur2 писал(а):в этом поле дают ставить только отрицательные числа

Ну, это плохо.

Нужно посмотреть, какой подвид позднего связывания использует потребитель твоего объекта. Если «по имени» — то не нужно беспокоиться. Если «по DispId-у» — то либо подгонять значения, либо реализовывать диспетчеризацию вручную, либо, коль в данном случае это оказавается сложнее, использовать реализацию от OLE.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 09.10.2010 (Сб) 19:07

Похоже, все-же безнадёга :(
Хакер писал(а):использовать реализацию от OL
в смысле "остановиться на том, что есть"?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение Хакер » 09.10.2010 (Сб) 19:40

Безнадёги не бывает. Бывают решения, некоторые из них, которые изначально казались проще чем иные, затем оказываются сложнее.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Простейший примерчик вырезания рисунка из StdPicture

Сообщение arthur2 » 09.10.2010 (Сб) 20:21

Хакер писал(а):Бывают решения, некоторые из них, которые изначально казались проще чем иные, затем оказываются сложнее.
Хорошо заметил :)
Артур
 
   

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 107

    TopList