Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26151
Рейтинг: 2127
#1: 2008-01-09 13:07:40 ЛС | профиль | цитата
Galkov писал(а):
nesco, ты кажется тоже где-то дельфячий WideCharToString юзал...
Да не припомню, что-то. У меня не было ситуаций с применением WideChar'ов (если только WMI, но там автоматом перекодируется).
карма: 22

0
Ответов: 9906
Рейтинг: 351
#2: 2008-01-09 20:01:46 ЛС | профиль | цитата
Кажется фиговина, которая читает и масштабирует картинки всех форматов.
По мотивам кода от tsdima - не фига оно под FPC русских имен файлов не понимало, Ведмедь.jpg как живой перед глазами стоит....
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#3: 2008-01-09 22:44:11 ЛС | профиль | цитата
Galkov писал(а):
Ведмедь.jpg как живой перед глазами стоит....
А код от tsdima, в последней редакции, под FPC компилится отказался, начисто. Так что, до русских имен под FPC я так и не дошел.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#4: 2008-01-09 22:52:54 ЛС | профиль | цитата
nesco писал(а):
А код от tsdima, в последней редакции, под FPC компилится отказался, начисто

Який же ты Лыцарь, колы голой сракой ежа не вбъешь
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#5: 2008-01-09 23:41:48 ЛС | профиль | цитата
Galkov, так то ж IC, а не компонент, это так -- этюд на тему
карма: 22

0
Ответов: 9906
Рейтинг: 351
#6: 2008-01-10 10:44:15 ЛС | профиль | цитата
А известно ли тебе, что у нас элемент PictureStream глюковатый маленько под FPC
Он просит dll-ку которая сделана дельфёй, и которая создает объекты, уничтожаемые уже под FPC - забава для мазохистов, кстати говоря

Если плюнуть на сохранение, то этот "этюд" гораздо более компактная и функциональная замена сему безобразию, имхо
В принципе, несколько другой интерфейс нужен: элемент не создает новый bmp, а отрисовывает уже на имеющемся
По теории, даже с учетом прозрачности из ICO, и альфа-канала из PNG.
Ну подумать над св-м, как масштабировать....
В общем, мнение у меня такое, что это дело можно и нужно довести до товарного вида


В прочем и коды данного поста тоже можно.....
Если там еще "страховки" на BufLen<=1 ввести в UTF8ToStr...
Может и целевую локаль, символ-заменитель - свойствами сделать как-то...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#7: 2008-01-10 11:59:53 ЛС | профиль | цитата
Galkov писал(а):
В принципе, несколько другой интерфейс нужен: элемент не создает новый bmp, а отрисовывает уже на имеющемся
Это ты, наверное, контекст чужого окна или контекст стороннего bmp имеешь ввиду, да по-барабану, можно и на контексте. Но я не сторонник прямой отрисовки на контексте, проще и быстрее (но ресурсоемче) использовать уже готовый внутренний bitmap (кстати, в коде поддерживается масштабирование) для копирования на контекст.
------------ Дoбавленo:

nesco писал(а):
По теории, даже с учетом прозрачности из ICO, и альфа-канала из PNG
Ну а это -- ???, как у нас отображать.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#8: 2008-01-10 12:05:57 ЛС | профиль | цитата
nesco писал(а):
Ну а это -- ???, как у нас отображать

Ты пробовал в своем "этюде" рисовать этот PNG или ICO не в новом контексте (если тебе это слово больше нравится), а в том, на котором уже чего-то нарисовано предварительно
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#9: 2008-01-10 12:09:03 ЛС | профиль | цитата
Galkov писал(а):
не в новом контексте (если тебе это слово больше нравится)
Но, в принципе, он так называется.
А так нет, не пробовал, но попробуем -- это мелочи.
Лучше глянь на код, и скажи в чем проблема под FPC



#pas
unit HiAsmUnit;

interface

uses Share,Debug,Windows,ActiveX,KOLComObj,KOL;

const

IMGCHG_SIZE = $0001;
IMGCHG_VIEW = $0002;
IMGCHG_COMPLETE = $0004;
IMGCHG_ANIMATE = $0008;
IMGCHG_MASK = $000F;

