Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#1: 2008-01-18 23:13:31 ЛС | профиль | цитата
переделывай давай
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#2: 2008-01-19 00:02:23 ЛС | профиль | цитата
Galkov писал(а):
переделывай давай
А чего переделывать-то? Я уже сделал одну отрисовку в сессии чтения, что еще там надо?
Алгоритм вполне нормальный -- нет контекста, выдаем в поток картинку; есть контекст -- в поток не выдаем, в любом случае, только одна отрисовка. На контекст выводим куда хотим, и какого хочешь размера (в пределах картинки), вписывая в прямоугольник отрисовки, заданнный точками координат.

------------ Дoбавленo:

Или ты не мне сказал
карма: 22

0
Ответов: 9906
Рейтинг: 351
#3: 2008-01-19 00:42:43 ЛС | профиль | цитата
Тебе.

1) Разве белые люди делают DeleteDC(Bitmap.Canvas.Handle) ???
2) Зачем нужно св-во DrawSource - не пойму
3) Интерфейс пользователя должен позволять Создать объект + (Отрисовать сколько хочешь раз, и каким хочешь макаром) + Уничтожить его
4) У пользователя должна быть возможность установить самостоятельно Point1 и Point2, уже зная параметры картинки, ДО отрисовки
5) Обязательность обработки очереди сообщений - сомнительна.
Например, если отрисовку подключать на OnPaint, то это уж точно противопоказано.
Да и в KOL ее отрабатывать следует KOL-овскими методами. Это, видимо, должно быть внешнее событие, к которому пользователь при желании подключает Application.doProcessMessages
Тут еще есть над чем подумать...

А вообще, ты читал чего-то про этот COM
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#4: 2008-01-19 01:46:45 ЛС | профиль | цитата
Galkov писал(а):
5) Обязательность обработки очереди сообщений - сомнительна.
Не сомнительна -- tsdima специально ее сделал для отработки мультирежима, так как оба метода работают в разных потоках, а то у нас из 10 картинок считывало только одную.
Galkov писал(а):
3) Интерфейс пользователя должен позволять Создать объект + (Отрисовать сколько хочешь раз, и каким хочешь макаром) + Уничтожить его
Этого не понял, надо что, писать в буфер, что ли, а прозрачность в буфере у нас не поддерживается, только прямо на контексте можно.

Galkov писал(а):
А вообще, ты читал чего-то про этот COM

Про этот COM писал tsdima, я сам про него ничего толком не нашел, только что он есть и как его прикрутить, но он уже был прикручен.

Мелкие ошибки я исправлю, а вот с глобальными непонятками, надо разбираться

Мне кажется, не стоит заморачиваться с многократной отрисовкой из буфера, нафиг он не нужен. Компонент хорош для чтения эскизов из папок на лету (для этого он и разрабатывался), остальное прикрутили по ходу пьесы.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#5: 2008-01-19 11:10:09 ЛС | профиль | цитата
nesco писал(а):
Не сомнительна

Вышесказанное означает, что необходимо обрабатывать очередь сообщений в ЛЮБОМ мыслимом случае.
Фигня - не в любом.
Обязательность здесь относится ТОЛЬКО к ожиданию окончания потока при следующем вызове метода SelectChanges
И никакого отношения не имеет, например, к очереди сообщений
Это все, не считая того, что в приведенном варианте реализации использование объекта ядра вместо обыкновенного флага - удивление легкое вызывает...

nesco писал(а):
Этого не понял

Создал объект
Отрисовал его один раз маленьким
Если хочется побольше, или в другом месте - чего, снова винтом шевелить, что-ли ???
Надоело - удалил, чего непонятного-то...

Или второй вариант: ты хочешь его рисовать на чем-то, по событию onPaint
Скажем, супер-пупер PNG, на очень красивом фоне, по событию PaintBox.onBeforeDraw
В этом варианте, надо иметь этот объект не уничтоженным, и уж точно - НЕ обрабатывать очередь сообщений потока
Разве аналогичное является чем-то из ряда вон выходящим


