Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#31: 2008-01-20 22:19:26 ЛС | профиль | цитата
nesco писал(а):
а чего тебе непонятно, если нету имени файла, то читаем то, что с чем связаны

Ничего
И это -- тоже, непонятно абсолютно

nesco писал(а):
а причем тут офигеть

А при том, что остальные варианты, по-просту - нецензурные

nesco писал(а):
текст не читается

Теперь читается
Кстати, о "прекрасности": если прописать неполный путь (например "Intlogo.jpg") и все честно благородно "крякает". Так что свой путь к HiAsm ручками пропиши...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#32: 2008-01-20 22:31:08 ЛС | профиль | цитата
Galkov, я через правку прочитал.
А нифига он не закреплется на Image. У MainForm'ы есть нормально работающее событие onPaint, которое выдает ошибку у Image вот такого плана


Error: Undeclared identifier: '_event_onPaint'

А с контекстом Bitmap'a вообще странно, то же самое было написано, и нифига не работало, черт его знает что..., буду разбираться

Galkov писал(а):
А при том, что остальные варианты, по-просту - нецензурные

Ну и как его отсоединить, если необходимо, кроме Disconnect'a?

Galkov писал(а):
И это -- тоже, непонятно абсолютно

Хотел точки сэкономить, наверное зря, переделаю
карма: 22

0
Ответов: 9906
Рейтинг: 351
#33: 2008-01-20 22:37:14 ЛС | профиль | цитата
nesco писал(а):
А нифига он не закреплется на Image

Доказательства
Кстати говоря, у пустого Image и пустой битмэп

nesco писал(а):
Хотел точки сэкономить

Речь идет о прочтении слов на русском языке, блин
Слава богу, есть еще язык компилятора, и я начинаю догадываться о значении
А как же другие...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#34: 2008-01-20 22:44:40 ЛС | профиль | цитата
Galkov писал(а):
Кстати, о "прекрасности": если прописать неполный путь (например "Int\logo.jpg") и все честно благородно "крякает"

Ха! Действительно. Значит FileExists прпускает такое имя, а функция не понимает, ориинально? И какие булут предложения по защите от "дурака"?

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


Galkov писал(а):
Доказательства



