Вверх ↑
Этот топик читают: Гость
Ответов: 5103
Рейтинг: 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
vip
#1.1контекстная реклама от партнеров
Ответов: 5103
Рейтинг: 578
#2: 2022-03-24 11:46:53 ЛС | профиль | цитата
Удалось таки нормально заставить работать потоки в FPC
Кто то вырезал низкоуровневые процедуры из системного модуля, пришлось пересобирать всё в отдельном.
Теперь такая схема работает отлично.

Add(MainForm,2953706,63,105)
{
Width=370
Height=360
}
Add(Button,2168206,140,105)
{
Left=15
Top=20
link(onClick,11191630:doEvent1,[])
}
Add(Memo,3686666,469,168)
{
Left=115
Top=30
Width=100
Height=275
AddType=1
ScrollBars=2
}
Add(Memo,2529294,469,105)
{
Left=240
Top=30
Width=100
Height=275
AddType=1
ScrollBars=2
}
Add(For,9637638,350,168)
{
End=500
link(onEvent,11662893:doWork2,[])
}
Add(Hub,11191630,203,105)
{
link(onEvent1,15209979:doStart,[])
link(onEvent2,5421242:doStart,[(249,118)(249,174)])
}
Add(Thread,15209979,280,105)
{
Delay=1
FastStop=0
link(onExec,12812207:doFor,[])
}
Add(For,12812207,350,105)
{
End=500
link(onEvent,7311804:doWork2,[])
}
Add(Thread,5421242,280,168)
{
Delay=1
FastStop=0
link(onExec,9637638:doFor,[])
}
Add(HubEx,7311804,406,105)
{
link(onEvent,2529294:doAdd,[])
}
Add(HubEx,11662893,420,168)
{
link(onEvent,3686666:doAdd,[])
}
Add(Label,15006110,63,154)
{
Left=15
Top=60
}
Add(Label,14465335,70,161)
{
Left=15
Top=85
}

карма: 5
0
Ответов: 5103
Рейтинг: 578
#3: 2022-03-25 21:53:27 ЛС | профиль | цитата
Удалось задействовать варианты в FPC. Но при работе всё же требуется приведения к типам.
Теперь работает такой код
unit HiAsmUnit;

interface

uses kol,Share,Debug,FPCVariants;

type
THiAsmClass = class(TDebug)
private

public

end;


implementation

var
v,v2: Variant;
i: integer;
d: Double;
dt: TData;
s: string;
begin
v := 10.45;
v2 := 20.05;
i := Integer(v);
d := Double(v2);
dtReal(dt,d);

_Debug(i); // 10
_Debug(dt); // 20.05

//v := v + v2; runtime error
v := Double(v) + Double(v2);

s := 'demo str var result = ' + string(v);
_Debug(s); // demo str var result = 30.5

end.

Редактировалось 1 раз(а), последний 2022-03-26 09:33:46
карма: 5
0
Ответов: 5103
Рейтинг: 578
#4: 2022-04-02 19:17:33 ЛС | профиль | цитата
Для информации:
Очень даже реально портировать вот такой FreeWare рибончик в HiAsmhttps://axolot.com/axwribbon.htm
(посмотрел коды, очень даже ничего)
карма: 5
0
Ответов: 5103
Рейтинг: 578
#5: 2022-04-22 14:16:29 ЛС | профиль | цитата
Портировал с VCL алгоритмы Base64 и Base91 (d4 & FPC) Base91->http://base91.sourceforge.net/
[b]Stream->Base64, Base64->Stream (Memory)
StreamMemory->FileBase64, FileBase64->StreamMemory[/b]

Base91 поновей и хоть нигде широко не распространён но всё же кое где уже используется. Плотность сжатия потока лучше но скорость соответственно чуть ниже.
На скриншоте артефакты от штатных компонентов (с моими вьюверами отображается нормально, значит поток исправен)



--- Добавлено в 2022-04-22 14:21:40

Конфигурация идентична для Base64 и Base91
[Property]
@Stream=Определяет данные в формате Stream для кодирования|10|
@String=Определяет данные в формате String для декодирования|2|
@FileName=Имя файла для кодирования/декодирования данных по умолчанию|2|
Mode=Режим кодирования/декодирования данных|4|0|Encode,Decode

[Methods]
doMemory=Кодирует/декодирует двоичные данные в памяти|1|
doFile=Кодирует/декодирует двоичные данные в(из) файл(а)|1|
onEncode=Событие происходит после кодирования данных методом doMemory и выводит в поток строку закодированных данных|2|
onDecode=Событие происходит после декодирования данных методом doMemory и выводит в поток данные типа Stream|2|
Stream=Содержит идентификатор кодированных/декодированных данных типа Stream|3|10
Size=Содержит размер данных в байтах|3|1
*SrcStream=Определяет данные для кодирования типа Stream|4|10
*SrcString=Определяет данные для декодирования типа String|4|2
*FileName=Имя файла для кодирования/декодирования данных|4|2

Редактировалось 1 раз(а), последний 2022-04-22 14:21:40
карма: 5
0
Ответов: 187
Рейтинг: 3
#6: 2022-04-22 19:18:16 ЛС | профиль | цитата
Отлично выходит
карма: 1

