pickup word's shapes for Delphi

unit WordApp;

interface

uses

Windows, Messages, Forms, SysUtils, Variants, Classes, Graphics, Controls, StdCtrls,

Dialogs, ExtCtrls,types, OleCtnrs,dbtables,db, OleServer, Word2000, Office2000,

ComCtrls, math;

type

TAutoShape = Record {自动图形结构}

Style:Byte; {属于那种风格,即:矩形,椭圆,三角形}

Top: Smallint;

Left:Smallint;

Height:Smallint;

Width: Smallint;

end;

type

TLine = Record {直线图形结构}

Color: Byte;

Weight: Byte; {线宽}

EndArrowheadStyle: Byte; {后端风格}

BeginPoint: TPoint; {前端坐标}

EndPoint: TPoint; {后端坐标} {注:此处坐标来源于直线的位置和大小,它本身没有这样的属性}

end;

type

FreeForm = Record {任意多边形--曲线}

FillColor:Byte;

LineColor:Byte;

Weight:Word;

Count:Word;

{Left:Word;

Top: Word;

Width:Word;

Height:Word;}

Nodes:array of TPoint; {曲线顶数组 }

end;

type

TextFrame = Record {文本框}

Text: String; { WideString;}

{ Font: String;

Color: TColor; }

FontSize:Byte;

Left: Smallint;

Height:Smallint;

Top: Smallint;

Width:Smallint;

Orientation:Byte; {文本框方向}

end;

type

TextEffect = Record {艺术字}

Text : String;

FontSize : Byte;

// FontName:string;

// Color: TColor;

Left : Smallint;

Height : Smallint;

Top : Smallint;

Width : Smallint;

end;

type

TPic = Record

SourceName : String;

Left : Smallint;

Height : Smallint;

Top : Smallint;

Width : Smallint;

end;

Const

GroupStyleNone = 0;

GroupStyleHLadder = 1;

GroupStyleVLadder = 2;

GroupStyleElevator = 3;

GroupStyleWaterSrc = 4;

GroupStyleNorth = 5;

GroupStyleFireFighting = 10;

type

TGroup = Record

Style : Byte; {组合图形类别: 0: 无; 1: 水平梯子; 2: 垂直梯子; 3: 电梯; 4: 水源; 5 :指北图表; 10+x : 救火点 ,x为救火点的旋转角度}

Left : Smallint;

Height : Smallint;

Top : Smallint;

Width : Smallint;

end;

const

PICKUP_NOREAD = 0;

PICKUP_READING = 1;

PICKUP_READED = 2;

type

PickUpWord = Class(TObject)

WordApplication : OleVariant;

PickUp : Byte; {读取文件状态}

AutoShapeCount : Word; {自由图形数量}

LineCount : Word; {直线数量}

FreeFormCount : Word; {任意多边形数量}

GroupCount : Word; {组数量}

ArtWordCount : Word; {艺术字数量}

PictureCount : Word; {图片数量}

TextBoxCount : Word; {文本框数量}

PageHeight : Word; {页高}

PageWidth : Word; {页宽}

{ DocumentId : OleVariant; {目前操作的word文档}

{ PageId : OleVariant; {当前操作的页数}

PicPath : array[1..15] of Char; {图片文件的路径}

PickUpSts : Array[1..19] of Byte; {1: 不提取 2: 提取,未初始化数组 3: 提取且完成初始化数组}

LineArray : Array of TLine; {直线坐标}

FreeFormArray : Array of FreeForm; {存储任意多边形}

TextFrameArray : Array of TextFrame; {文本框变量}

TextEffectArray : Array of TextEffect; {艺术字变量}

AutoShapeArray : Array of TAutoShape; {自由图形变量}

PictureArray : Array of TPic; {图片变量}

GroupArray : Array of TGroup; {组合图形}

App : TApplication;

private

// DocumentIndex : _Document; {处理目标docment} {加入一个_documents对象,用来控制或者获取当前打开的word document,而不影响其他正在使用的document.}

WordOpened: Boolean;

WordClosed: Boolean;

procedure GetDocumentItem;

procedure SortArray(var Sa:Array of TLine); // 直线按有无末端风格(箭头)排序(降序)

procedure SortArrayFreeForm(var Sa: array of FreeForm); // 曲线按顶点数排序(降序)

public

constructor Create;

destructor Destroy; override;

procedure OpenWord(FileName:String;IsVisible:Boolean=False);

procedure CloseWord(IsSave:Boolean=False);

procedure GetGraphicCount;

procedure GetGraphic;

function GetLine(IntIndex:Word; OleIndex: OleVariant; var LA: Array of TLine):Boolean;

function GetFreeForm(IntIndex:Word; OleIndex: OleVariant; var FFA: array of FreeForm):Boolean; {曲线}

function GetArtWord(IntIndex:Word; OleIndex: OleVariant; var TEA: Array of TextEffect):Boolean;

function GetTextFrame(IntIndex:Word; OleIndex: OleVariant; var TFA: Array of TextFrame):Boolean;

function GetAutoShape(IntIndex:Word; OleIndex: OleVariant; var TAS: Array of TAutoShape):Boolean;

function GetPic(IntIndex:Word; OleIndex: OleVariant; var TPc: Array of TPic): Boolean;

function GetGroup(IntIndex: Word; OleIndex: OleVariant; Var TGp: Array of TGroup): Boolean;

function PointRatation(Src,Center: TPoint; Angle: Single):TPoint;

procedure SaveDataInVtr(FileName:String);

procedure PaintFromVtr(FileName:String;Ca:TCanvas);

procedure PaintLadder(Cn:TCanvas; Left, Top, Height, Width : Integer; HorV: Boolean); {绘制梯子}

procedure PaintElevator(Cn :TCanvas; Left, Top, Height, Width: Integer);

procedure PaintWaterSource(Cnv:TCanvas; Left,Top,Right,Bottom:Word);

procedure PaintFireFighting(Cn: TCanvas; Left, Top, Height, Width, Angle: Integer);

function GetAPointFromLine(BeginP,EndP:Tpoint;L:Integer): Tpoint;

procedure PaintNorth(Cn: TCanvas; Left, Top, Height, Width : integer);

end;

var

Ftxt:File; {用于读写的二进制文件变量}

implementation

uses comobj, VarUtils, WaitFor, PickUpPas, StdConvs;

Const

C_DOTPICKUP = 0;

C_PICKUP_NOTINITARRAY = 2;

C_ALLRGHIT =3;

{ PickUpWord }

procedure PickUpWord.CloseWord(IsSave: Boolean);

var

SaveChanges, OriginalFormat, RouteDocument: OleVariant; { close word var }

begin

WordClosed := False;

SaveChanges := WdDoNotSaveChanges;

OriginalFormat := UnAssigned;

RouteDocument := UnAssigned;

Try

WordApplication.ActiveDocument.Close(SaveChanges,OriginalFormat,RouteDocument);

PickUp := PICKUP_NOREAD;

except

on E: Exception do

begin

ShowMessage(E.Message + #13#10 + '激活文档已经关闭或者不存在!');

end;

end;

WordClosed := True;

end;

constructor PickUpWord.Create;

begin { Create PickUpWord }

Inherited;

WordApplication := CreateOleObject('Word.Application');

PickUp :=0;

AutoShapeCount :=0;

LineCount :=0;

FreeFormCount :=0;

GroupCount :=0;

ArtWordCount :=0;

PictureCount :=0;

TextBoxCount :=0;

end;

destructor PickUpWord.Destroy;

begin { Destroy PickUpWord }

WordApplication.Quit(0);

LineArray := nil;

FreeFormArray := nil;

TextFrameArray := nil;

PictureArray := nil;

AutoShapeArray := nil;

TextEffectArray := nil;

inherited Destroy;

end;

function PickUpWord.GetAPointFromLine(BeginP, EndP: Tpoint; { 在一条线段上获得一点,距离线段末端 L 象素}

L: Integer): Tpoint;

var

Li:Integer;

begin

Li := Round(sqrt(sqr(BeginP.X - EndP.x) + Sqr(BeginP.Y - EndP.Y)));

Result.X := EndP.X - Round((EndP.X - BeginP.X) * L / Li);

Result.Y := EndP.Y - Round((EndP.Y - BeginP.Y) * L / Li);

end;

function PickUpWord.GetArtWord(IntIndex:Word;OleIndex: OleVariant; var TEA: Array of TextEffect): Boolean;

begin

try

TEA[IntIndex-1].Text := WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextEffect.Text; {

TEA[IntIndex-1].FontName := WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextEffect.FontName;

TEA[IntIndex-1].Color := Tcolor(WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextEffect.); }

TEA[IntIndex-1].FontSize := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextEffect.FontSize);

TEA[IntIndex-1].Left := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Left * Screen.PixelsPerInch * 10 / (254 * 2.835));

TEA[IntIndex-1].Top := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Top * Screen.PixelsPerInch * 10 / (254 * 2.835));

TEA[IntIndex-1].Width := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Width * Screen.PixelsPerInch * 10 / (254 * 2.835));

TEA[IntIndex-1].Height := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Height * Screen.PixelsPerInch * 10 / (254 * 2.835));

