小编Jon*_*den的帖子

简单的Delphi 3d功能

任何人都可以帮我解决Delphi中一些裸骨,旧学校3D方法的例子吗?不使用openGL或firemonkey或任何外部库(vanilla canvas编码).我想要做的是能够围绕共同的原点旋转X个点.从我以往的记忆中,你从右边减去(在3d点上),使origo始终为0,0 - 然后执行计算,最后添加左/上像素偏移量以获得实际的屏幕位置.

我正在寻找的是一套小型的临时例程,ala:

  • RotateX(aValue:T3dpoint; degr:float):T3dPoint;
  • 旋转Y( - / - )
  • RotateZ( - / - )

使用这些功能,创建旧的"旋转三维立方体"(8分)应该相当容易.

还有,有没有找出可见的"面孔"的功能?如果我想要一个填充的矢量立方体,那么我想我需要提取可见区域(基于距离/重叠?),然后将其绘制为X个填充多边形?毫无疑问,这些必须按深度排序,以免出现问题.

例如:

  • PointsToFaces(const a3dObject:T3dPointArray):TPolyFaceArray;
  • SortFaces(Const aFaces:TPolyFaceArray):TPolyFaceArray;

欢迎任何帮助!

delphi 3d graphics freepascal fpc

7
推荐指数
2
解决办法
3387
查看次数

是否有关于使用Castalia源解析器的示例或文档?

虽然我之前已经编写了大量的递归解析器,但我最近对Castalia Delphi Parser(为什么要重新发明轮子)感兴趣.我知道这个解析器已经在很多项目中使用了多年 - 但是找到它的任何文档似乎都很困难.

我在哪里可以找到文档?或者作为替代方案,在现实解析场景中使用它有没有明确的示例?

这个想法是使用Castalia进行Delphi单元的语法验证,并且(如果可能的话)有益于生成程序的节点树(带有类,它们的方法,参数,结果数据类型,if/then/else - 基本上是完整的单位或计划的地图).您可以将其视为"半个脚本运行时",而无需实际运行任何代码,只需将其分解为最基本的方面.

delphi parsing

6
推荐指数
1
解决办法
966
查看次数

Delphi XE下的Toolbar 2000?

旧的Toolbar 2000软件包(最好带有TBX扩展)是否可以在Delphi XE下编译和工作?

这些天有人使用"Tb2k"和TBX吗?

delphi

6
推荐指数
1
解决办法
5338
查看次数

Delphi的TCanvas中有错误吗?

我只是想把它扔到这里以得到一些反馈,我称之为" 记得算零 "(感谢Andreas Rejbrand的链接.结果发现它被称为"一个问题")当处理像素时.记得零点是什么意思?好吧,如果你实现一个需要计算矩形运算中涉及的像素数的例程(例如FillRect或CopyRect),你必须记住零(0,0)是一个像素.但是将零视为像素而不是一些无值的规则似乎只涉及涉及<= 0值的坐标.举个例子:

mRect:=Rect(0,0,10,10);
mRectWidth:=mRect.right-mRect.left; // returns 10 - 0 = 10
Run Code Online (Sandbox Code Playgroud)

看到问题?矩形实际上在像素操作术语中定义了从位置0,0延伸到位置10,10的区域.实际上是11步长,而不是10(对于x:= 0到10实际上是11步).为了弥补丢失的像素(当你将它移动到正空间或负空间时,零没有质量和消失.上帝的毕达哥拉斯定理我似乎记得)大多数人只是在最终结果中加1,如下所示:

function getRectWidth(const aRect:TRect):Integer;
Begin
  result:=(aRect.right-aRect.left) +1;
End;
Run Code Online (Sandbox Code Playgroud)

现在这个工作,实际上它工作得很好,90%的图形库使用它作为计算矩形的宽度和高度的tecnique.但就像强大的英雄achillees一样,它有一个弱点,即空矩形返回的质量为1(如果你用一个阻击器,它也可以产生各种有趣的AV).

mRect:=Rect(0,0,0,0);
mRectWidth:=(mRect.right-mRect.left) + 1;
Run Code Online (Sandbox Code Playgroud)

