我已经创建了一个从Delphi/Lazarus应用程序加载的轮廓检测共享库.主应用程序将指针传递给位图,该指针由库内的函数处理.
这是库中的功能.参数"img"是指向我的位图的指针.
extern "C" {
void detect_contour(int imgWidth, int imgHeight, unsigned char * img, int &x, int &y, int &w, int &h)
{
Mat threshold_output;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
/// Load source image and convert it to gray
Mat src(imgHeight, imgWidth, CV_8UC4);
int idx;
src.data = img;
/// Convert image to gray and blur it
cvtColor( src, src_gray, CV_BGRA2GRAY );
blur( src_gray, src_gray, Size(10,10) );
/// Detect …Run Code Online (Sandbox Code Playgroud) 试图将Delphi库移植到Android.免费Pascal支持Android/ARM - 可以使用Windows的预构建编译器.但是,Android NDK现在也支持MIPS和x86.FPC支持者的状态如何?目前,我的项目或多或少与CPU无关 - 本机位是为所有四种支持的体系结构构建的.不想放手.
我不是在Pascal的完整Android开发周期之后 - 只是一个没有I/O的算法库.我尝试用p2c将其翻译成C语言,但译者对来源进行了扼流.
我是否应该尝试使用Linux为相关CPU构建交叉编译器,然后链接到NDK库?
编辑:我已经从Android分支的源代码构建了针对Intel/Linux的交叉编译器.它工作,除了你必须调用ppcross386编译,而不是fpc.看起来,后者忽略-Tlinux选项并调用Intel/Win32编译器.
EDIT2:对makefile和源进行少量更改,MIPS交叉编译器构建.但是,随着构建转移到跨CPU RTL,它几乎立即出错.
MainForm在运行时创建一些辅助Frame对象以显示各种选项面板.
这是其中一个框架类的典型构造函数(它们各自扩展TFrame):
constructor Tframe2.Create(AOwner: TComponent);
begin
inherited;
edTime.Text := '12:00pm'; //edTime is a TEdit control. this line is where it throws the exception
//etc.
end;
Run Code Online (Sandbox Code Playgroud)
这段代码在Delphi中运行良好(无论是否是正确的方法),但Lazarus中的相同代码不断抛出EInvalidOperation异常,因为控件(TEdit)尚未分配父"窗口"(rsControlHasNoParentWindow),当我检查代码时,这实际上是有意义的,因为在调用构造函数之后,父级似乎没有被分配.
这是MainForm中的代码初始化辅助框架:
if Assigned(frame) then FreeAndNil(frame);
case Node.AbsoluteIndex of
optInterval: frame := Tframe2.Create(Self); //here's where the constructor gets called.
//etc
end;
frame := TframeOther.Create(Self);
if Assigned(frame) then
begin
frame.Parent := panOptions; //here's where Tframe2's parent gets set
frame.Align := alClient;
end;
Run Code Online (Sandbox Code Playgroud)
那么有人可以解释Delphi和Lazarus之间在表单初始化序列方面是否存在任何重要差异?
那么解决这种初始化顺序问题的最标准方法是什么?与我更熟悉的其他语言相比,可能有不同的策略来解决此类错误.我可以在构造函数中添加另一个参数,或者如果有一个方法被调用post构造函数在屏幕上预先绘制它我可以覆盖我可以重新定位该代码,或者只是创建一个辅助方法并在调用setParent之后调用它.有什么特别的最佳做法吗?
编辑]:看来这可能是某种特定的TEdit.看起来初始化复选框状态的行没有相同的问题.这可能只是拉撒路的一个错误吗?
我安装了64位Lazarus并希望生成32位代码.当我尝试将目标操作系统设置为Win32时,我收到错误消息
编译器"C:\ Programs\lazarus\fpc\2.6.0\bin\x86_64-win64\fpc.exe"不支持目标x86_64-win32
所以我想我需要下载并安装额外的fpc编译器来生成Win32代码,并以某种方式在Lazarus IDE中切换它们.
做正确的方法是什么?
有没有什么方法可以真正快速地获得鼠标光标下的像素颜色?我有一个鼠标钩,我尝试在鼠标移动期间读取像素颜色。它是一种 ColorPicker
任何使用 getPixel 和 BitBlt 的尝试都非常慢。
更新 - 添加代码
unit Unit1;
{$mode delphi}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, lclintf, Windows;
type
{ TForm1 }
TForm1 = class(TForm)
pnColor: TPanel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ms(var message: tmessage); message WM_USER+1234;
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
DC:HDC;
const WH_MOUSE_LL = 14; //for Lazarus
implementation
{$R *.lfm}
{ TForm1 }
procedure HookMouse(Handle:HWND); stdcall; external 'mhook.dll';
procedure …Run Code Online (Sandbox Code Playgroud) 我在处理逻辑驱动器时遇到了一些问题.为清楚起见,无论分区如何,我对"物理磁盘"(PD)的定义都是原始磁盘."逻辑驱动器"(LD)指的是诸如驱动器E:,驱动器F:等的卷.
使用RRUZ(我的英雄SO成员)中的示例并实现WMI类我已经创建了一个用于读取磁盘的Freepascal程序.我通过\.\ PhyscialDiskX解决了PD问题,RRUZ(这里)创建的示例工作得很好.我可以读取PD的所有字节没有问题.
我对逻辑卷使用相同的句柄技术,它是\?\ E:或\?\ F:等.然后我使用IOCTL_DISK_GET_LENGTH_INFO来获取PD或LV的长度,然后读取字节范围,直到ReadBytes = TotalLength.我在MSDN网站上看到,它将自动检索传递的任何设备句柄的大小 - PD或LD都一样.事实上,我已经检查了我的程序returnzt WinHex,FTK Imager,HxD和其他几个低级磁盘工具返回的szie值.除了由0或1个起始位置引起的1字节差异外,它们匹配.
但是,出于某种原因,我的程序无法在Windows 7 Pro 64位上获得最终的32Kb,尽管以管理员身份运行该程序.它读取整个磁盘,然后读取最终缓冲区(以64Kb缓冲区完成)BytesRead返回-1.使用调试器我计算出以下值:
493,846,527 exact LV size of Drive F:
493,813,760 total bytes read at time of failure
32,767 bytes missing
Run Code Online (Sandbox Code Playgroud)
结果如下
BytesRead := FileRead(hDiskHandle, Buffer, (DiskSize - TotalBytesRead));
Run Code Online (Sandbox Code Playgroud)
在最终缓冲区读取时为-1.这是测试磁盘末尾的行,通过说"如果剩余读取的数量小于缓冲区大小的大小,则只尝试读取剩余的内容".因此,FileRead最后要求存储的字节值为32,767(因为此时的DiskSize - TotalBytesRead为32,767,这意味着要读取磁盘的剩余字节数).指定大小的缓冲区为64Kb.我的理解是你可以减少缓冲区而不是更多(FileRead状态:" 缓冲区必须至少是Count字节长.不执行检查 "?这是正确的吗?如果不是那么这可能是(也可能是)这个问题.
我不知道是不是因为IOCTL_DISK_GET_LENGTH_INFO,缓冲存储还是别的什么?希望有人能帮忙吗?我还在Lazarus Freepascal论坛上贴了一些截图.这是我的相关代码部分:
手柄:
// Create handle to source disk. Abort if fails
hSelectedDisk := CreateFileW(PWideChar(SourceDevice), FILE_READ_DATA,
FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, …Run Code Online (Sandbox Code Playgroud) Delphi和FPC BASM之间的另一个差异:
program PopTest;
{$IFDEF FPC}
{$mode delphi}
{$asmmode intel}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
var
B: LongWord;
procedure Pop(A: LongWord; var B: LongWord);
asm
PUSH EAX
POP [EDX]
end;
begin
Pop(5, B);
Writeln(B);
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
这个32位代码在Delphi XE中按预期工作,并在FPC中产生访问冲突(2.6.4)
调试显示POP指令(在FPC编译器中)弹出一个单词而不是预期的双字,从而破坏堆栈和过程的返回地址.解决方案是
procedure Pop(A: LongWord; var B: LongWord);
asm
PUSH EAX
POP DWORD [EDX]
end;
Run Code Online (Sandbox Code Playgroud)
这实际上是更好的代码,因为它消除了参数大小歧义.
错误与否?
我有一个在 AppStore 之外分发的 OSX 应用程序。因此,我使用相应的证书(开发人员 ID 应用程序证书)对其进行签名。
该应用程序本身是用 Freepascal (Lazarus) 编写的,并且有一个用 C++ 编写的依赖库,我也签署了该库。我还通过使用 install_name_tool 并在路径前加上@loader_path 将 lib 的路径更改为相对于应用程序。在当地对我来说就像一种魅力。
该应用程序(据我所知)在 OSX 10.11.6 上运行正常,但在 OSX 10.10.5 上崩溃,说:库未加载:@loader_path/libMyAPP.dylib 引用自:/Users/USER/Downloads/MyAPP.app/目录/MacOS/MyAPP 原因:找不到合适的图像。确实发现:/Users/Steve/Downloads/MyAPP.app/Contents/MacOS/libMyAPP.dylib: 代码签名对“/Users/Steve/Downloads/MyAPP.app/Contents/MacOS/libMyAPP.dylib”无效
/Users/Steve/Downloads/MyAPP.app/Contents/MacOS/libMyAPP.dylib:“/Users/Steve/Downloads/MyAPP.app/Contents/MacOS/libMyAPP.dylib”的代码签名无效
任何指示可能会发生什么?这真的是代码签名问题还是其他问题?谢谢。
我刚刚安装了 FPC 3.2.0(在 Linux Mint 19.3 上)并尝试使用 FPC IDE。bin我从安装子文件夹启动IDE ./fp,在IDE中编写了一个最简单的程序
program hello;
begin
writeln('hello');
end.
Run Code Online (Sandbox Code Playgroud)
将程序保存为hello.pas,当我编译它时,我得到
(3,1) Fatal: Can't find unit system used by hello
(0) Fatal: Compilation aborted
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为system是编译器的单位,而不是用户的单位。
我尝试用谷歌搜索这个问题,在不同的论坛上找到了几个帖子,其中一个问题可以追溯到2007年,但没有一个问题得到解答。
哪里有办法解决这个问题,或者 FPC IDE 已经死了大约 15 年了?
freepascal ×10
lazarus ×7
delphi ×5
fpc ×3
32bit-64bit ×1
android ×1
android-ndk ×1
arduino ×1
basm ×1
c++ ×1
code-signing ×1
macos ×1
objective-c ×1
opencv ×1
winapi ×1
wmi ×1