except

Result:= False;

end;

Result:=True;

end;

function PickUpWord.GetAutoShape(IntIndex: Word; OleIndex: OleVariant; var TAS: Array of TAutoShape): Boolean;

var

Angle: Single;

Tmp:TPoint;

x1,y1,x2,y2:Integer;

begin

TAS[IntIndex-1].Style := WordApplication.ActiveDocument.Shapes.Item(OleIndex).AutoShapeType;

TAS[IntIndex-1].Top := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Top * Screen.PixelsPerInch * 10 / (254*2.835));

TAS[IntIndex-1].Left := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Left * Screen.PixelsPerInch * 10 / (254*2.835));

TAS[IntIndex-1].Height := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Height * Screen.PixelsPerInch * 10 / (254*2.835));

TAS[IntIndex-1].Width := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Width * Screen.PixelsPerInch * 10 / (254*2.835));

Angle := WordApplication.ActiveDocument.Shapes.Item(OleIndex).Rotation;

Tmp.X := (TAS[IntIndex-1].Left+TAS[IntIndex-1].Width) div 2;

Tmp.Y := (TAS[IntIndex-1].Top+TAS[IntIndex-1].Height) div 2;

x1 := TAS[IntIndex-1].Left;

y1 := TAS[IntIndex-1].Top;

x2 := x1 + TAS[IntIndex-1].Width;

y2 := y1 + TAS[IntIndex-1].Height;

TAS[IntIndex-1].Left := PointRatation(point(x1,y1),Tmp,Angle).X;

TAS[IntIndex-1].Top := PointRatation(point(x1,y1),Tmp,Angle).y;

TAS[IntIndex-1].Width := PointRatation(point(x2,y2),Tmp,Angle).X-TAS[IntIndex-1].Left;

TAS[IntIndex-1].Height := PointRatation(point(x2,y2),Tmp,Angle).Y-TAS[IntIndex-1].Top;

Result:=True;

end;

procedure PickUpWord.GetDocumentItem;

begin

//DocumentId:=WordApplication.ActiveDocument;

end;

function PickUpWord.GetFreeForm(IntIndex:Word;OleIndex: OleVariant; var FFA: array of FreeForm): Boolean;

var

j:word;

OleIndex2:OleVariant;

WordApp, Nodes, Points: OleVariant;

begin

Result:=True;

try

try

WordApp := GetActiveOleObject('Word.Application');

except

WordApp := CreateOleObject('Word.Application');

ShowMessage('无法获得激活的word文件!');

end;

FFA[IntIndex-1].FillColor := WordApp.ActiveDocument.Shapes.Item(OleIndex).Fill.ForeColor.RGB;

FFA[IntIndex-1].LineColor := WordApp.ActiveDocument.Shapes.Item(OleIndex).Line.ForeColor.RGB; {

FFA[IntIndex-1].Left := Round(WordApp.ActiveDocument.Shapes.Item(OleIndex).Left * Screen.PixelsPerInch * 10 / (254*2.835));

FFA[IntIndex-1].Top := Round(WordApp.ActiveDocument.Shapes.Item(OleIndex).Top * Screen.PixelsPerInch * 10 / (254*2.835));

FFA[IntIndex-1].Height := Round(WordApp.ActiveDocument.Shapes.Item(OleIndex).Height * Screen.PixelsPerInch * 10 / (254*2.835));

FFA[IntIndex-1].Width := Round(WordApp.ActiveDocument.Shapes.Item(OleIndex).Width * Screen.PixelsPerInch * 10 / (254*2.835)); }

FFA[IntIndex-1].Weight := WordApp.ActiveDocument.Shapes.Item(OleIndex).Line.Weight;

FFA[IntIndex-1].Count := WordApp.ActiveDocument.Shapes.Item(OleIndex).Nodes.Count;

SetLength(FFA[IntIndex-1].Nodes,FFA[IntIndex-1].Count); {确定一条曲线有几个节点}

for j := 1 to WordApp.ActiveDocument.Shapes.Item(OleIndex).Nodes.Count do

begin

OleIndex2 := j;

Nodes := WordApp.ActiveDocument.Shapes.Item(OleIndex).Nodes;

Points := Nodes.Item(OleIndex2).Points;

FFA[IntIndex-1].Nodes[j-1].X := Round(Points[1,1] * Screen.PixelsPerInch * 10 / (254*2.835));

FFA[IntIndex-1].Nodes[j-1].Y := Round(Points[1,2] * Screen.PixelsPerInch * 10 / (254*2.835));

end;

finally

//

end;

end;

procedure PickUpWord.GetGraphic;

var

i : integer;

Ff, ln, pc, te, tb, au, Gp: Word;

Index : OleVariant;

begin

Ff := 0;

ln := 0;

pc := 0;

te := 0;

tb := 0;

au := 0;

Gp := 0;

PageHeight := WordApplication.ActiveDocument.PageSetup.PageHeight;

PageWidth := WordApplication.ActiveDocument.PageSetup.PageWidth;

Frm_WaitFor.Pb_Pickup.Max:=WordApplication.ActiveDocument.Shapes.Count;

for i := 1 to WordApplication.ActiveDocument.Shapes.Count do

begin

App.ProcessMessages;

Index := i;

Frm_WaitFor.Pb_Pickup.Position := i;

Frm_WaitFor.Lb_Shape.Caption := '正在提取图形:' + String(WordApplication.ActiveDocument.Shapes.Item(Index).Name);

if PickUpSts[Integer(WordApplication.ActiveDocument.Shapes.Item(Index).type)] = C_DOTPICKUP then Continue; {不提取}

try

case WordApplication.ActiveDocument.Shapes.Item(Index).type of

1 : {msoAutoShape}

begin

if PickUpSts[1] = C_PICKUP_NOTINITARRAY then

begin

SetLength(AutoShapeArray,AutoShapeCount);

PickUpSts[1] := C_ALLRGHIT;

end;

Inc(au);

GetAutoShape(au, Index, AutoShapeArray);

end;

5 : {msoFreeform}

begin

if PickUpSts[5] = C_PICKUP_NOTINITARRAY then

begin

SetLength(FreeFormArray,FreeFormCount);

PickUpSts[5] := C_ALLRGHIT;

end;

Inc(Ff);

GetFreeForm(Ff, Index, FreeFormArray);

end;

6 : {msoGroup}

begin

if PickUpSts[6] = C_PICKUP_NOTINITARRAY then

begin

SetLength(GroupArray, GroupCount);

PickUpSts[6] := C_ALLRGHIT;

end;

Inc(Gp);

GetGroup(Gp, Index, GroupArray);

end;

9 : {msoLine}

begin

if PickUpSts[9] = C_PICKUP_NOTINITARRAY then

begin

SetLength(LineArray, LineCount);

PickUpSts[9] := C_ALLRGHIT;

end;

inc(ln);

GetLine(ln,Index, LineArray);

end;

13 : {msoPicture}

begin

if PickUpSts[13] = C_PICKUP_NOTINITARRAY then

begin

SetLength(PictureArray, PictureCount);

PickUpSts[13] := C_ALLRGHIT;

end;

inc(pc);

GetPic(pc,Index, PictureArray);

end;

15 : {ArtWord} {msoTextEffect}

begin

if PickUpSts[15] = C_PICKUP_NOTINITARRAY then

begin

SetLength(TextEffectArray, ArtWordCount);

PickUpSts[15] := C_ALLRGHIT;

end;

Inc(te);

GetArtWord(te, Index, TextEffectArray);

end;

17 : {msoTextBox}

begin

if PickUpSts[17] = C_PICKUP_NOTINITARRAY then

begin

SetLength(TextFrameArray, TextBoxCount);

PickUpSts[17] := C_ALLRGHIT;

end;

Inc(tb);

GetTextFrame(tb, Index, TextFrameArray);

end

else ;

end;

except

on e:exception do

begin

ShowMessage(e.Message+#13#10+VarToStr(WordApplication.ActiveDocument.Shapes.item(index).name));

end;

end;

end;

PickUp:=PICKUP_READED;

end;

procedure PickUpWord.GetGraphicCount;

var

i : word;

OleIndex : OleVariant;

GroupTag : boolean;

begin

if not WordOpened then exit;

AutoShapeCount := 0;

FreeFormCount := 0;

LineCount := 0;

PictureCount := 0;

GroupCount := 0;

TextBoxCount := 0;

ArtWordCount := 0;

AutoShapeArray := nil;

FreeFormArray := nil;

LineArray := nil;

GroupArray := nil;

PictureArray := nil;

TextFrameArray := nil;

TextEffectArray := nil;

// GroupTag:=false;

PickUp:=PICKUP_READING;

App := TApplication.Create(nil);

{ while not GroupTag do { 取消所有组合.

begin

GroupTag:=True;

for i:=1 to WordApplication.ActiveDocument.Shapes.Count do

begin

OleIndex:=i;

if Integer(WordApplication.ActiveDocument.Shapes.Item(OleIndex).type) =6 then

begin

GroupTag:=false;

WordApplication.ActiveDocument.Shapes.Item(OleIndex).Ungroup;

end;

end;

end; }

for i := 1 to WordApplication.ActiveDocument.Shapes.Count do

begin

OleIndex := i;

App.ProcessMessages;

case Integer(WordApplication.ActiveDocument.Shapes.Item(OleIndex).type) of

1: Inc(AutoShapeCount);

5: Inc(FreeFormCount);

6: Inc(GroupCount);

9: Inc(LineCount);

13: Inc(PictureCount);

15: Inc(ArtWordCount);

17: Inc(TextBoxCount)

else ;

end;

end;

end;

function PickUpWord.GetGroup(IntIndex: Word; OleIndex: OleVariant;

var TGp: array of TGroup): Boolean;

var

TmpInt: Byte;

TmpOleVar,GroupItemOle: OleVariant;

Angle : integer;

TmpH, TmpW : Single;

IsElevator : Boolean;

begin

Result := True;

IsElevator := False;

try

TGp[IntIndex-1].Left := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Left * Screen.PixelsPerInch * 10 / (254*2.835));

TGp[IntIndex-1].Top := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Top * Screen.PixelsPerInch * 10 / (254*2.835));