IMGLOAD_NOTLOADED = $00100000;
IMGLOAD_LOADING = $00200000;
IMGLOAD_STOPPED = $00400000;
IMGLOAD_ERROR = $00800000;
IMGLOAD_COMPLETE = $01000000;
IMGLOAD_MASK = $01F00000;

IMGBITS_NONE = $02000000;
IMGBITS_PARTIAL = $04000000;
IMGBITS_TOTAL = $08000000;
IMGBITS_MASK = $0E000000;

IMGANIM_ANIMATED = $10000000;
IMGANIM_MASK = $10000000;

IMGTRANS_OPAQUE = $20000000;
IMGTRANS_MASK = $20000000;

DWN_COLORMODE = $0000003F;
DWN_DOWNLOADONLY = $00000040;
DWN_FORCEDITHER = $00000080;
DWN_RAWIMAGE = $00000100;

type

IImgCtx = interface(IUnknown)
['{3050f3d7-98b5-11cf-bb82-00aa00bdce0b}']
// Initialization/Download methods
function Load(pszUrl:PWChar; dwFlags:DWORD): HResult; stdcall;
function SelectChanges(ulChgOn:DWORD; ulChgOff:DWORD; fSignal:DWORD): HResult; stdcall;
function SetCallback(pCallback:pointer; pUserData:pointer): HResult; stdcall;
function Disconnect: HResult; stdcall;

// Query methods
function GetUpdateRects(prc:PRect; var prcImg:TRect; var pcrc:integer): HResult; stdcall;
function GetStateInfo(var pulState:DWORD; var pSize:TSize; fClearChanges:DWORD): HResult; stdcall;
function GetPalette(var phpal:HPalette): HResult; stdcall;

// Rendering methods
function Draw(_hdc:HDC; var prcBounds:TRect): HResult; stdcall;
function Tile(_hdc:HDC; var pptBackOrg:TPoint; var prcClip:TRect; var psize:TSize): HResult; stdcall;
function StretchBlt(_hdc:HDC; dstX,dstY,dstXE,dstYE,srcX,srcY,srcXE,srcYE:integer; dwROP:DWORD): HResult; stdcall;
end;

THiAsmClass = class(TDebug)
private
wsz : integer;
hsz : integer;
public
FImgCtx : IImgCtx;
hOK : THandle;
Width : THI_Event;
Height : THI_Event;
onLoad : THI_Event;
procedure doLoad(var dt:TData; idx:word);
end;

implementation

const
CLSID_IImgCtx:TGUID = '{3050f3d6-98b5-11cf-bb82-00aa00bdce0b}';
IID_IImgCtx:TGUID = '{3050f3d7-98b5-11cf-bb82-00aa00bdce0b}';

procedure MyCallback(pCtx:pointer; pUserData:pointer); stdcall;
var pCls:THiAsmClass; stat:DWORD; sz:TSize; bmp:PBitmap;
begin
pCls := THiAsmClass(pUserData);
pCls.FImgCtx.GetStateInfo(stat, sz, 0);
if (sz.cx * 100) div sz.cy > (pCls.wsz * 100) div pCls.hsz then begin
bmp := NewDIBBitmap(pCls.wsz, (pCls.wsz * sz.cy) div sz.cx, pf32bit);
bmp.PixelFormat:= pf32bit;
pCls.FImgCtx.StretchBlt(bmp.Canvas.Handle, 0, 0, pCls.wsz, (pCls.wsz * sz.cy) div sz.cx, 0, 0, sz.cx, sz.cy, SRCCOPY);
end
else begin
bmp := NewDIBBitmap((pCls.hsz * sz.cx) div sz.cy, pCls.hsz, pf32bit);
bmp.PixelFormat:= pf32bit;
pCls.FImgCtx.StretchBlt(bmp.Canvas.Handle, 0, 0, (pCls.hsz * sz.cx) div sz.cy, pCls.hsz, 0, 0, sz.cx, sz.cy, SRCCOPY);
end;
_hi_OnEvent(pCls.onLoad, bmp);
bmp.Free;
SetEvent(pCls.hOK);
end;