Add(MainForm,7649955,294,238)
{
Left=10
Top=10
Ctl3D=0
Position=1
Point(onPaint)
Point(Handle)
link(onCreate,12423105:doData,[])
}
Add(InlineCode,4633675,483,252)
{
WorkPoints=#6:doLoad|9:doStretch|
DataPoints=#8:FileName|6:Bitmap|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|56:uses Windows,Messages,Share,Debug,ActiveX,KOLComObj,KOL;|0:|4:type|32: IImgCtx = interface(IUnknown)|48: ['{3050f3d7-98b5-11cf-bb82-00aa00bdce0b}']|40: // Initialization/Download methods|68: function Load(pszUrl:PWChar; dwFlags:DWORD): HResult; stdcall;|93: function SelectChanges(ulChgOn:DWORD; ulChgOff:DWORD; fSignal:DWORD): HResult; stdcall;|83: function SetCallback(pCallback:pointer; pUserData:pointer): HResult; stdcall;|44: function Disconnect: HResult; stdcall;|0:|22: // Query methods|95: function GetUpdateRects(prc:PRect; var prcImg:TRect; var pcrc:integer): HResult; stdcall;|104: function GetStateInfo(var pulState:DWORD; var pSize:TSize; fClearChanges:DWORD): HResult; stdcall;|64: function GetPalette(var phpal:HPalette): HResult; stdcall;|0:|26: // Rendering methods|69: function Draw(_hdc:HDC; var prcBounds:TRect): HResult; stdcall;|107: function Tile(_hdc:HDC; var pptBackOrg:TPoint; var prcClip:TRect; var psize:TSize): HResult; stdcall;|120: function StretchBlt(_hdc:HDC; dstX,dstY,dstXE,dstYE,srcX,srcY,srcXE,srcYE:integer; dwROP:DWORD): HResult; stdcall;|5: end;|0:|28: THiAsmClass = class(TDebug)|10: private|21: FImgCtx:IImgCtx;|17: hOK:THandle;|16: sg:boolean;|14: sz:TSize;|9: public|31: FileName,Bitmap:THI_Event;|47: procedure doLoad(var Data:TData;idx:word);|50: procedure doStretch(var Data:TData;idx:word);|5: end;|0:|14:implementation|0:|5:const|31: IMGCHG_SIZE = $0001;|31: IMGCHG_VIEW = $0002;|31: IMGCHG_COMPLETE = $0004;|31: IMGCHG_ANIMATE = $0008;|31: IMGCHG_MASK = $000F;|0:|35: IMGLOAD_NOTLOADED = $00100000;|35: IMGLOAD_LOADING = $00200000;|35: IMGLOAD_STOPPED = $00400000;|35: IMGLOAD_ERROR = $00800000;|35: IMGLOAD_COMPLETE = $01000000;|35: IMGLOAD_MASK = $01F00000;|0:|35: IMGBITS_NONE = $02000000;|35: IMGBITS_PARTIAL = $04000000;|35: IMGBITS_TOTAL = $08000000;|35: IMGBITS_MASK = $0E000000;|0:|35: IMGANIM_ANIMATED = $10000000;|35: IMGANIM_MASK = $10000000;|0:|35: IMGTRANS_OPAQUE = $20000000;|35: IMGTRANS_MASK = $20000000;|0:|35: DWN_COLORMODE = $0000003F;|35: DWN_DOWNLOADONLY = $00000040;|35: DWN_FORCEDITHER = $00000080;|35: DWN_RAWIMAGE = $00000100;|0:|66: CLSID_IImgCtx:TGUID = '{3050f3d6-98b5-11cf-bb82-00aa00bdce0b}';|66: IID_IImgCtx:TGUID = '{3050f3d7-98b5-11cf-bb82-00aa00bdce0b}';|0:|0:|22:{ StringToWideString }|73:function StringToWideString(const s: String; codePage: Word): WideString;|17:var l: integer;|5:begin|16: Result := '';|23: if s = '' then exit;|80: l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil, 0);|28: SetLength(Result, l - 1);|23: if l <= 1 then exit;|93: MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), -1, PWideChar(@Result[1]), l);|4:end;|0:|63:procedure MyCallback(pCtx:pointer; pUserData:pointer); stdcall;|5:begin|37: THiAsmClass(pUserData).sg := true;|4:end;|0:|32:procedure THiAsmClass.doStretch;|41:var dt:TData; DC:hdc; R:TRect; Wnd:dword;|5:begin|23: if not sg then exit;|31: dt := ReadData(Data,Bitmap);|46: if _isBitmap(dt) then with ToBitmap(dt)^ do|80: FImgCtx.StretchBlt(Canvas.Handle,0,0,Width,Height,0,0,sz.cx,sz.cy,SRCCOPY)|14: else begin |28: Wnd := ToInteger(dt); |28: if Wnd = 0 then exit; |29: DC := GetWindowDC(Wnd);|27: GetWindowRect(Wnd,R);|87: FImgCtx.StretchBlt(DC,0,0,R.right-R.Left,R.bottom-R.Top,0,0,sz.cx,sz.cy,SRCCOPY);|24: ReleaseDC(Wnd,DC);|10: end; |3: |4:end;|0:|29:procedure THiAsmClass.doLoad;|25:var s:string; stat:dword;|5:begin|34: s := ReadString(Data,FileName);|34: if not FileExists(s) then exit;|56: FImgCtx := CreateComObject(CLSID_IImgCtx) as IImgCtx;|52: FImgCtx.Load(PWChar(StringToWideString(s,3)), 0);|56: FImgCtx.SetCallback(@MyCallback, pointer(Self)); |46: FImgCtx.SelectChanges(IMGCHG_COMPLETE,0,1);|15: sg := false;|49: while not sg do Applet.ProcessPendingMessages;|37: FImgCtx.GetStateInfo(stat, sz, 0);|3: |4:end;|0:|14:initialization|20: CoInitialize(nil);|12:finalization|17: CoUninitialize;|4:end.|
link(Bitmap,14498594:Handle,[])
}
Add(DoData,12423105,350,252)
{
Data=String(W:\Int\logo.jpg)
link(onEventData,16707643:doEvent1,[])
}
Add(Hub,16707643,406,252)
{
link(onEvent1,4633675:doLoad,[])
}
Add(Image,14498594,483,189)
{
Width=392
Height=266
Align=5
Color=16777215
Point(Handle)
Point(onPaint)
link(onPaint,4633675:doStretch,[(527,202)(527,234)(471,234)(471,265)])
}

