Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.02;
Скачать: CL | DM;

Вниз

TBitmap в kol + asm   Найти похожие ветки 

 
UFO   (2005-08-14 22:58) [0]

Часть 1.
Нужно вызвать из асемблерной вставки TBitMap.SetHandle. В дебагере паскальной версии прямо так и пишится, но при компиляции выдает, что нет у битмапа такого метода, что в принцепе не удевительно т.к. он Protected. Выхода собственно 2
1) модифицировать KOL.pas, переместив процедуру SetHandle в секцию Public.
2) Создать наследника :

...
interface

   TBitmapmod = object( TBitMap )
   protected
   public
       procedure SetHandle(const Value: HBitmap);
   end;

implementation

procedure TBitMapMod.SetHandle;
begin
inherited SetHandle( Value);
end;

...



Может кто знает как без такого рода извращений все-таки присвоить Handle из ассемблера (Вызов функции SetHandle обязателен, явно или нет).

Часть 2.
Это касается работы с интерфейсами. Помнится в MASM можно вызывать методы так:

call (IPicture PTR[edx]).get_Handle


Может и в Delphi есть аналог, а то не очень красиво получается:

call dword ptr [edx+$0c]


 
thaddy   (2005-08-15 01:30) [1]

If you study kol.pas, you will see you can obtain the same elegance ;)
And there is no need to make it public, you can simply cast it through this:
PHackedBitmap = ^THackedBitmap;
THackedBitmap = object(Tbitmap)
end;

PHackedBitam(Mybitmap).sethandle....


 
UFO   (2005-08-15 22:25) [2]

many thanks, thaddy

Если кому интересно, то все эти заморочки были нужны для модуля загрузки картинок JPG GIF и BMP без встроенного в программу декодера, а через интерфейс IPicture из OLE. Вот листинг ...

unit KolOlePicture;

interface

uses Windows, Kol, ActiveX;

type
   PBitMapmod = ^TBitMapmod;
   TBitmapmod = object( TBitMap )
   protected
       fPicta: IPicture;
       destructor Destroy; {-}virtual;{+}{++}(*override;*){--}
   end;

function SHCreateStreamOnFileA (FileName: PChar; grfMode: DWORD;var stream: IStream):HResult; stdcall;
procedure KOLNewOLEBitMap(var BitMap: PBitMap;FileName:String);

implementation

function SHCreateStreamOnFileA;         external "shlwapi.dll" name "SHCreateStreamOnFileA";

destructor TBitmapmod.Destroy;
begin
   if fPicta<>nil then
       fPicta._Release;
   inherited;
end;

procedure DummyDetachCanvas( Sender: PBitmap );
begin
end;

procedure KOLNewOLEBitMap;
var     Stream: IStream;
       Picta: IPicture;
       hh: THandle;
const IID_IPicture:TGUID="{7BF80980-BF32-101A-8BBB-00AA00300CAB}";

   Function _NewBitMapmod ( Picta:Pointer ):PBitmapmod;
   begin
       New (Result, Create);
       Result.fDetachCanvas := DummyDetachCanvas;
       Result.fPicta := IPicture(Picta);
   end;
asm
   //[ebx] = PBitmap;
   //edi = FileName;
   push ebx
   push edi
   mov ebx, eax
   mov edi, edx
   //BitMap := nil;
   xor eax, eax
   mov [ebx], eax
   //SHCreateStreamOnFileA(PChar(FileName), 0, Stream);
   lea eax, [Stream]
       push eax
       push $00
       push edi //FileName
       call SHCreateStreamOnFileA
   //if Stream=nil then exit;
   cmp Dword ptr [Stream], $00
   jz @@EXIT
   //OleLoadPicture(Stream, FileSize(FileName), false, IID_IPicture, Picta);
   lea eax, [Picta]
       push eax
       push offset IID_IPicture
       push $00
   mov eax, edi //FileName
   call KOL.FileSize
       push eax
   mov eax, [Stream]
       push eax
       call ActiveX.OleLoadPicture
   //if Picta = nil then exit;
   cmp Dword ptr [Picta], $00
   jz @@EXIT
   //Picta.get_Handle(hh);
   lea eax, [hh]
       push eax
   mov edx, [Picta]
       push edx
   mov eax, [edx]
       call dword ptr [eax+$0c]
   //BitMap := _NewBitMapmod(Picta);
   mov eax, [Picta]
   call _NewBitMapmod
   mov [ebx], eax
   //BitMap.Handle := hh;
   mov edx, [hh]
   call TBitMapMod.SetHandle

@@EXIT:
   lea eax, [Stream]
   call System.@IntFClear
   lea eax, [Picta]
   call System.@IntFClear

   pop edi
   pop ebx
end;

end.


А более глобальная цель - написание пакетного ресайзере для картинок. Удевительно, сколько всего можно засунуть в 23 кило...

<a href="http://www.homm86.narod.ru/ets_src.zip" >ets_src.zip</a>


 
thaddy   (2005-08-16 01:17) [3]

;) Good code!



Страницы: 1 вся ветка

Текущий архив: 2006.04.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
15-1141921979
MuxauJl
2006-03-09 19:32
2006.04.02
hlp файлы


15-1141920731
Nic
2006-03-09 19:12
2006.04.02
Окно ввода логина и пароля


15-1141754213
ArtemESC
2006-03-07 20:56
2006.04.02
JavaScript


4-1136821688
VirEx
2006-01-09 18:48
2006.04.02
SetParent() встраивание окна в чужое окно


15-1142004365
ZeFiR
2006-03-10 18:26
2006.04.02
eXtreme Notepad