nesco писал(а):
Про этот COM писал tsdima, я сам про него ничего толком не нашел

Это есть плохо
Значит у него и надо пораспрошать с пристрастиями
Как же иначе можно отвечать за сделанное... Не этюд же - элемент в дистрибутиве... Да и для всяких мульти-картинок средства есть наверняка...
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#6: 2008-01-19 14:21:43 ЛС | профиль | цитата
Galkov писал(а):
В этом варианте, надо иметь этот объект не уничтоженным
И на чем его хранить, открывать скрытое окно, на Bitmape хранить не получается, прозрачность теряется, или другой вариант: скопировать копию окна в память (ну или картинку) и на ней отрисовать -- картинка будет лежать в памти и по запросу отрисовываться, но ведь так сначала и было?

Столкнулся еще с одной проблемой, на Bitmap.Canvas.Handle отрисовывать категорически отказывается. В callback методе категорически отказывается считывать правильно указатель на DC Bitmapa в памяти (они разные), что не скажешь о DC окна. А ведь у меня в первом варианте это получалось, так что с упрощением надо повременить, а поюзать дополнительно старый вариант.

Galkov писал(а):
использование объекта ядра вместо обыкновенного флага
Про это что-то писал tsdima, вроде использование флагов не совсем корректно, в случае завершения отрисовки, так как не совсем известно что еще за сообщения шлются, вот он и предложил отрабатывать всю очередь. Я только одного не пойму -- чем это так уж плохо, или чем чревато?

Galkov писал(а):
Значит у него и надо пораспрошать с пристрастиями
Ну, если захочет ответить, а так придется провести более расширенный поиск?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#7: 2008-01-19 15:00:13 ЛС | профиль | цитата
nesco писал(а):
И на чем его хранить

При исполнении, эта строка

#pas
FImgCtx := CreateComObject(CLSID_IImgCtx) as IImgCtx;
-- создала объект, или нет
Ты его УЖЕ хранишь, коль скоро умеешь им пользоваться
Чего изобретать проблемы-то, не пойму
Их и без изобретательства хватит...

Кстати говоря, этот COM-объект -- это ТВОЯ граната, почему на место никто не положил

nesco писал(а):
Столкнулся еще с одной проблемой

Ты хочешь сказать, что это

#pas
pCls.FImgCtx.Draw(bmp.Canvas.Handle, Rect);
-- прекрасно работает. А это:

#pas
DC := Bitmap.Canvas.Handle;
....
pCls.FImgCtx.StretchBlt(pCls.DC,...);
-- нет
Если другое, ну поставь себе в труд выражаться яснее ...

nesco писал(а):
так как не совсем известно что еще за сообщения шлются

Вы чего гоните
COM-объект знает только контекст, который ему передали
Больше он не знает ничего
Какие нахрен сообщения, которые якобы шлются, для контекста


карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#8: 2008-01-19 15:36:51 ЛС | профиль | цитата
Galkov писал(а):
Если другое, ну поставь себе в труд выражаться яснее ...
Да нет, именно это, и именно при чтении контекста Bitmapa в callback'e, в случае Draw, так тот Bitmap там же и оформляется. Ну не совсем правильно выразился, но понял-то ты правильно.
Galkov писал(а):
Какие нахрен сообщения
Не знаю, но с флагом не получается нифига, может чего подскажешь толкового?

Galkov писал(а):
Кстати говоря, этот COM-объект -- это ТВОЯ граната, почему на место никто не положил
А это действительно упустили.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#9: 2008-01-19 15:41:54 ЛС | профиль | цитата
nesco писал(а):
Да нет, именно это