TGp[IntIndex-1].Height := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Height * Screen.PixelsPerInch * 10 / (254*2.835));

TGp[IntIndex-1].Width := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Width * Screen.PixelsPerInch * 10 / (254*2.835));

case WordApplication.ActiveDocument.Shapes.Item(OleIndex).GroupItems.Count of

2: {指北图表,水源,梯子}

begin

for TmpInt := 1 to 2 do

begin

TmpOleVar := TmpInt; {artw,group} {freef,group} {autoshap,group}

case WordApplication.ActiveDocument.Shapes.Item(OleIndex).GroupItems.Item(TmpOleVar).Type of

1:

begin

Angle := WordApplication.ActiveDocument.Shapes.Item(OleIndex).GroupItems.Item(TmpOleVar).Rotation;

if Abs(Sin(Angle * Pi/180)) = 1 then {根据梯子中间的矩形框的宽高值判断它的方向}

TGp[IntIndex-1].Style := GroupStyleHLadder

else TGp[IntIndex-1].Style := GroupStyleVLadder;

end;

5:

begin

TGp[IntIndex-1].Style := GroupStyleWaterSrc;

end;

15:

begin

TGp[IntIndex-1].Style := GroupStyleNorth;

end

else ;

end;

end;

end;

3: {救火点, 电梯}

begin

for TmpInt := 1 to 3 do {组合元素中包括矩形的为电梯,否则为救火点}

begin

TmpOleVar := TmpInt;

if WordApplication.ActiveDocument.Shapes.Item(OleIndex).GroupItems.Item(TmpOleVar).Type = 1 then

IsElevator := True;

end;

if IsElevator then

TGp[IntIndex-1].Style := GroupStyleElevator

else TGp[IntIndex-1].Style := GroupStyleFireFighting + WordApplication.ActiveDocument.Shapes.Item(OleIndex).GroupItems.Rotation;

end

else ;

end;

except

end;

end;

function PickUpWord.GetLine(IntIndex:Word;OleIndex: OleVariant; var LA: Array of TLine): boolean;

const

pin=Pi/180;

var

TmpPoint:TPoint;

Angle:Double; {旋转角度}

p1,p2: TPoint;

begin

try

LA[IntIndex-1].Weight:=Byte(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Line.Weight);

LA[IntIndex-1].EndArrowheadStyle:=Byte(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Line.EndArrowheadStyle);

LA[IntIndex-1].Color:=WordApplication.ActiveDocument.Shapes.Item(OLeIndex).Line.ForeColor.RGB;

if WordApplication.ActiveDocument.Shapes.Item(OleIndex).HorizontalFlip=0 then

begin

LA[IntIndex-1].BeginPoint.X := (Round(WordApplication.ActiveDocument.Shapes.item(OleIndex).

Left* Screen.PixelsPerInch * 10 / (254*2.835)));

LA[IntIndex-1].EndPoint.X := (Round((WordApplication.ActiveDocument.Shapes.item(OleIndex).

left+WordApplication.ActiveDocument.Shapes.item(OleIndex).Width)* Screen.PixelsPerInch * 10 /(254*2.835)));

end

else begin

LA[IntIndex-1].EndPoint.X := (Round(WordApplication.ActiveDocument.Shapes.item(OleIndex).Left* Screen.PixelsPerInch * 10 / (254*2.835)));

LA[IntIndex-1].BeginPoint.X := (Round((WordApplication.ActiveDocument.Shapes.item(OleIndex).left+WordApplication.ActiveDocument.Shapes.item(OleIndex).Width)* Screen.PixelsPerInch * 10 /(254*2.835)));

end;

if WordApplication.ActiveDocument.Shapes.Item(OleIndex).VerticalFlip=0 then

begin

LA[IntIndex-1].BeginPoint.Y := (Round(WordApplication.ActiveDocument.Shapes.item(OleIndex).Top* Screen.PixelsPerInch * 10 / (254*2.835)));

LA[IntIndex-1].EndPoint.Y := (Round((WordApplication.ActiveDocument.Shapes.item(OleIndex).Top+

WordApplication.ActiveDocument.Shapes.item(OleIndex).Height)* Screen.PixelsPerInch * 10 /(254*2.835)));

end

else begin

LA[IntIndex-1].EndPoint.Y := (Round(WordApplication.ActiveDocument.Shapes.item(OleIndex).Top* Screen.PixelsPerInch * 10 / (254*2.835)));

LA[IntIndex-1].BeginPoint.Y := (Round((WordApplication.ActiveDocument.Shapes.item(OleIndex).Top+

WordApplication.ActiveDocument.Shapes.item(OleIndex).Height)* Screen.PixelsPerInch * 10 /(254*2.835)));

end;

{处理旋转问题}

TmpPoint.X:=(LA[IntIndex-1].BeginPoint.X+LA[IntIndex-1].EndPoint.X) div 2;

TmpPoint.Y:=(LA[IntIndex-1].BeginPoint.Y+LA[IntIndex-1].EndPoint.Y) div 2;

Angle:=WordApplication.ActiveDocument.Shapes.Item(OleIndex).Rotation;

p1:=LA[IntIndex-1].BeginPoint;

p2:=LA[IntIndex-1].EndPoint;

LA[IntIndex-1].BeginPoint:=PointRatation(p1,TmpPoint,Angle);

LA[IntIndex-1].EndPoint:=PointRatation(p2,TmpPoint,Angle);

except

on E: Exception do

begin

Result:=False;

ShowMessage(E.Message+#13#10+' 报错图形:'+WordApplication.ActiveDocument.Shapes.item(OleIndex).Name);

// WordApplication.Disconnect;

end;

end;

Result:=True;

end;

function PickUpWord.GetPic(IntIndex: Word; OleIndex: OleVariant;

var TPc: array of TPic): Boolean;

begin

TPc[IntIndex-1].SourceName := Copy(Trim(WordApplication.ActiveDocument.Fields.Item(intIndex).LinkFormat.SourceName),1,

Length(Trim(WordApplication.ActiveDocument.Fields.Item(intIndex).LinkFormat.SourceName))-3)+'jpg';

TPc[IntIndex-1].Left := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Left* Screen.PixelsPerInch * 10 / (254*2.835)) ;

TPc[IntIndex-1].Top := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Top* Screen.PixelsPerInch * 10 / (254*2.835)) ;

TPc[IntIndex-1].Height := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Height* Screen.PixelsPerInch * 10 / (254*2.835)) ;

TPc[IntIndex-1].Width := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Width* Screen.PixelsPerInch * 10 / (254*2.835)) ;

Result := true;

end;

function PickUpWord.GetTextFrame(IntIndex: Word; OleIndex: OleVariant; var TFA: Array of TextFrame): Boolean;

var

b:Byte;

begin

TFA[IntIndex-1].Text:= Trim(WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextFrame.TextRange.Text);

try

b:=StrToInt(Copy(TFA[IntIndex-1].Text,1,2));

TFA[IntIndex-1].Text:=IntToStr(b);

except

;

end;

TFA[IntIndex-1].Orientation := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextFrame.Orientation); {

TFA[IntIndex-1].Font := WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextFrame.TextRange.Font.Name;}

TFA[IntIndex-1].FontSize := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).TextFrame.TextRange.Font.Size);

TFA[IntIndex-1].Left := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Left* Screen.PixelsPerInch * 10 / (254*2.835));

TFA[IntIndex-1].Top := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Top* Screen.PixelsPerInch * 10 / (254*2.835));

TFA[IntIndex-1].Width := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Width* Screen.PixelsPerInch * 10 / (254*2.835));

TFA[IntIndex-1].Height := Round(WordApplication.ActiveDocument.Shapes.Item(OleIndex).Height* Screen.PixelsPerInch * 10 / (254*2.835));

Result:= True;

end;

procedure PickUpWord.OpenWord(FileName: String; IsVisible: Boolean);

var

TempDoc,NewTempDoc,TempWord,TempEmpty:OleVariant;

begin

WordOpened:=False;

try

TempEmpty := EmptyParam;

TempDoc := EmptyParam;