procedure THiAsmClass.doLoad;
var wName:WideString; m:TMsg;
begin
hOK := CreateEvent(nil,false,false,nil);
wsz := ToIntegerEvent(Width);
hsz := ToIntegerEvent(Height);
if (wsz = 0) or (hsz = 0 ) then exit;
wName := ToString(dt);
if not FileExists(wName) then exit;
FImgCtx := CreateComObject(CLSID_IImgCtx) as IImgCtx;
FImgCtx.Load(PWChar(wName), 0);
FImgCtx.SetCallback(@MyCallback, pointer(Self));
FImgCtx.SelectChanges(IMGCHG_COMPLETE,0,1);
while WaitForSingleObject(hOK,0)<>WAIT_OBJECT_0 do begin
if not GetMessage(m,0,0,0) then break;
TranslateMessage(m);
DispatchMessage(m);
end;
CloseHandle(hOK);
end;

initialization
CoInitialize(nil);
finalization
CoUninitialize;

end.
У меня вот это выдает при компиляции

FPC писал(а):
Build start...
Generated code
Create project...
Command line: fpc.exe '"D:\Program Files\HiAsm_b167\Elements\delphi\code\Project4.pas"' -Sd -Mdelphi '"-FED:\Program Files\HiAsm_b167\"' '"-FUD:\Program Files\HiAsm_b167\Elements\delphi\code\\units"' -FDtools\ -dF_P
Free Pascal Compiler version 1.9.6 [2004/12/31] for i386
Copyright (c) 1993-2004 by Florian Klaempfl
Target OS: Win32 for i386
Compiling D:\Program Files\HiAsm_b167\Elements\delphi\code\Project4.pas
Compiling D:\Program Files\HiAsm_b167\Elements\delphi\code\Share.pas
Compiling D:\Program Files\HiAsm_b167\Elements\delphi\code\Debug.pas
Compiling D:\Program Files\HiAsm_b167\Elements\delphi\code\hiInlineCode_8DAF62C.pas
Compiling resource D:\Program Files\HiAsm_b167\Elements\delphi\code\allres.res
Linking D:\Program Files\HiAsm_b167\Project4.exe
Project4.pas(81,1) Error: Error while linking
Closing script D:\Program Files\HiAsm_b167\ppas.bat
Error: D:\Program Files\HiAsm_b167\compiler\fpc\ppc386.exe returned an error exitcode (normal if you did not specifiy a source file to be compiled)
D:\Program Files\HiAsm_b167\Elements\delphi\code\\units\KOLComObj.o(.data+0x2ce):KOLComObj.pas: undefined reference to `VTBL_KOLCOMOBJ_TCOMOBJECTFACTORY_$_ICLASSFACTORY'

карма: 22

0
Ответов: 9906
Рейтинг: 351
#10: 2008-01-10 12:59:47 ЛС | профиль | цитата
Да нет у меня такой проблемы:
Build start...
Generated code
Create project...
Command line: fpc.exe '"D:\HiAsm\Elements\delphi\code\Project7.dpr"' -Sd '"-FED:\HiAsm\"' '"-FUD:\HiAsm\Elements\delphi\code\units"' -FDtools\ -CX -dF_P -dSUPER_PARENT
Free Pascal Compiler version 1.9.6 [2004/12/31] for i386
Copyright (c) 1993-2004 by Florian Klaempfl
Target OS: Win32 for i386
Compiling D:\HiAsm\Elements\delphi\code\Project7.dpr
Compiling D:\HiAsm\Elements\delphi\code\Share.pas
Compiling D:\HiAsm\Elements\delphi\code\Debug.pas
Compiling D:\HiAsm\Elements\delphi\code\hiInlineCode_4E14510.pas
Compiling resource D:\HiAsm\Elements\delphi\code\allres.res
Linking D:\HiAsm\Project7.exe
2249 Lines compiled, 1.2 sec
End build

На KOLComObj перед этим ругался, конечно - всякими нехорошими словами...
Но только warning
Естественно
------------ Дoбавленo:

Здорово смахивает на откомпилированный предварительно кривой исходник KOLComObj
Если после такого "восстановить" исходник методом копирования резервной копии, то FPC его компилировать не будет
Потому-что у него дата -- раньше даты соответствующего O-файла
Искусственный интеллект - это тебе не баб щупать

Я эту фигню как-то челу на нашем форуме постов 10 пытался втолковать.
Не фига не вышло, между прочим - покинул он нас расстроенный и обиженный
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#11: 2008-01-10 14:29:06 ЛС | профиль | цитата
Galkov, посыпаю голову пеплом . Мой косяк, у меня оказался фуфловый FPC, переустановил -- работает. Вопрос на засыпку, чего значит у FPC ключ -- -dSUPER_PARENT
карма: 22

0
Ответов: 9906
Рейтинг: 351
#12: 2008-01-10 15:14:59 ЛС | профиль | цитата
define
используется в hiMainForm.Pas
------------ Дoбавленo:

Ты лучше скажи, дошло ли до тебя содержание сего ИИ
Это важно. Как собственно и то, что любое Знание, это нечто большее, чем просто информация...

Я бы не спрашивал, если бы не имел живых примеров "не проходимости" сего высокого знания
Да и в случае понимания, ответ: "прочистил папку units" -- звучал бы более естественно...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#13: 2008-01-10 16:51:59 ЛС | профиль | цитата
Да дощло до меня, но я решил, все же, заменить компилятор FPC, он у меня с самых первых версий HiAsm'a.

Поюзал код и обнаружил, что русские символы не читаются под FPC у нас в пакете, а точнее -- вот эта строчка

#pas
wName := ToString(dt);
уже в переменной wName содержит пробелы вместо кириллицы.
------------ Дoбавленo:


Попробовал

#pas
wName := ReadString(dt,null);
та же песня.
Под Delphi строка нормальная.

карма: 22

0
Ответов: 9906
Рейтинг: 351
#14: 2008-01-10 17:18:38 ЛС | профиль | цитата
nesco писал(а):
Тут надо кодировки смотреть в Share

Причем здесь share
Вот это:

#sha
Add(MainForm,1266759,266,140)
{
Left=10
Top=10
Position=1
}
Add(Button,14537869,140,140)
{
Left=140
Top=140
link(onClick,7326480:doExecute,[])
}
Add(ODialog,7326480,196,140)
{
link(onExecute,1266759:doCaption,[])
}
Нормально читает русские имена файлов под FPC
Надо смотреть не share, тип для wName -- это wideString
Поэтому ставятся неявные преобразователи типов
При этом в Дельфях используется 3-я локаль (локаль текущего потока), а какая в FPC - не разбирался (ну их нафиг)

Случай типовой - ключница водку делала
В таких случаях я просто "инлайнил" Дельфячий код, после этого оно начинает работать одинаково.
Так я поступил в Random, и в примере из Этого топика (внимание возвращаемся к нашим баранам )

У меня правда (как уже сейчас вижу) наоборот было: из юникода ansi вытаскивался...
Но смысл тот же: читай MSDN про MultiByteToWideChar (у меня был WideCharToMultiByte) и юзай его с 3-й локалью
Я же не просто так в этом топике про твои заморочки вспомнил...
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#15: 2008-01-10 17:52:00 ЛС | профиль | цитата
Насчет Share, то явно сдурил и не заметил, что переменная WideString.

Вот лучше глянь код преобразования в WideString



#pas
//function StringToWideString(const s: AnsiString; codePage: Word): WideString;
function StringToWideString(const s: String; codePage: Word): WideString;
var l: integer;
begin
if s = ' then Result := '
else begin
l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), -1, nil, 0);
SetLength(Result, l - 1);
if l > 1 then
MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]), -1, PWideChar(@Result[1]), l - 1);
end;
end; { StringToWideString }

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


Вот..., лишний апостроф появился. Но нифига оно не работает с codepage=3
карма: 22

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