Вот тут у меня выдает ошибку на onPaint. Подключаешь нижнюю точку хаба, те же эмоции
карма: 22

0
Ответов: 9906
Рейтинг: 351
#35: 2008-01-20 22:52:34 ЛС | профиль | цитата
1) Найти winapi, которое дает полный путь. Вроде должно быть, даже и с распаковкой переменных окружения...
2)
Galkov писал(а):
Кстати говоря, у пустого Image и пустой битмэп



карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#36: 2008-01-20 22:56:42 ЛС | профиль | цитата
Galkov, а причем здесь окно и bitmap, он так же точно и на bitmape в режиме Handle нифига не закрепляет. Ты же сам писал, что для закрепления нужен onPaint.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#37: 2008-01-20 23:38:59 ЛС | профиль | цитата
nesco писал(а):
Ты же сам писал

И сейчас подтверждаю, именно так сделан KOL - можешь загляруть и посмотреть
А в коды Image заглянуть тоже не можешь, что ли
------------ Дoбавленo:

И вообще причем здесь одно к другому.
Ты еще onPaint у Label поисследуй...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#38: 2008-01-21 03:27:35 ЛС | профиль | цитата
Galkov писал(а):
И вообще причем здесь одно к другому
А может ты и прав...

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


Вот в чем прикол с контекстом Bitmap'a

Вот так не работает


Bitmap := ToBitmap(dt);
а вот так работает


with ToBitmap(dt)^ do

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


Выложил полностью измененный компонент на SVN. Нашел и вставил защиту от "дурака" при неполных именах файлов. Теперь понимаются неполные пути такого плана: Int\logo.bmp или \Int\logo.bmp

Примеры на текущую версию в аттаче
карма: 22

0
файлы: 1example_imageloader_2_00.zip [157.6KB] [257]
Ответов: 9906
Рейтинг: 351
#39: 2008-01-21 07:42:40 ЛС | профиль | цитата
nesco писал(а):
Intlogo.bmp или Intlogo.bmp

Две большие разницы, между прочим
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#40: 2008-01-21 10:43:49 ЛС | профиль | цитата
Galkov писал(а):
Две большие разницы, между прочим
А по-барабану функции поиска, я проверял, и то давал имя, и другое, всеравно файл читался правильно.

Вот я хочу тебя спросить -- мне не нравится режим выдачи файла в поток по doLoad, тормозит процесс при отрисовке, может опционально сделать?

И еще воппрос -- tsdima писал, что нежелательно из одного потока управлять переменными другого потока, минуя очередь сообщений, но ты это применил и напрямую записываешь переменную, как это понимать?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#41: 2008-01-21 12:16:16 ЛС | профиль | цитата
nesco писал(а):
что нежелательно из одного потока управлять переменными другого потока, минуя очередь сообщений