0
Ответов: 160
Рейтинг: 4
#7: 2022-04-22 20:11:17 ЛС | профиль | цитата
Довольно неплохо Браво
карма: 0
HiAsm Studio
0
Ответов: 5103
Рейтинг: 578
#8: 2022-04-24 17:02:38 ЛС | профиль | цитата
Про входит и выходит я знаю

застрял на китайских поделках. https://github.com/cnpack/cnvcl
Буду портировать кое что

Редактировалось 1 раз(а), последний 2022-04-24 17:03:05
карма: 5
0
Ответов: 5103
Рейтинг: 578
#9: 2022-04-25 02:22:43 ЛС | профиль | цитата
Уе...ся но портанул HexEditor. Спасибо парням из поднебесной. В такой репликации и в коммерческих продуктах редко где встретишь.


--- Добавлено в 2022-04-25 02:24:14

а спать то

Редактировалось 1 раз(а), последний 2022-04-25 02:24:14
карма: 5
0
Ответов: 5103
Рейтинг: 578
#10: 2022-04-25 15:22:20 ЛС | профиль | цитата
Ну что, нашпиговал свойствами и методами.
Теперь это выглядит так

@DtReadOnly=При установке параметра в True дамп будет доступен только для чтения|14|1|True,False
@FileName=Определяет имя файла для загрузки/сохранения дампа по-умолчанию|2|
@SelectColor=|8|clHighlight
@SelectFontColor=|8|clHighlightText
ScrollBars=Определяет наличие ползунков прокрутки и их местоположение|4|0|None,Horizontal,Vertical,Both

[Methods]
doLoadFromFile=Загружает дамп из файла. Имя файла передаётся в потоке либо с точки или свойства FileName|1|
doSaveToFile=Сохраняет дамп из редактора в файл. Имя файла передаётся в потоке либо с точки или свойства FileName|1|
*doLoadFromStream=Загружает дамп из памяти. Дамп передаётся в потоке либо загружается с точки SrcStream|1|
*doSaveToStream=Сохраняет дамп в Stream и выдаёт его поток в OnSaveStream|1|
*doLoadFromBuffer=Загружает буфер дампа памяти с адреса BaseAddress и размером BufferSize|1|
*doSaveToBuffer=Сохраняет буфер дампа памяти с адреса BaseAddress и размером BufferSize|1|
*doClear=Метод очищает буфер редактирования и просмотра|1|
FileName=Определяет имя файла для загрузки|4|2
SrcStream=Определяет данные для редактирования в памяти|4|10
*BaseAddress=Определяет начальный адрес загрузки и сохранения дампа памяти методами doLoadFromBuffer и doSaveToBuffer|4|1
*BufferSize=Размер буфера данных для методов doLoadFromBuffer и doSaveToBuffer|4|1
OnSelectionChange=Событие происходит при выделении дампа в редакторе|2|
*OnSaveStream=Событие происходит после метода|2|
Stream=Содержит дамп данных в памяти|3|10
SelStart=Позиция относительно начального адреса начала выделения дампа|3|1
SelLength=Размер блока выделенного дампа|3|1
SelText=Содержит выделенный текст|3|2
*ColIndex=Содержит индекс каретки колонки|3|1
*RowIndex=Содержит индекс каретки строки|3|1

демка ниже ссылка

Редактировалось 1 раз(а), последний 2022-04-25 20:14:27
карма: 5
0
Ответов: 5103
Рейтинг: 578
#11: 2022-04-25 16:31:31 ЛС | профиль | цитата
Самое главное испытал модули VCLEvent, VCLType, KOLStream;
Методы событий не изменял!

--- Добавлено в 2022-04-25 16:39:40

Что то не понравилось мне каретка по дефолту в редакторе, переделал.
Просто сравните насколько это лучше ибо я таки оставлю
https://forum.hiasm.com/getfile/39433



Редактировалось 2 раз(а), последний 2022-04-25 20:13:26
карма: 5
0
Ответов: 458
Рейтинг: 159
#12: 2022-04-25 20:01:29 ЛС | профиль | цитата
andrestudio, попробовал запустить exe
TEST_HE.jpg
WIN 11 64b
карма: 4

0
Ответов: 187
Рейтинг: 3
#13: 2022-04-25 20:04:06 ЛС | профиль | цитата
WIN 10 64b тоже самое
карма: 1

0
Ответов: 5103
Рейтинг: 578
#14: 2022-04-25 20:12:49 ЛС | профиль | цитата
tig-rrr, шрифта похоже нет такого в системе.
Ок. Вот с стандартный Courier New был Raize, сменю тогда его по дефолту
https://forum.hiasm.com/getfile/39433
карма: 5
0
Ответов: 458
Рейтинг: 159
#15: 2022-04-25 20:18:41 ЛС | профиль | цитата
andrestudio писал(а):
tig-rrr, шрифта похоже нет такого в системе.

andrestudio, теперь всё ОК
TEST_HE_1.jpg
карма: 4

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