Delphi XE 系列的 TPolygon类型详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi XE 系列的 TPolygon类型详解相关的知识,希望对你有一定的参考价值。

Canvas.FillPolygon方法中就有这个类型,不知道怎么操作,有大神给介绍一下,捣乱者直接举报。

TPolygon 在 System.Types 单元中定义(xe2之后,之前的要去掉前面的 System.)。


其完整定义如下:


  PPointF = ^TPointF;
  TPointF = record
    X: Single;
    Y: Single;
  public
    constructor Create(const P: TPointF); overload;
    constructor Create(const X, Y: Single); overload;
    constructor Create(P: TPoint); overload;

    //operator overloads
    class operator Equal(const Lhs, Rhs: TPointF): Boolean;
    class operator NotEqual(const Lhs, Rhs: TPointF): Boolean;
    class operator Add(const Lhs, Rhs: TPointF): TPointF;
    class operator Subtract(const Lhs, Rhs: TPointF): TPointF;

    function Distance(const P2: TPointF): Double;

    procedure SetLocation(const X, Y: Single); overload;
    procedure SetLocation(const P: TPointF); overload;
    procedure SetLocation(const P: TPoint); overload;

    procedure Offset(const DX, DY: Single); overload;
    procedure Offset(const Point: TPointF); overload;
    procedure Offset(const Point: TPoint); overload;

    function Add(const Point: TPointF): TPointF; overload;
    function Add(const Point: TPoint): TPointF; overload;

    function Subtract(const Point: TPointF): TPointF; overload;
    function Subtract(const Point: TPoint): TPointF; overload;
    function IsZero: Boolean;

    function Ceiling: TPoint;
    function Truncate: TPoint;
    function Round: TPoint;
  end;
  
  TPolygon = array of TPointF;

 

貌似 Canvas 没有 FillPolygon 方法,只看到有 FillRect 方法、Polygon 方法。

追问

XE7有这个过程的,在FMX.Graphics里面。
procedure TCanvas.FillPolygon(const Points: TPolygon; const AOpacity: Single);
就是不知道怎么操作,我想改一个无标题的窗口边框,改成一个有色的边框线。

追答

示例代码如下:

procedure TForm1.RadioButton15Click(Sender: TObject);
var
  p1, p2, p3, p4, p5: TPointF;
  MyPolygon: TPolygon;
begin
  // sets the points that define the polygon
  p1.Create(210, 220);
  p2.Create(330, 360);
  p3.Create(380, 260);
  p4.Create(200, 180);
  p5.Create(140, 160);
  // creates the polygon
  SetLength(MyPolygon, 5);
  MyPolygon[0] := p1;
  MyPolygon[1] := p2;
  MyPolygon[2] := p3;
  MyPolygon[3] := p4;
  MyPolygon[4] := p5;
  // Fills and draws the polygon on the canvas
  Image1.Bitmap.Canvas.FillPolygon(MyPolygon, 50);
  // updates the bitmap
  Image1.Bitmap.BitmapChanged;
end;
参考技术A TPolygon就是一个TPointF的动态数组,记录着一系列的坐标, 主要是绘制多边形的追问

怎么操作呢大神?我是新手,我是想给一个XE的工程主界面进行描边的,这个界面是无标题的那种。

追答

描边用 DrawRect就是行了,

学无止境系列详读《不止代码,职业发展黄金手册》后,提炼总结!骚年们,快学起来吧!

1.前言

以往一直在输出一些技术类型的博客。最近,忙里偷闲,看了一篇名为《不止代码,职业发展黄金手册》的文章。看完之后,有了一些新的启发,并记录了一些个人认为比较有参考意义的结论和观念。

今天在此做一个记录,勉励自己努力前进。也做一个分享,希望看到的朋友们,也能有所收获与成长!


2.总结

从文章中的总结点,因为篇幅内容较多,涉及面也较多。所以总结出来,可能有一点不成体系,但是个人觉得都是很不错的观点。下面一一罗列记录一番:

一、定位自己的价值与制定计划

“系统性”、“全局性”、“综合性”,要有价值链观念

二、提升自我价值,需要实践的计划

1、Do more,Do better,Do exercise