Этих словосочетаний я не понимаю.
Может я не настолько продвинут в современном сленге, но это так - НЕ ПОНИМАЮ
Я вообще многих его фраз не понимаю, а он не спешит с разъяснениями
Про синхронизацию обращения к переменным из разных потоков прописано в Рихтере.
Написанное там, я понимаю, к примеру.
Там же отмечено, что винда не содержит Interlocked-функций только для чтения, или только для записи, в силу их бессмысленности

nesco писал(а):
А по-барабану функции поиска, я проверял, и то давал имя, и другое, все равно файл читался правильно

Если по-барабану, значит у тебя неправильно работает. Или проверять еще не научился.
У меня -- не по-барабану.
И для GetFullPathName -- тоже не по-барабану.
Обратная косая в начале, означает корень текущего диска.

nesco писал(а):
мне не нравится режим выдачи файла в поток по doLoad

С этого (забыть напрочь про слово "на всякий случай") надо начинать, а не вспоминать на "десятом" релизе
Изобилие релизов не всегда есть только свидетельство трудоспособности, имхо
Также как и твой GetFullPath -- там делов на одну строку (загляни, к примеру, в исходники SysUtils.ExpandFileName)

А это что за наскальные надписи
if (sz.cx * 100) div sz.cy > (hw * 100) div hh then

Почему 100, а не 1000, или 10000...
Кто мешает написать: sz.cx * hh > hw * sz.cy -- непонятно...
Почему только режим с сохранением пропорций
Почему только Stretch -- по теории Draw должен быть быстрее
Ну я-то -- только проверял глупости, про которые ты мне мозги парил...
((кстати говоря и без with у меня тоже все работает точно также))
Ну а уж про procedure ClientRect - я вообще нефига не понял
Поэтому нижайше прошу выложить здесь этот код отдельно, с подробными комментариями к КАЖДОЙ строке
Ну не понимаю я, как можно сравнивать перемещаемые переменные с абсолютными...

Про гранату
Судя по исходникам hiPictureStream.inc в Fasm, всякий интерфейс (который НИКАКОГО отношения не имеет к PObj) имеет наследуемые методы QueryInterface,AddRef,Release
Это во-первых
А во-вторых: при следующем вызове doLoad ОПЯТЬ будет создаваться окно (еще одно ???) с классом "Internet Explorer_Hidden" и еще два потока
Или достаточно просто вызвать Load того же объекта

nesco, честное слово, такие вопросы себе следует задавать ДО первого релиза...

карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#42: 2008-01-21 12:35:11 ЛС | профиль | цитата
Galkov писал(а):
честное слово, такие вопросы себе следует задавать ДО первого релиза...
Не было бы релиза, не было бы вышенаписанной писанины

Galkov писал(а):
Почему 100, а не 1000, или 10000...
Применен метод целочисленного деления с точностью до второго знака.

Galkov писал(а):
sz.cx * hh > hw * sz.cy
Тут да, действительно, я чего-то лоханулся, конечно можно, и деление тогда не нужно. Вот что значит опытный взгляд.

Galkov писал(а):
Почему только режим с сохранением пропорций
Да вот мне так захотелось (да и не только мне, народу тоже нужно было).

Galkov писал(а):
Ну не понимаю я, как можно сравнивать перемещаемые переменные с абсолютными...
Это непонятно к чему относится, вообще.

Galkov писал(а):
Или достаточно просто вызвать Load того же объекта
Хорошая идея, но подскажи, как его удалить, этот объект в destructore
Galkov писал(а):
по теории Draw должен быть быстрее
Да быстрее, но нафига мне картинка 2048х1536 пикселей на поле 640х480

карма: 22

0
Ответов: 9906
Рейтинг: 351
#43: 2008-01-21 12:53:10 ЛС | профиль | цитата
nesco писал(а):
Да вот мне так захотелось

Мне что, слово ТОЛЬКО всегда писать жирными буквами и жирным
Наличие отдельных методов для разных мероприятий как-то народ напрягают
Или наоборот облегчают, когда один используется

