一个关于指针+记录数据类型的使用技巧
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ComObj, ExtCtrls, StdCtrls;
acLine = 19;//直线
acCircle = 8 ;//园
acCreateLine= 36;//构造线
acManayLine = 24;//多线段,矩形
acCircleLine = 4 ;//圆弧
type
ZPoint=Record
x,y:Double;
end;
PZLine=^ZLine;
ZLine=Record
sp,ep:ZPoint;
Next:PZLine;
end;
TForm1 = class(TForm)
btnOpen: TButton;
btnSend: TButton;
btnGet: TButton;
PaintBox1: TPaintBox;
DrowCircle: TButton;
DrowLine: TButton;
procedure DrowLineClick(Sender: TObject);
procedure DrowCircleClick(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure btnGetClick(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure btnOpenClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
pData: PZLine;
public
{ Public declarations }
procedure FreeData;
end;
Form1: TForm1;
var
AcadApp: OleVariant;
AcadDoc: OleVariant;
AcadMoSpace: OleVariant;
AcadObj: OleVariant;
AcadPt: Variant;
i: integer;
EntiType: Integer;
pTmp: PZLine;
begin
//得到所需的AutoCad对象
AcadApp := GetActiveOleObject('AutoCad.Application');
AcadDoc := AcadApp.ActiveDocument;
AcadMoSpace := AcadDoc.ModelSpace;
//释放以前存放的数据
FreeData;
//遍历模型空间中的每一个实体对象
for i := 0 to AcadMoSpace.Count-1 do
begin
//引用第i个实体对象
AcadObj := AcadMoSpace.Item(i);
//提取实体类型
EntiType := AcadObj.EntityType;
//判断是不是直线
if EntiType = acLine then
begin
//如果是直线,则提取相应的起点终点数据
new(pTmp);
AcadPt := AcadObj.StartPoint;
pTmp^.sp.x := AcadPt[0];
pTmp^.sp.y := AcadPt[1];
AcadPt := AcadObj.EndPoint;
pTmp^.ep.x := AcadPt[0];
pTmp^.ep.y := AcadPt[1];
pTmp^.next := pData;
pData := pTmp;
end;
end;
//刷新用于显示结果的PaintBox
PaintBox1.Invalidate;
end;
var
AcadApp : OleVariant;
begin
try
AcadApp:=GetActiveOleObject('AutoCAD.Application');
except
try
AcadApp:=CreateOleObject('AutoCAD.Application');
except
ShowMessage('你没有安装AutoCAD!请先安装');
end;
end;
AcadApp.Visible:=False;
end;
var
AcadApp: OleVariant;
AcadDoc: OleVariant;
AcadMoSpace: OleVariant;
sp,ep: Variant;
pTmp: PZLine;
begin
//得到已启动的AutoCad Application对象
AcadApp := GetActiveOleObject('AutoCad.Application');
//得到AutoCad Document对象
AcadDoc := AcadApp.ActiveDocument;
//得到AutoCad ModelSpace对象
AcadMoSpace := AcadDoc.ModelSpace;
//遍历数据链表
pTmp := pData;
while pTmp <> nil do
begin
//创建包含数组的Variant变量sp,用于向AutoCad传递起点数据
sp := VarArrayCreate([0,2],VarDouble);
sp[0] := pTmp^.sp.x;
sp[1] := pTmp^.sp.y;
sp[2] := 0.0;
//创建包含数组的Variant变量ep,用于向AutoCad传送终点数据
ep := VarArrayCreate([0,2],VarDouble);
ep[0] := pTmp^.ep.x;
ep[1] := pTmp^.ep.y;
ep[2] := 0.0;
//VarArrayRef把包含数组的Variant变量转换成Variant数组,
//使用AutoCad 14.0时要调用此函数,AutoCad 2000不需要
AcadMoSpace.AddLine(VarArrayRef(sp),VarArrayRef(ep));
pTmp := pTmp^.next;
end;
end;
var
AcadApp: OleVariant;
AcadDoc: OleVariant;
AcadMoSpace: OleVariant;
lCenter:Variant;
begin
//得到已启动的AutoCad Application对象
AcadApp := GetActiveOleObject('AutoCad.Application');
//得到AutoCad Document对象
AcadDoc := AcadApp.ActiveDocument;
//得到AutoCad ModelSpace对象
AcadMoSpace := AcadDoc.ModelSpace;
lCenter:=VarArrayCreate([0,2],VarDouble);
lCenter[0]:=10;
lCenter[1]:=20;
lCenter[2]:=0.0;
AcadMoSpace.addcircle(VarArrayRef(lCenter),StrToInt('200'));
AcadApp.Visible:=True;
end;
var
pLine1,pLine2:PZLine;
begin
pData := nil;
New(pData);
New(pLine1);
New(pLine2);
pData.sp.x:=100;
pData.sp.y:=100;
pData.ep.x:=300;
pData.ep.y:=300;
pData.Next:=pLine1;
pLine1.sp.x:=600;
pLine1.ep.y:=260;
pLine1.Next:=pLine2;
pLine2.sp.x:=900;
pLine2.ep.y:=100;
pLine2.Next:=nil;
end;
begin
pData := nil;
end;
begin
FreeData;
end;
var
pTmp: PZLine;
begin
while pData <> nil do
begin
pTmp := pData;
pData := pData^.next;
Dispose(pTmp);
end;
end;
var
MaxX, MaxY: double;
MinX, MinY: double;
pTmp: PZLine;
scale: double;
x,y: integer;
begin
pTmp := pData;
if pTmp = nil then
Exit;
//计算放缩比例
MaxX := pTmp^.sp.x;
MinX := MaxX;
MaxY := pTmp^.sp.y;
MinY := MaxY;
begin
if MaxX < pTmp^.sp.x then MaxX := pTmp^.sp.x;
if MinX > pTmp^.sp.x then MinX := pTmp^.sp.x;
if MaxY < pTmp^.sp.y then MaxY := pTmp^.sp.y;
if MinY > pTmp^.sp.y then MinY := pTmp^.sp.y;
if MaxX < pTmp^.ep.x then MaxX := pTmp^.ep.x;
if MinX > pTmp^.ep.x then MinX := pTmp^.ep.x;
if MaxY < pTmp^.ep.y then MaxY := pTmp^.ep.y;
if MinY > pTmp^.ep.y then MinY := pTmp^.ep.y;
pTmp := pTmp^.next;
end;
if scale > (PaintBox1.Height - 10) / (MaxY-MinY) then
begin
scale := (PaintBox1.Height- 10) / (MaxY-MinY);
end;
//显示提取的数据
pTmp := pData;
while pTmp <> nil do
begin
x := round((pTmp^.sp.x - MinX) * scale) + 5;
y := PaintBox1.Height - (round((pTmp^.sp.y - MinY) * scale) + 5);
PaintBox1.Canvas.MoveTo(x,y);
x := round((pTmp^.ep.x - MinX) * scale) + 5;
y := PaintBox1.Height - (round((pTmp^.ep.y - MinY) * scale) + 5);
PaintBox1.Canvas.LineTo(x,y);
pTmp := pTmp^.next;
end;
end;
转载于:https://blog.51cto.com/bigpower/88784
一个关于指针+记录数据类型的使用技巧相关推荐
- java定义一个指针类型变量赋值吗,C++中指针的数据类型和运算相关知识小结
C++有关指针的数据类型和指针运算的小结 前面已用过一些指针运算(如p++,p+i等),现在把全部的指针运算列出如下. 1) 指针变量加/减 一个整数 例如:p++,p--,p+i,p-i,p+-i, ...
- 共享内存 传一个类指针_C++指针
简介 指针一直是C语言和C++语言最难理解的一部分,无论是C语言和C++语言,复杂的数据结构都是离不开指针的运用,所以必须掌握好指针这个数据类型,你才能够在阅读框架代码时,游刃有余.今天我们从指针的本 ...
- 【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体
参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment ...
- 有关指针的数据类型的小结
有关指针的数据类型的小结 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/23/3846519.html
- C语言:一个涉及指针函数返回值与printf乱码、内存堆栈的经典案例
C语言:一个涉及指针函数返回值与printf乱码.内存堆栈的经典案例 一个奇怪的C语言问题,涉及到指针.数组.堆栈.以及printf.以下实现: 整数向字符串的转换,返回字符串指针,并在main函数中 ...
- C语言 | 编写一个使用指针的c函数,交换数组a和数组b中的对应元素
================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...
- win10电脑黑屏只有鼠标箭头_电脑开机进入系统后显示黑屏,只能看到一个鼠标指针,如何解决?...
使用电脑时可能会遇到各种小问题,当电脑开机后进入系统后显示黑屏,看不到任何图标只有一个鼠标指针的情况,这是资源管理器没有正常加载并运行的原因.我们可以调出任务管理器重新启动下资源管理器,就可以让桌面图 ...
- 一个使用指针的简单程序
一个使用指针的简单程序 /* 一个使用指针的简单程序 */ #include <stdio.h> void main() { int number = 0; //一个出初始化为0的整形变量 ...
- mysql 为了检索从某一个偏移量到记录集的结束所有的记录行_mysql limit 效率分析...
SELECT*FROM table LIMIT [offset,] rows | rows OFFSET offset mysql>SELECT*FROM table LIMIT 5,10; / ...
最新文章
- 可以通过无线充电的软脑植入物来控制大脑中的脑细胞
- 学习笔记Kafka(一)—— Kafka简介
- 在CDS(Core Data Services)中使用DCL(Data Control Language)
- 7-5 求前N天 (30 分)
- 使用rsync和scp远程同步文件
- Scanner类的一个小例子
- Angular Component的DOM级别的单元测试方法
- 5919. 所有子字符串中的元音
- 流畅的Python 1. Python数据模型(特殊方法 __func__())
- php连接mysql并操作系统_PHP 连接并操作MySQL的一个实例
- EAI企业应用集成场景及解决方案
- [UVA-1218] Perfect Service(树的最小支配集)
- 基于矩阵分解的隐因子模型
- oracle rpad()函数
- 教程篇(7.0) 02. FortiGate基础架构 SD-WAN本地分汇 ❀ Fortinet 网络安全专家 NSE 4
- 数学在计算机领域的应用,浅析数学在计算机领域中的重要性
- int.prase和int.tryprase
- tinymce粘贴word图片问题解决
- 【算法】3 由招聘问题看随机算法
- x86-64平台栈帧结构与ARM64栈帧结构对比