NewTempDoc := True;

TempWord := FileName;

WordApplication.Visible := IsVisible;

WordApplication.Documents.Open(TempWord,TempEmpty,NewTempDoc,NewTempDoc,TempEmpty,TempEmpty,TempEmpty,TempEmpty,TempEmpty,TempEmpty,TempEmpty,TempEmpty);

PickUp:=PICKUP_NOREAD;

// SetLength(PicPath,15);

PicPath:='D:\word\SubPic\';

except

ShowMessage('打开word文档错误!'+#13#10+'请检查您是否安装了word,或者您开启了防火墙。');

Raise;

end;

WordOpened:=True;

end;

procedure PickUpWord.PaintElevator(Cn: TCanvas; Left, Top, Height,

Width: Integer);

begin

Cn.Rectangle(Left, Top, Left + Width, Top + Height);

Cn.MoveTo(Left, Top);

Cn.LineTo(Left + Width, Top + Height);

Cn.MoveTo(Left, Top + Height);

Cn.LineTo(Left + Width, Top);

end;

procedure PickUpWord.PaintFireFighting(Cn: TCanvas; Left, Top, Height,

Width, Angle: Integer);

var

BeginP, EndP, Tmp, Tmpc, Tmps, Tmp_s:TPoint;

begin

BeginP.X := Left + Width Div 2;

BeginP.Y := Top + Height;

EndP.X := Left + Width Div 2;

EndP.Y := Top;

with Cn do

begin

Tmpc.X := (BeginP.X + EndP.Y) div 2;

TmpC.Y := (BeginP.Y + EndP.Y) div 2;

Tmps := PointRatation(BeginP,Tmpc,Angle);

BeginP := Tmps;

Tmps := PointRatation(Endp,Tmpc,Angle);

Endp := Tmps;

Tmp := GetAPointFromLine(BeginP, EndP, Round(0.28 * Height));

Tmpc := EndP;

Tmps := PointRatation(tmp, tmpc, Angle);

Tmp_s := PointRatation(tmp, tmpc, 360 - Angle); //45 为 箭头和线之间的角度

MoveTo(BeginP.X, BeginP.Y);

LineTo(EndP.X, EndP.Y);

moveto(tmp.X, tmP.Y);

Lineto(tmps.x, tmps.y);

moveto(tmP.X, tmP.Y);

Lineto(tmp_s.x, tmp_s.Y);

end;

end;

procedure PickUpWord.PaintFromVtr(FileName: String; Ca: TCanvas);

var

f : File;

i, j, CurrPos, Step, ReadSize, FileL : Integer;

s : String;

ShapeType, DataL, DataLin, Wd1, Wd2, Wd3, Wd4: Word;

D1, D2, D3, D4 : Smallint;

Data, Data1, Data2 ,Data3, Data4: Byte;

c : array[1..127] of Char;

begin

AssignFile(F, FileName); { 变量类型保持和写入文件时使用同样的类型.}

Try

Reset(F,1);

Seek(F,0);

except

ShowMessage('文件打开错误,请重试!');

Exit;

end;

Seek(f, 4);

BlockRead(F, FileL, 4, ReadSize); {Read File Length and set var FileL}

Seek(f, 12);

CurrPos := 12; {shape data start}

Ca.Pen.Color := clBlack;

Ca.Pen.Width := 1;

Ca.Brush.Color := clNone;

while CurrPos < FileL do

begin

BlockRead(F, ShapeType, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

case ShapeType of

$FF01: {65281}

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos); { autoshape图形数据开始处}

j := 1;

While j < DataL do

begin

BlockRead(F,Data,1,ReadSize);

Inc(CurrPos,1);

Seek(F,CurrPos);

BlockRead(F,D1,2,ReadSize);

Inc(CurrPos,2);

Seek(F,CurrPos);

BlockRead(F,D2,2,ReadSize);

Inc(CurrPos,2);

Seek(F,CurrPos);

BlockRead(F,D3,2,ReadSize);

Inc(CurrPos,2);

Seek(F,CurrPos);

BlockRead(F,D4,2,ReadSize);

Inc(CurrPos,2);

Seek(F,CurrPos);

if Data = 1 then

Ca.Rectangle(D1, D2, D1 + D4, D2 + D3)

else Ca.Ellipse(D1, D2, D1 + D4, D2 + D3);

Inc(j,9);

end;

end;

$FF05:

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos); { FreeForm图形数据开始处}

j := 1;

while j < DataL do

begin

BlockRead(F, DataLin, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, Data2, 1, ReadSize);

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, Data3, 1, ReadSize);

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, Data4, 1, ReadSize);

Inc(CurrPos, 1);

Seek(F, CurrPos);

Ca.Pen.Color := Data2;

Ca.Brush.Color := Data3;

Ca.Pen.Width := Data4;

Step := 5;

BlockRead(F, D1, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D2, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.MoveTo(D1, D2);

while Step < DataLin do

begin

BlockRead(F, D1, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D2, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.LineTo(D1, D2);

Inc(Step, 4);

end;

Inc(j, DataLin + 5);

end;

end;

$FF55:

begin // FreeForm图形顶点数小于70的数据开始处

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

j := 1;

while j < DataL do

begin

BlockRead(F, Wd1, 2, ReadSize); {Left}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, Wd2, 2, ReadSize); {Top}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, Wd3, 2, ReadSize); {Height}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, Wd4, 2, ReadSize); {width}

Inc(CurrPos, 2);

Seek(F, CurrPos);

PickUpForm.PaintWaterSource(Ca, Wd1, Wd2, Wd3, Wd4);

Inc(j, 8);

end;

end;

$FF06:

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

j := 1;

Ca.Pen.Width := 1;

While j < DataL do

begin

BlockRead(F, Data, 1, ReadSize);

Inc(CurrPos, 1);

Seek(F,CurrPos);

BlockRead(F, D1, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F,CurrPos);

BlockRead(F, D2, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F,CurrPos);

BlockRead(F, D3, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F,CurrPos);

BlockRead(F, D4, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F,CurrPos);

case Data of

0: ;

1:

begin

PaintLadder(Ca, D1, D2, D4, D3, True);

end;

2: PaintLadder(Ca, D1, D2, D3, D4, False);

3: PaintElevator(Ca, D1, D2, D3, D4);

4: PaintWaterSource(Ca, D1, D2, D1 + D4, D2 + D3);

5: PaintNorth(Ca, D1, D2, D3, D4);

else begin

PaintFireFighting(Ca, D1, D2, D3, D4, Data - 10);

end;

end;

Inc(j, 9);

end;

end;

$FF09: {65289}

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.Pen.Width := 1;

j := 1;

while j < DataL do

begin

BlockRead(F, D1, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D2, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D3, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D4, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.MoveTo(D1, D2);

Ca.LineTo(D3, D4);

Inc(j, 8);

end;

end;

$FF99:

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

j := 1;

while j < DataL do

begin

BlockRead(F, Data1, 1, ReadSize); {data1 is weight}

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, Data2, 1, ReadSize); {data2 is color}

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, D1, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D2, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D3, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D4, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.Pen.Width := Data1;

Ca.Pen.Color := TColor(Data2);

PickUpForm.PaintArrowHeadLine(Ca, Point(D1, D2), Point(D3, D4));

Inc(j, 10);

end;

end;

$FF0D: {pic}

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

j := 1;

while j < DataL do

begin

BlockRead(F, D1, 2);

Inc(CurrPos, 2);

Seek(F, CurrPos); {待处理}

BlockRead(F, D2, 2);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D3, 2);

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D4, 2);

Inc(CurrPos, 2);

Seek(F, CurrPos);

Inc(j, 9);

end;

end;

$FF11: {textbox}

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

DataLin := 0;

while DataLin < DataL do

begin

FillChar(C,SizeOf(C),0);

BlockRead(F, Data, 1, ReadSize); {文本长度}

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, C, Data, ReadSize); {取出文本内容}

Inc(CurrPos, Data);

Seek(F, CurrPos);

BlockRead(F, Data1, 1, ReadSize); {取出文本方向}

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, Data2, 1, ReadSize); {取出文本字体}

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, D1, 2, ReadSize); {取出文本left}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D2, 2, ReadSize); {取出文本top}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D3, 2, ReadSize); {取出文本height}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D4, 2, ReadSize); {取出文本width}

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.Brush.Color := clBtnFace;

Ca.Pen.Color := clBlack;

if Data1 = 1 then

Ca.TextOut(D1,D2,c)

else begin

i:=1;

while i < Data do

begin {绘制垂直的文本框}

if byte(c[i])>128 then

begin

Ca.TextOut(D1,D2 + i* (Data2-5),C[i]+C[i+1]);

inc(i);

end;

inc(i);

end;

end;

Inc(DataLin, 11 + Data);

end;

end;

$FF0F: {artword}

begin

BlockRead(F, DataL, 2, ReadSize);

Inc(CurrPos, 2);

Seek(F, CurrPos);

j := 1;

while j < DataL do

begin

FillChar(c,SizeOf(c),0);

BlockRead(F, Data, 1, ReadSize);

Inc(CurrPos, 1);

Seek(F, CurrPos); {}