其中大致相当于0 - 0 = 0:+ 1 = 1,这意味着如果你不注意盲点,将会渲染一个像素.令我困惑的是,Delphi XE实际上似乎有裁剪问题(?),或者说至少是一个矛盾.因为你实际上在底部会丢失一个像素,如果你绘制它就会丢失到最右边.ClientRect不能从第一个像素到最后一个像素返回完整的绘图范围吗? - 但如果你试试这个:

mRect:=getClientRect;
MoveTo(mRect.left,mRect.Bottom);
LineTo(mRect.right,mRect.bottom);
Run Code Online (Sandbox Code Playgroud)

你不会看到一件事!因为Delphi剪辑了最终像素(错误?).好像很奇怪,当你要求clientrect时,你手动调整它吗?

我已经从头编写了自己的图形库(用于快速dib访问和屏幕外渲染,与此特定情况无关),所以我已经在这些方法中工作了很长时间.在编码时总会有一些新的东西需要学习,但是没有人能告诉我这种材料在工作中没有盲点.

当我比较VCL如何处理其他库时,尤其是那些用C#编写的库,我也注意到很多人都喜欢我 - 并确保客户端是您可以使用的区域的全部范围.当他们在剪辑区域外进行blitting并使用重叠的矩形时,他们也为"盲点"占据了一席之地.

盲点的情况

我们假设您正在将一个矩形从一个位图复制到另一个位图.你的blit的目标是Rect(-10,-10,10,10).为了在这里正确地"剪切"目标,所以你不要在内存缓冲区外写入​​访问冲突,你必须计算X1/Y1和你的剪辑之间的距离(这里被认为是0,0,宽度-1 ,身高-1).

这将为您提供必须添加到目标矩形和源矩形的偏移量.否则,您将在缓冲区外写入​​,但也会从源缓冲区中的错误位置读取.

现在,这取决于你如何实现这个过程.但是有很多库不考虑零.当X1和X2具有相同的值时发生盲点,但x1为负.因为人们通常写:mOffset:= x2 - abs(x1).在我们的情况下,它变为10-10 = 0.只要cliprect设置为0,0它就可以正常工作.但是当你的剪辑进入正空间的那一刻 - 你会偏离一个像素.如果您自动将getRectWidth中的值包含在内(例如mWidth:= aRect.right-aRect.left +1) - 根据源矩形,您将偏离2个像素(我知道,这是主要的无聊事物).

在Mac上的C#下,使用GTK#和本机MonoMac绑定 - clientrect是绝对的.这意味着您可以绘制到mRect.bottom或mRect.right并获得可见结果.因此,我发现我很喜欢我最喜欢的语言和工具包Delphi,我们总是必须手动调整每个ownerdrawn或自定义控件的clientrect.

delphi graphics

5
推荐指数
2
解决办法
1393
查看次数

Javascript Canvas pixelformat

我注意到每个使用Canvas对象的人都会在pixelbuffer周围乘以4(RGBA).我已经使用原生像素编码(Delphi和C++)进行了大量工作,并将其识别为普通的32位RGBA(888-8编码).我的问题是:有没有办法检测浏览器的pixelformat?如果您在支持16位(565编码)或24位(888编码)的设备上运行,如果浏览器必须降级每次重绘的位图,那么速度将非常慢.特别是涉及alpha混合时.

另外(这是次要的):是否可以在javascript下创建纯粹的888或565位图?或者基于8位调色板的位图怎么样?基于JS的游戏将大大受益,只需在我的视图中使用8位像素.

javascript graphics canvas

5
推荐指数
1
解决办法
605
查看次数

德尔福非rtti检查员

我有一些虚拟控件,它是我所设计的设计器系统的一部分.它们模仿delphi自己的组件,除了它们完全是所有者绘制的.我面临的问题是,由于我的属性系统与普通的Delphi有些不同 - 我无法使用RTTI检查器来编辑属性.

有没有人知道一个看起来像普通的delphi检查器的检查器,但是这允许我按代码定义属性?

如果可能的话,允许我定义枚举:

