Вверх ↑
Ответов: 5126
Рейтинг: 578
#1: 2022-03-23 17:18:40 ЛС | профиль | цитата
Портирование в HiAsm компонентов из Delphi VCL становится ещё доступней. (соответственно с поддержкой FPC)

На днях работал над портом основных модулей, таких как Classes, SysUtils, Graphics и т.д

Существенным тормозом про который я как то писал раньше это отсутствие полного аналога функции Format и не думайте что это смешно, это так и есть. Поэтому вместо нормального класса исключений Exception мы имеем жалкую породию в виде err.pas несовместимую с FPC. Посему всякий раз оху.... от RunTime Error вместо нормального сообщения об ошибке.

В итоге удалось сделать полный аналог класса Exception со всеми вытекающими.
Далее если юнит типа VCLType.pas который я делал может кому уже и известен то вот про VCLEvent.pas я вам расскажу впервые.

В этом модуле я создал класс TVCLEvent который перенаправляет события от KOL контролов типа PControl прототипам процедур событий которые используются в VCL Delphi. Как известно из основных их две разновидности, для примера

1) procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
2) procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

гемороя при портировании кода приносит колосально много (на первом этапе приходилось их полностью комментировать а потом только по одной переводить)

Теперь это делать не придётся, всё будет работать достаточно прозаично.
Вот для примера код который прекрасно работает в IC HiAsm в d4 и в FPC


unit HiAsmUnit;

interface

uses kol,Share,Debug,VCLEvent,VCLType,Messages;

type
THiAsmClass = class(TDebug)
private
ev: TVCLEvent;
pc: PControl;
procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
public

Ctrl, OnEv: THI_Event;
procedure doTest(var dt: TData; idx: word);
end;

implementation

procedure THiAsmClass.WMLButtonDown(var Message: TWMLButtonDown);
begin
_debug('WMLButtonDown XPos-' + IntToStr(Message.XPos));
end;

procedure THiAsmClass.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
_hi_onEvent(OnEv, X);
end;

procedure THiAsmClass.MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
begin
_Debug('Right button');
if PControl(Sender) = pc then _Debug('Sender = pc');
end;
end;

// тут просто назначим события
procedure THiAsmClass.doTest(var dt: TData; idx: word);
begin
pc := ReadControl(Ctrl,'');
ev := TVCLEvent.Create(pc,True); // Trye = hook enabled method type WM....

ev.MouseMove := MouseMove; // vcl event type
pc.onMouseMove := ev.onMouseMove; // kol event type

ev.MouseDown := MouseDown; // vcl event type
ev.WMLButtonDown := WMLButtonDown; // vcl event type
pc.onMouseDown := ev.onMouseDown; // kol event type
end;

end.

И это просто очевидный прогресс. Для примера KOLGraphics полный аналог модуля delphi который теперь работает в HiAsm
Короче портировано уже много основных классов и модулей (список большой писать в лом) но если кому интересно то я в теме...
карма: 5
0