BlockRead(F, c, Data, ReadSize);

Inc(CurrPos, Data);

Seek(F, CurrPos);

BlockRead(F, Data1, 1, ReadSize);

Inc(CurrPos, 1);

Seek(F, CurrPos);

BlockRead(F, D1, 2, ReadSize); {取出艺术字left}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D2, 2, ReadSize); {取出艺术字top}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D3, 2, ReadSize); {取出艺术字height}

Inc(CurrPos, 2);

Seek(F, CurrPos);

BlockRead(F, D4, 2, ReadSize); {取出艺术字width}

Inc(CurrPos, 2);

Seek(F, CurrPos);

Ca.Brush.Color := clBtnFace;

Ca.Pen.Color := clBlack;

Ca.TextOut(D1, D2, C);

Inc(j,10 + Data);

end;

end;

$FF03: {纯文本部分}

begin

end;

$FFFF: {end}

begin

end

else

Inc(CurrPos,2);

end;

end;

end;

procedure PickUpWord.PaintLadder(Cn: TCanvas; Left, Top, Height,

Width: Integer; HorV: Boolean);

var

i : integer;

begin

if HorV then

With Cn do

begin

MoveTo(Left, Top);

LineTo(Left + Width, Top);

MoveTo(Left, Top + Height);

LineTo(Left + Width, Top + Height); {两条平行线}

for i:= 1 to 9 do

begin

MoveTo(Left + i * Width div 10, Top);

LineTo(Left + i * Width div 10, Top + Height);

end;

Rectangle(Left + Round(Width/12), Top + Round(4 * Height/9), Left + Round(1 - 1/12) * Width, Top + Round(5 * Height/9));

end

else

With Cn do

begin

MoveTo(Left, Top);

LineTo(Left, Top + Height);

MoveTo(Left + Width , Top);

LineTo(Left + Width, Top + Height); {两条平行线}

for i:= 1 to 9 do

begin

MoveTo(Left, Top + i * Height div 10);

LineTo(Left + Width, Top + i * Height div 10);

end;

Rectangle(Left + Round(4 * Width/9), Top + Round(Height/12), Left + Round(5 * Width/9), Top + Round(1 - 1/12) * Height);

end;

end;

procedure PickUpWord.PaintNorth(Cn: TCanvas; Left, Top, Height,

Width: integer);

begin

Cn.Brush.Color := clBtnFace;

Cn.TextOut(Left,Top,'北');

end;

procedure PickUpWord.PaintWaterSource(Cnv: TCanvas; Left, Top, Right,

Bottom: Word);

begin

Cnv.Ellipse(Left, Top, Right, Bottom);

Cnv.Brush.Color:=clred;

Cnv.Pie(Left,Top,Right,Bottom,(Right + Left) div 2,Bottom,(Left + Right) div 2,Top); {扇形部分}

Cnv.Brush.Color := clBtnFace;

end;

function PickUpWord.PointRatation(Src,Center: TPoint; Angle: Single): TPoint;

const

pin=Pi/180;

begin

Result.X:= Round(Center.X+(Src.X-Center.X)*cos(Angle*Pin)-(Src.Y-Center.Y)*Sin(Angle*Pin));

{ x0+(x-x0)cos@-(y-y0)sin@ }

Result.Y:= Round(Center.Y+(Src.X-Center.X)*Sin(Angle*Pin)+(Src.Y-Center.Y)*Cos(Angle*Pin));

{ y0+(x-x0)sin(θ)+(y-y0)cos(θ)}

end;

procedure PickUpWord.SaveDataInVtr(FileName: String);

var

s : array[1..4] of Char;

C : array[1..127] of Char;

i,j,frfm,tb,at,tt:Smallint;

AllLength:Integer;

ShapeType,ShapeL, LineNormalL,FreeFormNormalL, FreeFormNormCount, LineNormCount,PicSrcNameL, GroupDL:Word;

TextL,F_L:Byte;

begin

AssignFile(Ftxt,FileName);

try

Reset(Ftxt,1);

except

On EInOutError do

begin

try

if FileExists(FileName) = False then

ReWrite(Ftxt, 1)

else

MessageDlg('文件不能打开', mtWarning, [mbOK], 0);

except

On EInOutError do

MessageDlg('文件不能创建', mtWarning, [mbOK], 0);

end;

end;

end;

{open file}

try

s:='vtr ';

BlockWrite(Ftxt, s, 4); {文件头(4字节)}

except

on e:Exception do