Так написано-то одно и то же
Разбиратьсяся надо, а не "юзать"
карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#10: 2008-01-19 16:46:34 ЛС | профиль | цитата
Galkov, я тут немного подумал -- а зачем вообще шаманские пляски вокруг callback'a, он нужен только, чтобы получить GetStateInfo. Я попробовал все, что можно, оттуда перенести в основной метод, и все так же точно работает. Это кажется более правильным решением.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#11: 2008-01-19 17:38:04 ЛС | профиль | цитата
Что для onLoad основной поток лучше, так это и обсуждать нечего. Можно даже сказать, что асинхронный onLoad -- это просто неправильно.
Получается, что единственная задача callback'a - сигнализация о готовности к рисованию......

карма: 9

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#12: 2008-01-19 22:55:07 ЛС | профиль | цитата
Galkov писал(а):
Вышесказанное означает, что необходимо обрабатывать очередь сообщений в ЛЮБОМ мыслимом случае


Мне кажется это не совсем правильно. Вот что я нашел:

WaitForSingleObject - ожидать открытия семафора. При успешном завершении, т.е. открытии доступа к объекту, функция возвращает 0


См далее:

Семафор представляет собой глобальный объект, позволяющий синхронизировать работу двух или нескольких процессов или потоков. Для программиста семафор - это просто счетчик (хотя манипулировать им можно только при помощи специальных функций). Если счетчик равен N, это означает, что к ресурсу имеют доступ N процессов


Мне кажется, что tsdima прицепил ее правильно, иначе отловить завершение чужого потока не так просто, да и не корректно (я помню, он об этом писал).
карма: 22

0
Ответов: 9906
Рейтинг: 351
#13: 2008-01-19 23:19:34 ЛС | профиль | цитата
nesco писал(а):
Вот что я нашел

О чем вопрос-то, не пойму
"Вышесказанное" в моем посте относится к твоему "Не сомнительна"
"Не сомнительна" - значит надо отрабатывать очередь сообщений.
Мое утверждение в том, что ждать конечно надо, но не факт, что надо месить очередь.

А нашел не совсем в тему. Это API может ждать любой объект ядра. Логичней всего ждать ждать поток в котором сей COM-объект свои безобразия вытворяет.
Вот только хэндла егонного у нас нет, поэтому свой объект и заводится. Вот только смысла ждать его с нулевым таймаутом особого не усматриваю.
Мне кажется, логичней ждать

#pas
WaitForSingleObject(hOK,INFINITE);
безо всяких циклов (тогда кстати, без объекта ядра и не обойтись)
Хотя возможны видимо и два варианта, только вместо явной обработки очереди, надо сделать событие onWait, к которому подключать Application.doProcessMessages



BTW: Про всякую такую фигню надо сведения не урывками добывать, а какой-нибудь букварь читать. Я читал Рихтера
карма: 9

1
Голосовали:temp
Разработчик
Ответов: 26163
Рейтинг: 2127
#14: 2008-01-19 23:49:27 ЛС | профиль | цитата
Galkov писал(а):
Я читал Рихтера
А у тебя, случаем, ссылки на этот букварь не завалялось?

------------ Дoбавленo:


Ну вот с этим


WaitForSingleObject(hOK,INFINITE);
все безобразие уснуло надолго (повисло просто)

Galkov писал(а):
надо сделать событие onWait, к которому подключать Application.doProcessMessages


А подорбнее можно ?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#15: 2008-01-20 00:04:48 ЛС | профиль | цитата
nesco писал(а):
все безобразие уснуло надолго (повисло просто)

Тогда я пас.
Не фига не понимаю, как может COM слать сообщения, не зная ничего -- ему же даже DC никто не сказал

nesco писал(а):
А подробнее можно ?


#pas
while WaitForSingleObject(hOK,0) <> WAIT_OBJECT_0 do begin
_hi_OnEvent(_event_onWait);
end;

nesco писал(а):
А у тебя, случаем, ссылки на этот букварь не завалялось?

Не завалялось
Вообще-то я на сети снял где-то
Это сканирование бумажной книги, сделанное с помощью "замечательной" программы FineReader
Могу намылить
"Замечательность" в какой-то степени я подправил, но не все... за остальное не обессудь
карма: 9

1
Голосовали:temp
Сообщение
...
Прикрепленные файлы
(файлы не залиты)