nesco писал(а):
но подскажи, как его удалить

чтение букварей тоже не возбраняется, +:
Galkov писал(а):
имеет наследуемые методы QueryInterface,AddRef,Release


nesco писал(а):
Вот полный код компонента

Полный у меня есть, у меня нет понимания НИ К ОДНОЙ строке из нижеследующего
Вот на эти (ВСЕ) оставленные строки я и прошу комментарии

#pas
procedure ClientRect;
begin
wsz := hRect.Right - hRect.Left;
hsz := hRect.Bottom - hRect.Top;
hw := x2 - x1;
hh := y2 - y1;
if hw > (wsz - x1) then hw := wsz - x1;
if hh > (hsz - y1) then hh := hsz - y1;
if (hw = 0) or (hh = 0) then begin
x1 := 0;
y1 := 0;
hw := wsz;
hh := hsz;
end;
end;

nesco писал(а):
Это непонятно к чему относится, вообще

Я догадался, что непонятно. Метод размерностей не всем преподавали

nesco писал(а):
Да быстрее, но нафига мне картинка 2048х1536 пикселей на поле 640х480

Ты у нас умнее пользователя, и лучше его знаешь, какого у него размера картинка, и какого поле

карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#44: 2008-01-21 13:06:01 ЛС | профиль | цитата
Galkov писал(а):
Наличие отдельных методов для разных мероприятий как-то народ напрягают
Или наоборот облегчают, когда один используется

Ну а если пропорционально вписывать картинку надо а не во весь размер окна, что тогда делать, плодить свойства?

Galkov писал(а):
чтение букварей тоже не возбраняется, +:
Да, это правильно, учиться, и только учиться

Вот код с описанием


      procedure ClientRect;
begin
// получение полного размера главного окна (для Bitmap'a это -- Width, Height; тут может и тупо)
wsz := hRect.Right - hRect.Left;
hsz := hRect.Bottom - hRect.Top;
// получение размеров окна вписывания
hw := x2 - x1;
hh := y2 - y1;
// ограничение размера окна вписывания границами главного окна
if hw > (wsz - x1) then hw := wsz - x1;
if hh > (hsz - y1) then hh := hsz - y1;
// если нет координат, то назначаем размер главного окна окну вписывания
if (hw = 0) or (hh = 0) then begin
x1 := 0;
y1 := 0;
hw := wsz;
hh := hsz;
end;
end;


Galkov писал(а):
Метод размерностей не всем преподавали

Преподавали, но успело уже забыться.
Galkov писал(а):
Ты у нас умнее пользователя, и лучше его знаешь, какого у него размера картинка, и какого поле

И какие будут конструктивные предложения?
карма: 22

0
Ответов: 9906
Рейтинг: 351
#45: 2008-01-21 13:56:57 ЛС | профиль | цитата
nesco писал(а):
Ну а если пропорционально вписывать картинку надо а не во весь размер окна, что тогда делать, плодить свойства?

А у нас что нет примеров этому в элементах из дистрибутива
Методы, в отличии от св-в (не считая 14-го типа) позволяют оставить в коде только то, что нужно

nesco писал(а):
Вот код с описанием

Правильно ли я понял из написанных слов, что у тебя коэффициент масштабирования зависит от положения вывода картинки
Не говоря уже о том КАК он это делает.
И при этом, Point1 не может содержать отрицательных координат

nesco писал(а):
И какие будут конструктивные предложения?

Не заниматься мультипроцессорностью
Например:
  • Есть один загрузочный метод -- doLoad
  • Два рисовальные - doDraw и doStretch
  • Пользователь без твоего интеллекта сумеет определить точки Point1 (или +Point2 для doStretch), после doLoad, если ему известны sz.cx и sz.cy
  • ВСЕ
    И никакой дикой арифметики.

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

    0
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)