ShowMessage('写入异常:'+#10#13+e.Message);

end;

frfm := 0;

tb := 0;

at := 0;

{ ****** 获得所有数据的长度 ******** }

AllLength := 14; // 文件头和尾的长度. 详见设计文档<矢量图形开发综述文档>

if AutoShapeArray <> nil then

AllLength := AllLength + AutoShapeCount * 9 + 4;

///

if FreeFormArray <> nil then

begin

SortArrayFreeForm(FreeFormArray); // 按图形定点数升序排序

for i := Low(FreeFormArray) to High(FreeFormArray) do // 处理顶点数小于70的多边形,

frfm := frfm + FreeFormArray[i].Count;

FreeFormNormCount := FreeFormCount;

AllLength:=AllLength + 4 * (frfm + 1) + 5 * FreeFormNormCount;

end;

///

if GroupArray <> nil then {组合图形数据长度}

AllLength := AllLength + GroupCount * 9 + 4;

if LineArray <> nil then

begin

SortArray(LineArray);

for i:=Low(LineArray) to High(LineArray) do

if LineArray[i].EndArrowheadStyle = 1 then

LineNormCount := i // 从数组中取出末尾有箭头的直线的开始点.

else break;

Inc(LineNormCount);

LineNormalL:= LineNormCount * 8 + 4;

AllLength := AllLength + LineNormalL;

if LineNormCount <> LineCount then

AllLength:= AllLength + (LineCount-LineNormCount) * 10 + 4;

end;

/////////////////

if PictureArray <> nil then

begin

AllLength:=AllLength + PictureCount * 9 + 5;

AllLength:=AllLength + Length(PicPath);

for i:=Low(PictureArray) to High(PictureArray) do

PicSrcNameL:=PicSrcNameL + Length(PictureArray[i].SourceName);

AllLength := AllLength + PicSrcNameL;

end;

/// pic data length

if TextFrameArray <> nil then

begin

AllLength := AllLength + 4 + 11 * TextBoxCount;

for i:=Low(TextFrameArray) to High(TextFrameArray) do

tb:=tb+Length(TextFrameArray[i].Text);

AllLength := AllLength + tb;

end;

/// text frame data Length

if TextEffectArray <> nil then

begin

AllLength := AllLength + 4 + 10 * ArtWordCount;

for i:=Low(TextEffectArray) to High(TextEffectArray) do

at:=at+Length(TextEffectArray[i].Text);

AllLength := AllLength + at;

end;

// art word data length

{如果涉及到纯文本, 在此处加入获得纯文本长度代码}

/////////////////////////////////////////////////////////////////////////////

try

BlockWrite(Ftxt,AllLength,4); // 文件的总长度; (4字节)

ShowMessage('file Length:'+IntToStr(AllLength));{}

/////////////////////////////////////////////////////////////////////////////////////

s:='0.91'; // 文件版本信息: (4字节)

BlockWrite(Ftxt,s,4);

if AutoShapeArray <> nil then

begin

ShapeType:=$FF01; // 自动图形头标识 (2字节)

BlockWrite(Ftxt,ShapeType, 2);

ShapeL:= AutoShapeCount * 9 ;

BlockWrite(Ftxt,ShapeL, 2); // 自动图形的总数据长度 (2字节)

for i:=Low(AutoShapeArray) to High(AutoShapeArray) do

begin

BlockWrite(Ftxt,AutoShapeArray[i].Style,1); // 自动图形类型 (1字节)

BlockWrite(Ftxt,AutoShapeArray[i].Left,2); // 图形位置以下三行同 (每个都是2字节)

BlockWrite(Ftxt,AutoShapeArray[i].Top,2);

BlockWrite(Ftxt,AutoShapeArray[i].Height,2);

BlockWrite(Ftxt,AutoShapeArray[i].Width,2);

end;

end;

if FreeFormArray<>nil then

begin

ShapeType:= $FF05 ;

BlockWrite(Ftxt,ShapeType, 2); // 任意多边形头标识 (2字节)

FreeFormNormalL:=4*frfm + FreeFormCount * 5;

BlockWrite(Ftxt,FreeFormNormalL, 2); // 任意多边形数据长度 (2字节)

for i:=Low(FreeFormArray) to High(FreeFormArray) do

begin

FreeFormNormalL:=FreeFormArray[i].Count * 4;

BlockWrite(Ftxt,FreeFormNormalL,2); // 任意多边形的每个图形的顶点数据长度 (2字节)

BlockWrite(Ftxt,FreeFormArray[i].LineColor,1); // 任意多边形画笔颜色 (1字节)

BlockWrite(Ftxt,FreeFormArray[i].FillColor,1); // 任意多边形填充颜色 (1字节)

BlockWrite(Ftxt,FreeFormArray[i].Weight,1); // 任意多边形画笔宽度 (1字节)

for j:=Low(FreeFormArray[i].Nodes) to High(FreeFormArray[i].Nodes) do

begin

BlockWrite(Ftxt,Smallint(FreeFormArray[i].Nodes[j].x),2);//任意多边形每个顶点的坐标 (每个2字节)

BlockWrite(Ftxt,Smallint(FreeFormArray[i].Nodes[j].y),2);

end;

end;

end;

if GroupArray <> nil then

begin

ShapeType:= $FF06 ;

BlockWrite(Ftxt,ShapeType, 2); // 线段数据头标识 (2字节)

GroupDL := GroupCount * 9;

BlockWrite(Ftxt,GroupDL, 2);

for i := Low(GroupArray) to High(GroupArray) do

begin

BlockWrite(Ftxt, GroupArray[i].Style, 1);

BlockWrite(Ftxt, GroupArray[i].Left, 2);

BlockWrite(Ftxt, GroupArray[i].Top, 2);

BlockWrite(Ftxt, GroupArray[i].Height, 2);

BlockWrite(Ftxt, GroupArray[i].Width, 2);

end;

end;

if LineArray <> nil then

begin // 按线段的末端风格升序排序

ShapeType:= $FF09 ;

BlockWrite(Ftxt,ShapeType, 2); // 线段数据头标识 (2字节)

LineNormalL := LineNormalL - 4;

BlockWrite(Ftxt,LineNormalL, 2); // 无末端风格的线段数据长度 (2字节)

for i:=Low(LineArray) to LineNormCount-1 do

begin

BlockWrite(Ftxt,Smallint(lineArray[i].BeginPoint.X),2);

BlockWrite(Ftxt,Smallint(lineArray[i].BeginPoint.y),2);

BlockWrite(Ftxt,Smallint(lineArray[i].EndPoint.X),2);

BlockWrite(Ftxt,Smallint(lineArray[i].endPoint.y),2);

end;

if LineNormCount <> LineCount then

begin

ShapeType:= $FF99;

BlockWrite(Ftxt,ShapeType,2); // 有末端风格线段的数据头标识 (2字节)

LineNormalL := (LineCount - LineNormCount)*10;

BlockWrite(Ftxt,LineNormalL,2); // 带末端风格线段数据长度 (2字节)

for i:=LineNormCount to High(LineArray) do

begin

BlockWrite(Ftxt,LineArray[i].Weight,1); // 带末端风格线段画笔宽度 (1字节)

BlockWrite(Ftxt,LineArray[i].Color,1); // 带末端风格线段画笔颜色 (1字节)

BlockWrite(Ftxt,Smallint(lineArray[i].BeginPoint.X),2); // 带末端风格线段坐标 (每个2字节)

BlockWrite(Ftxt,Smallint(lineArray[i].BeginPoint.y),2);

BlockWrite(Ftxt,Smallint(lineArray[i].EndPoint.X),2);

BlockWrite(Ftxt,Smallint(lineArray[i].endPoint.y),2);

end;

end;

end;

/////////////

if PictureArray<> nil then

begin

ShapeType:= $FF0D ;

BlockWrite(Ftxt,ShapeType,2); // 图片头标识 (2字节)

ShapeL:= PictureCount*9+Length(PicPath);

BlockWrite(Ftxt,ShapeL,2); // 图片数据长度 (2字节)

for i:=Low(PictureArray) to High(PictureArray) do

begin

TextL:=Length(PictureArray[i].SourceName);

BlockWrite(Ftxt,TextL,1); // 每个图片的源文件名称长度 (1字节)

BlockWrite(Ftxt,PictureArray[i].SourceName,Length(PictureArray[i].SourceName)); //每个图片的源文件名称 (长度可变)

BlockWrite(Ftxt,PictureArray[i].Left,2); //图片位置及大小 (每个2字节)

BlockWrite(Ftxt,PictureArray[i].Top,2);

BlockWrite(Ftxt,PictureArray[i].Height,2);

BlockWrite(Ftxt,PictureArray[i].Width,2);

end;

end;

if TextFrameArray <> nil then

begin

ShapeType:= $FF11 ;

BlockWrite(Ftxt, ShapeType, 2); // 文本框头标识 (2字节)

ShapeL:= TextBoxCount * 11 + tb;

BlockWrite(Ftxt, ShapeL, 2); // 文本框文件长度(2字节)

for i := Low(TextFrameArray) to High(TextFrameArray) do

begin

TextL := Length(TextFrameArray[i].Text);

CopyMemory(@c[1],@(TextFrameArray[i].Text[1]),Textl);

BlockWrite(Ftxt, TextL, 1); // 文本框包含文本的长度(1字节)

BlockWrite(Ftxt, C, TextL); // 文本框具体内容 (长度可变) TextFrameArray[i].Text Length(TextFrameArray[i].Text)

BlockWrite(Ftxt, TextFrameArray[i].Orientation, 1); // 文本框走向 (1字节)

BlockWrite(Ftxt, TextFrameArray[i].FontSize, 1); // 文本框字体大小(1字节)

BlockWrite(Ftxt, TextFrameArray[i].Left, 2); // 文本框位置及大小(每个2字节)

BlockWrite(Ftxt, TextFrameArray[i].Top, 2);

BlockWrite(Ftxt, TextFrameArray[i].Height, 2);

BlockWrite(Ftxt, TextFrameArray[i].Width, 2);

end;

end;

if TextEffectArray <> nil then

begin

ShapeType := $FF0F ;

BlockWrite(Ftxt, ShapeType, 2); //艺术字头标识(2字节)

ShapeL := ArtWordCount * 10 + at;

BlockWrite(Ftxt,ShapeL, 2); //艺术字数据长度(2字节)

for i := Low(TextEffectArray) to High(TextEffectArray) do

begin

TextL := Length(TextEffectArray[i].Text) ;

CopyMemory(@c[1],@(TextEffectArray[i].Text[1]),TextL);

BlockWrite(Ftxt, TextL, 1); //艺术字包含内容长度(1字节)

BlockWrite(Ftxt, c, TextL); // 艺术字具体内容(可变长度) Length(TextEffectArray[i].Text)

BlockWrite(Ftxt, TextEffectArray[i].FontSize, 1); //艺术字字体大小 (1字节)

BlockWrite(Ftxt, TextEffectArray[i].Left, 2); //艺术字位置及大小(每个两个字节)

BlockWrite(Ftxt, TextEffectArray[i].Top, 2);

BlockWrite(Ftxt, TextEffectArray[i].Height, 2);

BlockWrite(Ftxt, TextEffectArray[i].Width, 2);

end;

end;

ShapeType:=$FFFF;

BlockWrite(Ftxt,ShapeType,2); //文件结尾符号(2个字节)

except

on e:Exception do

ShowMessage('写入文件异常'+#10#13+e.Message);

end;

CloseFile(Ftxt);

//ShowMessage('文件保存完毕!');

end;

procedure PickUpWord.SortArray(var Sa: array of TLine);

procedure QuickSort(var Sa: array of TLine; iLo, iHi: Integer);

var

Lo, Hi, Mid: Integer; T : TLine;

begin

Lo := iLo;

Hi := iHi;

Mid := Sa[(Lo + Hi) div 2].EndArrowheadStyle;

repeat

while Sa[Lo].EndArrowheadStyle < Mid do Inc(Lo);

while Sa[Hi].EndArrowheadStyle > Mid do Dec(Hi);

if Lo <= Hi then

begin

T := Sa[Lo];

Sa[Lo] := Sa[Hi];

Sa[Hi] := T;

Inc(Lo);

Dec(Hi);

end;

until Lo > Hi;

if Hi > iLo then QuickSort(Sa, iLo, Hi);

if Lo < iHi then QuickSort(Sa, Lo, iHi);

end;

begin

QuickSort(Sa, Low(Sa), High(Sa));

end;

procedure PickUpWord.SortArrayFreeForm(var Sa: array of FreeForm);

procedure QuickSort(var Sa: array of FreeForm; iLo, iHi: Integer);

var

Lo, Hi, Mid: Integer; T : FreeForm;

begin

Lo := iLo;

Hi := iHi;

Mid := Sa[(Lo + Hi) div 2].Count;

repeat

while Sa[Lo].Count < Mid do Inc(Lo);

while Sa[Hi].Count > Mid do Dec(Hi);

if Lo <= Hi then

begin

T := Sa[Lo];

Sa[Lo] := Sa[Hi];

Sa[Hi] := T;

Inc(Lo);

Dec(Hi);

end;

until Lo > Hi;

if Hi > iLo then QuickSort(Sa, iLo, Hi);

if Lo < iHi then QuickSort(Sa, Lo, iHi);

end;

begin

QuickSort(Sa, Low(Sa), High(Sa));

end;

end.

/////////////////////////////////////////////////////////////////////////////////

unit PickUpPas;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls, OleCtnrs,dbtables,db, OleServer, Word2000,

office2000, math, ComCtrls, Grids, DBGrids,WordApp,VarConv, Types,DSIntf,typinfo,

jpeg;

type

TPickUpForm = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

Ledt_WordName: TLabeledEdit;

BtnWordFile: TButton;

Ledt_SvFile: TLabeledEdit;

BtnLastPath: TButton;

Grb_pickuped: TGroupBox;

Rb_Paint: TRadioButton;

Rb_SaveAndPaint: TRadioButton;

Rb_transmit: TRadioButton;

GroupBox1: TGroupBox;

Chkb_Line: TCheckBox;

Chkb_Freeform: TCheckBox;

Chkb_Group: TCheckBox;

Chkb_Pic: TCheckBox;

Chkb_ArtWord: TCheckBox;

Chkb_TextFrame: TCheckBox;

Chb_Autoshap: TCheckBox;

Grb_setPickup: TGroupBox;

Chkb_IsVisible: TCheckBox;

Ledt_ImgPath: TLabeledEdit;

BtnImgPath: TButton;

Chkb_Closeword: TCheckBox;

Stsb: TStatusBar;

BtnExc: TButton;

BtnCancel: TButton;

BtnHelp: TButton;

WordApplication1: TWordApplication;

Memo1: TMemo;

Btn_Paint: TButton;

Button6: TButton;

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

procedure Btn_PaintClick(Sender: TObject);

procedure PaintBox1Paint(Sender: TObject);

procedure FormKeyPress(Sender: TObject; var Key: Char);

procedure BtnExcClick(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Chkb_LineClick(Sender: TObject);

procedure BtnWordFileClick(Sender: TObject);

procedure BtnImgPathClick(Sender: TObject);

procedure BtnCancelClick(Sender: TObject);

procedure BtnHelpClick(Sender: TObject);

procedure BtnLastPathClick(Sender: TObject);

private

{ Private declarations }

ViewId:SHORT;

procedure ControlView(id:SHORT);

procedure BtnEnab;

procedure PaintAutoShape(Ta:array of TAutoShape);

procedure PaintLine(Tl:array of TLine);

procedure PaintTextBox(Tb:Array of TextFrame);

procedure PaintArtWord(Te:Array of TextEffect);

procedure PaintFreeForm(Tf:Array of FreeForm);

procedure PaintPicture(Pc:Array of TPic);

procedure DeleteElseGroup;

procedure ShowUnVisible;

public

{ Public declarations }

function GetAPointFromLine(BeginP,EndP:Tpoint;L:Integer): Tpoint; ///从一条直线(提供坐标得两个点)获得距末端一定长度的点 的坐标

function PointRatation(Src,Center: TPoint; Angle: Single): TPoint; //一点关于另一点的旋转,返回旋转后的点坐标

procedure PaintWaterSource(Cnv:TCanvas; Left,Top,Right,Bottom:Word);

Procedure PaintArrowHeadLine(Cnv:TCanvas; BeginP,EndP:Tpoint;Angle:Single=45); // 绘制一条带箭头的直线,Angle为箭头角度,默认为45度.

end;

var

PickUpForm: TPickUpForm;

MyPickup:pickupword;

implementation

uses comobj, VarUtils, WaitFor, PaintShape;

{$R *.dfm}

procedure TPickUpForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin

if MyPickup <> nil then

MyPickup.Free;

end;

procedure TPickUpForm.Btn_PaintClick(Sender: TObject);

begin

// PaintBox1Paint(nil);

If Trim(Ledt_SvFile.Text) = '' then exit;

Frm_Paint:=TFrm_Paint.Create(nil);

{Frm_Paint.Height:=MyPickup.PageHeight;

Frm_Paint.Width:=MyPickup.PageWidth; }

Frm_Paint.ShowModal;

Frm_Paint.Free;

end;

procedure TPickUpForm.PaintBox1Paint(Sender: TObject);

begin

if MyPickup = nil then exit;

if MyPickup.PickUp <> PICKUP_READED then Exit;

if MyPickup.PickUpSts[1] = 3 then

PaintAutoShape(MyPickup.AutoShapeArray);

if MyPickup.PickUpSts[17] = 3 then

PaintTextBox(MyPickup.TextFrameArray);

if MyPickup.PickUpSts[15] = 3 then

PaintArtWord(MyPickup.TextEffectArray);

if MyPickup.PickUpSts[9] = 3 then

PaintLine(MyPickup.LineArray);

if MyPickup.PickUpSts[5] = 3 then

PaintFreeForm(MyPickup.FreeFormArray);

if MyPickup.PickUpSts[13]= 3 then

PaintPicture(MyPickup.PictureArray); {此处代码可以改进}

end;

procedure TPickUpForm.ControlView(id: SHORT);

var i:integer;

begin

for i:=0 to Componentcount-1 do

if components[i].Tag>0 then

if Components[i].Tag=id then

begin

if Components[i] is TControl then

TControl(Components[i]).Visible:=true;

end

else if Components[i] is TControl then

Tcontrol(Components[i]).Visible:=false;

end;

procedure TPickUpForm.FormKeyPress(Sender: TObject; var Key: Char);

begin

if Key = #27 then

Close;

end;

procedure TPickUpForm.BtnExcClick(Sender: TObject);

var

i:Word;

begin

try

for i:= 0 to ComponentCount-1 do

if Components[i] is TCheckBox then

if TCheckBox(Components[i]).Checked then

MyPickup.PickUpSts[TCheckBox(Components[i]).Tag]:= 2;

try

Frm_WaitFor:=TFrm_WaitFor.Create(nil);

Self.Hide;

Frm_WaitFor.Show;

MyPickup.GetGraphicCount; {获取要提取的图形类别}

except

On E: Exception do

ShowMessage(E.Message);

end;

Application.ProcessMessages;

MyPickup.GetGraphic;

{ if MyPickup <> nil then

begin

PaintBox1.Width:= Round(MyPickup.WordApplication.ActiveDocument.PageSetup.PageWidth);

PaintBox1.Height:= Round(MyPickup.WordApplication.ActiveDocument.PageSetup.PageHeight);

end; }

// PaintBox1Paint(PaintBox1);

MyPickup.SaveDataInVtr(Ledt_SvFile.Text);

Self.Show;

Frm_WaitFor.Free;

except

on e:exception do

showmessage(e.Message);

end;

end;

procedure TPickUpForm.Button6Click(Sender: TObject);

begin

MyPickup:=PickUpWord.Create;

try

MyPickup.OpenWord(Ledt_WordName.Text,Chkb_IsVisible.Checked);

except

Raise;

Exit;

end;

Caption:=Ledt_WordName.Text+'-----word文件已经打开';

BtnEnab;

end;

procedure TPickUpForm.BtnEnab;

begin

BtnExc.Enabled:= not BtnExc.Enabled;

end;

procedure TPickUpForm.PaintLine(Tl: array of TLine);

var i:word;

begin

if high(Tl)-low(tl)= 0 then exit;

for i:=low(tl) to high(tl) do

begin

with {paintbox1.}Canvas do

begin

MoveTo(tl[i].BeginPoint.X,tl[i].BeginPoint.Y);

LineTo(tl[i].EndPoint.X,tl[i].EndPoint.Y);

end;

end;

end;

procedure TPickUpForm.PaintTextBox(tb:Array of TextFrame);

var

i:word;

rec:TRect;

begin

if (high(tb)-low(tb))= 0 then exit;

for i:=low(tb) to high(tb) do

begin

rec.Left:= tb[i].Left;

rec.Top:= tb[i].Top;

rec.Right:=tb[i].Left+tb[i].Width-1;

rec.Bottom:=tb[i].Top+tb[i].Height;

with {PaintBox1.}Canvas do

TextRect(rec,tb[i].Left,tb[i].Top,tb[i].Text);

end;

end;

procedure TPickUpForm.PaintArtWord(Te: array of TextEffect);

var

i:word;

begin

if high(te)-low(te) = 0 then exit;

for i:=low(te) to high(te) do

begin

with {PaintBox1.}Canvas do

TextOut(te[i].Left,te[i].Top,te[i].Text);

end;

end;

procedure TPickUpForm.Chkb_LineClick(Sender: TObject);

begin

if MyPickup = nil then exit;

with Sender as TCheckBox do

begin

if TCheckBox(Sender).Checked then

MyPickup.PickUpSts[TCheckBox(Sender).Tag]:= 2;

end;

end;

procedure TPickUpForm.PaintFreeForm(Tf: array of FreeForm);

var

Line,Node: Word;

begin

with {PaintBox1.}Canvas do

for Line:= Low(Tf) to high(Tf) do

begin

Brush.Color:=Tcolor(Tf[Line].FillColor); //

Pen.Width:=Tf[Line].Weight;

Pen.Color:=Tcolor(Tf[line].LineColor);

MoveTo(Tf[Line].Nodes[Low(Tf[Line].Nodes)].X,Tf[Line].Nodes[Low(Tf[Line].Nodes)].Y);

for Node:= Low(Tf[Line].Nodes) to High(Tf[Line].Nodes) do

begin

LineTo(Tf[Line].Nodes[Node].X,Tf[Line].Nodes[Node].Y);

end;

end;

end;

procedure TPickUpForm.PaintAutoShape(Ta: array of TAutoShape);

var

i:Word;

begin

for i:=Low(Ta) to High(Ta) do

begin

if Ta[i].Style = $00000001 then

{PaintBox1.}Canvas.Rectangle(Ta[i].Left,Ta[i].Top,Ta[i].Left+Ta[i].Width,Ta[i].Top+Ta[i].Height)

else {PaintBox1.}Canvas.Ellipse(Ta[i].Left,Ta[i].Top,Ta[i].Left+Ta[i].Width,Ta[i].Top+Ta[i].Height);

end;

end;

procedure TPickUpForm.PaintPicture(Pc: array of TPic);

var

i,j:Word;

TmpPc:array of TImage;

begin

SetLength(TmpPc,Length(Pc));

J:=Low(Pc)-0;

for i:=Low(Pc) to High(Pc) do

begin

TmpPc[i-j]:=TImage.Create(nil);

TmpPc[i-j].Parent:=Self;

TmpPc[i-j].BringToFront;

TmpPc[i-j].Left:=Pc[i].Left;

TmpPc[i-j].Top:= Pc[i].Top;

try // 'D:\word\SubPic\p1.jpg'

TmpPc[i-j].Picture.LoadFromFile(MyPickup.PicPath+Pc[i].SourceName);

except

Raise;

end;

end;

end;

procedure TPickUpForm.DeleteElseGroup;

var i,j:integer;

o:OleVariant;

begin

if MyPickup<> nil then

begin

j:=MyPickup.WordApplication.ActiveDocument.Shapes.count;

for i:=1 to j do

begin

o:=i;

if MyPickup.WordApplication.ActiveDocument.Shapes.Item(o).Type<>6 then

MyPickup.WordApplication.ActiveDocument.Shapes.Item(o).Delete;

end;

end;

end;

procedure TPickUpForm.ShowUnVisible;

var i,j:integer;

o:OleVariant;

begin

if MyPickup<> nil then

begin

j:=MyPickup.WordApplication.ActiveDocument.Shapes.count;

for i:=1 to j do

begin

o:=i;

if (MyPickup.WordApplication.ActiveDocument.Shapes.Item(o).Visible=msoFalse) then

//Memo1.lines.Add(vartostr(MyPickup.WordApplication.ActiveDocument.Shapes.Item(o).name));

end;

end;

end;

{88384190 }

procedure TPickUpForm.BtnWordFileClick(Sender: TObject);

var

OpDlg:TOpenDialog;

begin

OpDlg:=TOpenDialog.Create(nil);

OpDlg.Filter:='Word files (*.Doc)|*.Doc';

if OpDlg.Execute then

begin

Ledt_WordName.Text:=OpDlg.FileName;

Ledt_SvFile.Text:=Ledt_WordName.Text;

while pos('\',Ledt_SvFile.Text)<>0 do

Ledt_SvFile.Text:=copy(Ledt_SvFile.Text,pos('\',Ledt_SvFile.Text)+1,Length(Ledt_SvFile.Text));

Ledt_SvFile.Text:=copy(Ledt_SvFile.Text,1,Length(Ledt_SvFile.Text)-4)+'.vtr';

end;

OpDlg.Free;

end;

procedure TPickUpForm.BtnImgPathClick(Sender: TObject);

var

SvDlg:TOpenDialog;

begin

SvDlg:=TSaveDialog.Create(nil);

SvDlg.Title:='打开';

if Ledt_ImgPath.Text='' then

SvDlg.FileName:='tmp'

else SvDlg.FileName:=Ledt_ImgPath.Text;

if SvDlg.Execute then

Ledt_ImgPath.Text:=SvDlg.FileName;

SvDlg.Free;

end;

procedure TPickUpForm.BtnCancelClick(Sender: TObject);

begin

if MyPickup<>nil then

MyPickup.Free;

Application.Terminate;

end;

procedure TPickUpForm.BtnHelpClick(Sender: TObject);

var

i:integer; s:string; ss:Widestring; o, Filename,tmp:olevariant;

j: word; OP:TOpenDialog;

t:array[1..20] of char; f:file;

begin

o:=1;

OP := TOpenDialog.Create(nil);

if not OP.Execute then exit;

MyPickup := PickUpWord.Create;

MyPickup.OpenWord(op.FileName,true);

for i:= 1 to WordApplication1.Documents.Count do

begin

o := i;

Filename:= 'D:\Documents and Settings\Administrator\桌面\'+inttostr(i)+'.doc';

WordApplication1.ActiveDocument.Shapes.Item(o).Name; //Item(o).SaveAs(Filename,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);

end;

MyPickup.CloseWord();

MyPickup.Free;

{AssignFile(F,Ledt_SvFile.Text); 变量类型保持和写入文件时使用同样的类型.

Try

Rewrite(F,1);

Seek(F,0);

except

ShowMessage('文件打开错误,请重试!');

Exit;

end;

i:=0;

s:='a中国c人d民ef解放gg';

BlockWrite(f,s,Length(s));

Seek(f,0);

BlockRead(f,ss,Length(s));

showmessage(ss); ShowMessage(IntToStr(filesize(f)));

CloseFile(f); }

end;

function TPickUpForm.GetAPointFromLine(BeginP, EndP: Tpoint;L:Integer): Tpoint;

var

Li:Integer;

begin

Li:=Round(sqrt(sqr(BeginP.X-EndP.x)+Sqr(BeginP.Y-EndP.Y)));

Result.X:= EndP.X-Round((EndP.X-BeginP.X)*L/Li);

Result.Y:= EndP.Y-Round((EndP.Y-BeginP.Y)*L/Li);

end;

procedure TPickUpForm.PaintArrowHeadLine(Cnv:TCanvas; BeginP, EndP: Tpoint;Angle:Single=45);

var

tmp,tmpc ,tmps,tmp_s:Tpoint;

begin

with Cnv do

begin

MoveTo(BeginP.X,BeginP.Y);

LineTo(EndP.X,EndP.Y);

tmp:=GetAPointFromLine(Point(BeginP.X,BeginP.Y),Point(EndP.X,EndP.Y),10);

tmpc:=point(EndP.X,EndP.Y);

tmps:=PointRatation(tmp,tmpc,Angle);

tmp_s:=PointRatation(tmp,tmpc,360-Angle); //45 为 箭头和线之间的角度

moveto(EndP.X,EndP.Y);

Lineto(tmps.x,tmps.y);

moveto(EndP.X,EndP.Y);

Lineto(tmp_s.x,tmp_s.Y);

end;

end;

function TPickUpForm.PointRatation(Src,Center: TPoint; Angle: Single): TPoint;

const

pin=Pi/180;

begin

Result.X:= Round(Center.X+(Src.X-Center.X)*cos(Angle*Pin)-(Src.Y-Center.Y)*Sin(Angle*Pin));

{ x0+(x-x0)cos@-(y-y0)sin@ }

Result.Y:= Round(Center.Y+(Src.X-Center.X)*Sin(Angle*Pin)+(Src.Y-Center.Y)*Cos(Angle*Pin));

{ y0+(x-x0)sin(θ)+(y-y0)cos(θ)}

end;

procedure TPickUpForm.PaintWaterSource(Cnv:TCanvas; Left,Top,Right,Bottom:Word);

begin

Cnv.Brush.Color:=clred;

Cnv.Pie(Left,Top,Right,Bottom,(Right+Left) div 2,Bottom,(Bottom+Top) div 2,0);

end;

procedure TPickUpForm.BtnLastPathClick(Sender: TObject);

var

SvDlg:TOpenDialog;

begin

SvDlg:=TSaveDialog.Create(nil);

SvDlg.Title:='打开';

if Ledt_SvFile.Text='' then

SvDlg.FileName:='tmp'

else SvDlg.FileName:=Ledt_SvFile.Text;

if SvDlg.Execute then

Ledt_SvFile.Text:=SvDlg.FileName;

SvDlg.Free;

end;

end.

/////////////////////////////////////////////////////////////////////////////////////

unit PaintShape;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls;

type

TFrm_Paint = class(TForm)

PaintBox1: TPaintBox;

procedure PaintBox1Paint(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Frm_Paint: TFrm_Paint;

implementation

uses WordApp, PickUpPas;

{$R *.dfm}

procedure TFrm_Paint.PaintBox1Paint(Sender: TObject);

begin

MyPickup.PaintFromVtr(PickUpForm.Ledt_SvFile.Text,PaintBox1.Canvas);

end;

end.

//////////////////////////////////////////////////////////////////////////////////////

unit WaitFor;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls;

type

TFrm_WaitFor = class(TForm)

Lb_Shape: TLabel;

Pb_Pickup: TProgressBar;

Bevel1: TBevel;

Cancel: TBitBtn;

Label1: TLabel;

procedure CancelClick(Sender: TObject);

procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Frm_WaitFor: TFrm_WaitFor;

implementation

uses Math, PickUpPas;

{$R *.dfm}

procedure TFrm_WaitFor.CancelClick(Sender: TObject);

begin

if Application.MessageBox('您真的想退出程序嘛?','提示: 图形还没有提取完',MB_OKCANCEL)=idok then

Application.Terminate;

end;

procedure TFrm_WaitFor.FormCloseQuery(Sender: TObject;

var CanClose: Boolean);

begin

CancelClick(nil);

end;

end.