2、有时间多学习一下工作不常用的技术与知识,如垃圾回收,调优,网络编程,关键时候能起到大作用!但建议学一些能跟自己的“价值链”相关联起来的技术,做一个综合性人才。

3、第一阶段:大学毕业 3 到 5 年

● 基础的 Java 知识:你会开始看《Java 编程思想》、《Effective Java》。
● 高质量代码进阶知识:你会开始看《重构:改善既有代码的设计》、《代码大全》、《编程珠玑》。
● 常用的主流框架:比如 SSH 相关的《Spring 实战》、《Spring Boot 实战》、《Hibernate 实战 ( 第 2 版 )》。当然,这些书已经不够了,你会通过 Google、Baidu 大量地浏览在线的资源:Apache 官网、Spring 官网、Hibernate 官网。你会去 StackOverflow 问问题或找答案。
● 系统设计与算法知识:《系统分析与设计方法》、《设计模式》、《需求分析与系统设计》、《面向对象分析与设计》、《UML 用户指南》、《算法导论》
● 其他知识:比如数据库调优、缓存框架、NoSQL 数据库、日志框架等等

这个阶段,我们能协调好的资源其实就是自己,更多的是一个“个人贡献者”。只要把自己管好了,学习计划执行好了,工作高质量做好了就能得到认可。

第二阶段:大学毕业 5 到 10 年
其实,年龄并不是问题的真正原因。真正的原因还是在于自身“竞争力”是否符合这个年龄所应该具备的。到了这个年龄的人,往往已经不是“个人贡献者”了,而是“团队贡献者”。

这个 TL 为了大家输出得有价值,他是不是需要能:
● 能对所负责领域的业务特点、发展趋势、友商竞争分析有很好的洞察?能知道这个业务领域的客户是谁?他们的需求是什么?他们的痛点是什么?所以,这个 TL 应该需要学习《咨询的奥秘》、《探索需求》、《系统化思维导论》。对于技术型的 TL,还应该了解《成为技术领导者:掌握全面解决问题的方法》。
● 服务于特定领域的客户,我们需要能了解我们的客户企业架构、业务知识。要了解清楚规划的产品、服务,什么才是客户所需要的。那么,从理论上,我们是否应该学习一些 TOGAF、NGOSS、ITIL 等业务理论以及业务知识?
● 作为 TL, 是否有必要能将自己对于市场的洞察转换成业务规划,并能向自己的老板(或者投资人)说清楚、讲明白?并争取到老板的同意,包括资金、人力资源等。对于,能否把事情讲明白,我们可能需要学习《金字塔原理》,并能非常清晰、有逻辑性地进行表达与沟通。当然,有些业务发展的事不一定特别有逻辑,是需要摸索、尝试,那么你是否能将一个不确定的领域说服老板并获得支持,我们又需要什么?《博弈论》、《影响力》等。
● 获得老板支持后,就需要开始带着兄弟们干活了。作为带头人,你看我们是否需要能将业务趋势、客户痛点进行业务建模好让团队的 PD、技术都能理解?在做业务进一步深入分析,可能就需要学习《领域驱动设计 : 软件核心复杂性应对之道》、《实现领域驱动设计》、《企业应用架构模式》、《恰如其分的软件架构》等等。
● 做完业务设计后,开始要带着团队做技术方案设计、接口设计以及编码实现等。这个过程,TL 又需要具备软件项目管理的能力。无论是《PMBOK 指南》,还是《敏捷软件开发》、《人月神话》、《程序开发心理学》,相信总归还是会有点帮助的。
● 对于一些有国际化要求的公司,还需要再学习英语吧!
● 嗯,还需要有个好的身体,还需要经常锻炼,学习科学的健身吧(说起来自己脸红)。至少我明白了一个道理,以前我都是跟自己说,等这段时间过了,闲下来去锻炼一下。其实,我发现,越是忙的时候,越需要锻炼身体!
● 另外,在这 10 年内,比较关键的是——你还经历过什么有挑战的业务、技术、产品、平台等方面的成功与失败经验?在这些经历里,你可能会遇到这些困难与挑战:团队磨合的挑战、技术方案上的争执、平台优先 or 业务优先的博弈、低落的团队氛围、个人的低谷等等。这些困难与挑战,你是退缩了?还是有成长?在带团队时,再次面临这些挑战时,这时你是否有解或者有勇气了?