with edInspector.Items.add('align') do
Begin
  Options.add('alLeft',ftord(TMyAlign.azLeft));
  Options.add('alTop',ord(TMyAlign.azTop));
  Options.add('alRight',ord(TMyAlign.azRight));
  Options.add('alBottom',ord(TMyAlign.azBottom));
  Options.add('alClient',ord(TMyAlign.azClient));
end;
Run Code Online (Sandbox Code Playgroud)

和复杂的类型:

with edInspector.Items.add('font') do
Begin
  subitems.add('name',dtString).value:=def_FontName;
  subitems.add('size',dtInteger).value:=def_fontSize;
  subitems.add('color',dtColor).Value:=def_fontColor;
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2

5
推荐指数
1
解决办法
1257
查看次数

如何在Smart Mobile Studio中创建屏幕外图像?

使用图形时,如何在Smart Mobile Studio中创建屏幕外图像?我想绘画以创建图像,绘画到画布上,然后将该图形复制到游戏项目中的显示器上。

javascript smart-mobile-studio

5
推荐指数
1
解决办法
272
查看次数

在Delphi XE3中替换RIDL文件和typelib

我写了一个测试项目,它暴露了一个COM工厂和对象.测试并发现我们的实现工作 - 我现在想将代码+类型库移动到我们的主项目中.我将RIDL + TLB文件复制到主项目文件夹中.我相应地重命名了两个文件(到主项目名称).我还删除了项目资源文件,以防Delphi将TLB数据放在这里.当然我删除了旧的TLB和RIDL文件(我还删除了所有DCU文件,以防万一).最后,我将RIDL文件添加到主项目并进行编译.

Delphi在编译期间拾取RIDL文件,它按预期生成TLB文件,但不知何故它不会将TLB数据注入exefile.因此,当我启动应用程序时,我只是收到一条错误消息"无法加载类型库".在我的代码中,我在启动时自动创建COM工厂并更新Windows注册表.关机时会发生相反的情况.

摆弄了类型库编辑器几个小时,尝试从Delphi和shell/regsvr32注册typelibrary/exe,delphi因为一些神奇的原因选择了新文件,一切都按预期工作.

问题是,我不知道"为什么"它开始时没有工作,也不知道为什么它在几小时尝试不同组合后起作用.所以我无法重现成功.更新我们的代码库时,我必须在另一台计算机/修订版上做同样的事情 - 但这次它拒绝工作.

如何强制Delphi注入类型库?是否存在一些"技巧"(除了显而易见的刷新RIDL,它正确生成单元但没有对TLB资源问题做任何事情).

delphi com typelib delphi-xe

3
推荐指数
1
解决办法
2205
查看次数

创建 Firemonkey 表单并按代码填充

我正在将 VCL 组件移植到 FMX。99% 的代码是纯对象 pascal,所以工作得很好 - 但我有一个方法可以创建一个表单,用按钮和文本框填充它,这在 FMX 下根本不起作用。

手动创建表单然后从代码填充它的重点是确保它在 VCL、LCL 和 FMX 下编译;并且它在 iOS、Android 和任何使用的平台下也能正常显示。

但我不断收到“资源 /classname/ 未找到”,其中/classname/是我给我的临时表单类的任何类名。

像这样简单的事情会产生错误:

type
TMyDialogForm = Class(TForm);

procedure TForm1.Button1Click(Sender: TObject);
var
  LDialog:  TMyDialogForm;
begin
  LDialog := TMyDialogForm.Create(application.MainForm);
  try
    LDialog.Caption := 'Yahoo!';
  finally
    LDialog.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

由于错误涉及资源,我怀疑它正在寻找某种类型的布局数据。我刚刚开始玩 FMX,我确实注意到不同的平台允许不同的布局。但我必须承认,无论您的目标平台是什么,我都希望它回退到默认主题。

那么 - 我究竟如何通过代码创建表单,填充它并使用 Firemonkey 显示 ut 而不会遇到这种错误?它在 VCL 和 LCL 下工作得很好,但 FMX 一直在处理资源。

请不要告诉我所有的表格都必须设计?

delphi vcl firemonkey

1
推荐指数
1
解决办法
1837
查看次数