三、理解自己所做的工作价值与误区

1、仔细想想很多时候业务在我们脑海中存留的只是逻辑和流程,我们丢失的是对业务场景的感受,对用户痛点的体会,对业务发展的思考。这些都是与价值紧密相关的部分。我们很自然的用战术的勤快掩盖战略的懒惰!那么这样的后果就是我们把自己限死在流水线的工位上,阉割了自己能够发现业务价值的能力,而过多关注新技术对职场竞争力的价值。这也就是我们面对繁杂技术,而产生技术学习焦虑症的根本原因。

2、或许算法的天性就是顺从与迎合,但人最终想理解这个世界还是需要依靠自身的行动与不同人之间建立联系,这也是一种摆脱流水线限制的有效方式。

四、工作中的问题点

1、恶性循环,结果就是越做越多,越多越错,越错越改,越改越多。
2、记住:不要过早优化,过早优化是万恶之源 ——《UNIX 编程哲学》
3、时刻对线上要有敬畏之心,小心驶的万年船。

五、架构师应该做什么?学习以“架构师”的角度看待处理事务

1、在我看来软件架构就是将人员、技术等资源组织起来以解决业务问题,支撑业务增长的一种活动。可能比较抽象,我想我们可以从架构师的一些具体工作任务来理解,这句话含义:组织业务、组织技术、组织人员、组织全局,对外输出(架构师的首要目标是解决业务问题,推动业务增长)。它贯穿了对人的组织、对技术的组织、对业务的组织,并将这三种组织以解决业务问题这一目标有机的结合在了一起。

2、架构师需要审时度势,仔细衡量正确性、大规模、可用性三者的关系。

3、像架构师一样思考,用价值找寻重心。。像架构师那样全局性思考,把遇到问题进行拆分,把学习到的事物串联起来,努力构成完整的价值链条。

4、微软对架构师有一个分类:企业架构师 EA(Enterprise Architect)、基础结构架 构 师 IA(Infrastructure Architect)、 特 定 技 术 架 构 TSA(Technology-Specific Architect) 和解决方案架构师 SA (Solution Architect)。这个分类是按照架构师专注的领域不同而划分。

六、是否需要重复造轮子

1、软件领域和硬件领域最大的不同就是软件领域没有绝对的工业标准,大家都很尽兴,想怎么玩怎么玩,不像硬件领域,你造一个尺寸与众不同的轮子,其它车都用不上,你的轮子工艺再高,质量再好也是白费!

七、面试招聘的方式

1、其实在招人上有一个对比的标杆,就是你招的人是不是比团队中同一等级中 50% 的同学优秀,如果你觉得没有他们优秀,那不用纠结,这个候选人不要了,团队必须不停加入更好的同学,才能变得更加强大。

2、不要在面试中试图证明别人不如自己,毫 无意义,人无完人,总有覆盖不到的地方,按照这个规则招聘,会错过很多优秀的 人才。

3、尽量让应试者自己 陈述,然后以学习和交流的心态针对陈述中存疑的地方再进行发问,会更容易让应试 者放松,也更容易让应试者更全面的表达自己。

八、学习到的“新”概念

1、什么是工程效率?

大多数普通人都是看点知识,然后结合实践来强化理论,要经过反反复复才能比较好地掌握一个知识,这就是工程效率。

     什么是知识效率?

有些人纯看理论就能掌握好一门技能,还能举一反三,这就是知识效率。
2、通用知识:不是说对所有人通用,而是说在一个专业领域去到哪个公司都能通用;另外一种是跟业务公司绑定的特定知识


3.最后

另外,这篇文章《不止代码,职业发展黄金手册》中还有提到很多大佬推荐的书籍,有兴趣的可以尝试看一看。后续我也可能会一一尝试阅读一番!

学无止境,The more you know, the more you don't know!

以上是关于Delphi XE 系列的 TPolygon类型详解的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE2 64bit:记录指针,无效类型转换

Delphi XE4 E2010 不兼容的类型:“Cardinal”和“Pointer”

Delphi XE7中使用JSON

将变体转换为双精度时出错 [ Delphi XE + IBObjects 4.9.12 ]

delphi2009(10,xe)下indy10发送utf8字符串

Delphi XE8如何同Eclipse使用相同的Android SDK?