📄 unit1.pas.~946~
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Visio_TLB, OleCtnrs, StrUtils;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
OpenDialog1: TOpenDialog;
Button5: TButton;
Button6: TButton;
Button7: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
VisioApp: VisioApplication;
visioDoc: Document;
//visioWnd: Window;
visioShapes: Shapes;
visioShape, visioshape1: Shape;
visioPage: Page;
procedure GetSubShapes(ASubsysName: string);
procedure DeleteParents(vsoShape: Shape; PreShape: Shape);
public
{ Public declarations }
procedure GetCode(ToSheet: Shape; FromSheetName: string = '');
end;
TGraphRec = packed record
left: Double;
top: Double;
height: Double;
width: Double;
text: string;
linkerheadnode: string;
linkertailnode: string;
end;
var
Form1: TForm1;
implementation
uses
OleCtrls;
{$R *.dfm}
var
vsoWindow: Window;
vsoSelection: Selection;
{*
根据传入的参数str判断新建或打开绘图文件
str: str = '' 新建
str = filename 打开
*}
procedure OpenDocument(App: VisioApplication; str: WideString);
begin
if str <> '' then
App.Documents.Open(str)
else
App.Documents.Add('');
end;
{*
在页上放置图形
visPage:要画图形的页
ObjectToDrop:要画的图形
pinX, pinY: 放的位置
*}
function visPgDrop(visPage: Page; const ObjectToDrop: IUnknown; pinX, pinY: Double): Shape;
var
visApp: VisioApplication;
begin
visApp := visPage.Application;
// Result := visPage.Drop(ObjectToDrop, pinX, pinY);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
mastersDoc: Document;
I: Integer;
// ACommandbars: CommandBars;
begin
try
VisioApp := CoVisioApplication.Create; //启动visio
VisioApp.Visible := True;
VisioApp.Settings.ShowChooseDrawingTypePane := False;
visioDoc := VisioApp.Documents.Add('');
OpenDocument(VisioApp, ExtractFilePath(Application.ExeName) + 'aaa.vsd');
// mastersDoc := visioDoc.Application.Documents.OpenEx(ExtractFilePath(Application.ExeName) + 'vdesign.vss', visOpenDocked);
{
if OpenDialog1.Execute then
OpenDocument(VisioApp, OpenDialog1.FileName)
else
OpenDocument(VisioApp, '');
}
//显示visio
// for I := 1 to mastersDoc.Masters.Count do
// begin
// Memo1.Lines.Add(mastersDoc.Masters.ItemU[I].NameU + mastersDoc.Masters.ItemU[I].Name);
// end;
Button2.Enabled := True;
Button3.Enabled := True;
Button4.Enabled := True;
Button6.Enabled := True;
// Memo1.Lines.Clear;
// ACommandbars := CommandBars(VisioApp.CommandBars);
except
VisioApp.Quit;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.Enabled := False;
Button3.Enabled := False;
Button4.Enabled := False;
Button6.Enabled := False;
VisioApp.Quit;
end;
//procedure DeleteParents(vsoShape: Shape; PreShape: Shape);
//var
// I, J: Integer;
// LineShape: Shape;
// shapeConns: Connects;
// shapeToCell: Cell;
//begin
// vsoSelection.Select(vsoShape, visSelect);
// if vsoShape.FromConnects <> nil then
// begin
// shapeConns := vsoShape.FromConnects; //连接线的集合
// for J := 1 to shapeConns.Count do
// begin
// shapeToCell := shapeConns[J].FromCell; //线连接的点
// if shapeToCell.Name = 'BeginX' then //自己连出去的线
// begin
// LineShape := shapeToCell.Shape;
// //连接线两端1是自己,2是连接的图形
// Memo1.Lines.Add(vsoShape.Text);
// if LineShape.Connects[2].ToSheet.Text <> PreShape.Text then
// DeleteParents(LineShape.Connects[2].ToSheet, vsoShape);
// end;
//// if shapeToCell.Name = 'EndX' then //连接到自己的线
//// begin
//// LineShape := shapeToCell.Shape;
//// DeleteParents(LineShape.Connects[1].ToSheet, vsoShape);
//// end;
// end;
// end;
//// vsoShape.Delete;
//end;
//procedure GetSubShapes(ASubsysName: string);
//var
// I: Integer;
// vsoShape, LineShape: Shape;
// shapeConns: Connects;
// J: Integer;
// shapeToCell: Cell;
// vsoApp: VisioApplication;
// vsoPage: Page;
// vsoShapes: Shapes;
// vsoDoc: Document;
// PosI: Boolean;
//
//begin
//// if CoVisioApplication = nil then
//// begin
//// ShowError('找不到Microsoft Office Visio程序!');
//// Exit;
//// end;
//
// try
// vsoApp := CoVisioApplication.Create;
// vsoApp.Visible := False;
// vsoApp.Settings.ShowChooseDrawingTypePane := False;
// vsoApp.Documents.Open(ExtractFilePath(Application.ExeName) + 'aaa.vsd');
// vsoDoc := vsoApp.Documents[1];
// vsoApp.ActiveWindow.Zoom := 1;
// vsoApp.ActiveWindow.ZoomLock := False;
// vsoPage := vsoApp.ActivePage;
// vsoShapes := vsoPage.Shapes;
// vsoWindow := vsoApp.ActiveWindow;
// vsoSelection := vsoWindow.Selection;
//// vsoWindow.Select(vsoShape, 1);
// for I := 1 to vsoShapes.Count do
// begin
// vsoShape := vsoShapes[I];
// PosI := AnsiStartsText('保留', vsoshape.Text);
// if PosI then
// begin
// if vsoShape.FromConnects <> nil then
// begin
// shapeConns := vsoShape.FromConnects;
// for J := 1 to shapeConns.Count do
// begin
//// ConnShape := shapeConns[J].FromSheet;
// shapeToCell := shapeConns[J].FromCell;
// if shapeToCell.Name = 'BeginX' then
// begin
// LineShape := shapeToCell.Shape;
// vsoSelection.Select(vsoShape, visSelect);
//
// DeleteParents(LineShape.Connects[2].ToSheet, vsoShape);
// end;
// end;
// end;
// end;
// end;
// vsoWindow.Selection.Copy(visCopyPasteNormal);
//// vsoWindow.Copy;
//// vsoDoc.Close;
// vsoApp.Documents.Add('');
//
//// vsoDoc := vsoApp.ActiveDocument;
// vsoPage.Paste(visCopyPasteNormal);
//
// vsoDoc.SaveAsEx(ExtractFilePath(Application.ExeName) + 'aaa1.vsd', 0);
// finally
// vsoApp.Quit;
// end;
//end;
procedure TForm1.Button3Click(Sender: TObject);
var
idx: Integer;
begin
// visioPage := VisioApp.Documents[1].Pages[1];
// with visioPage do
// begin
// Memo1.Lines.Clear;
// for idx := 1 to Shapes.Count do
// begin
// visioShape := Shapes[idx];
// if visioShape.Name = '页面内引用.'+ IntToStr(idx) then
// begin
// Memo1.Lines.Add(visioShape.Name);
// end;
// end;
// end;
GetSubShapes('');
end;
procedure TForm1.Button4Click(Sender: TObject);
var
I, J, K, docI, pageI, shapeI: Integer;
shapeConns, LineshapeConns: Connects;
shapeConnsJ: Connect;
ConnShape, LineShape,ConnedShape: Shape;
shapeCell, shapeToCell: Cell;
x, y: Double;
startPos: Integer;
str: WideString;
begin
with Memo1.Lines do
begin
Clear;
for docI := 1 to VisioApp.Documents.Count do
begin
visioDoc := VisioApp.Documents[docI];
Add(visioDoc.Name);
for pageI := 1 to visioDoc.Pages.Count do
begin
visioPage := visioDoc.Pages[pageI];
Add('----Page.Name:' + visioPage.Name);
for shapeI := 1 to visioPage.Shapes.Count do
begin
visioShape := visioPage.Shapes[shapeI];
startPos := pos('.', visioShape.Name);
if (startPos > 0) then
str := LeftStr(visioShape.Name, startPos-1)
else str := visioShape.Name;
if str = '总经理' then
begin
Add('--------Shape.Name:' + visioShape.Name);
Add('--------Shape.Text:' + visioShape.Text);
visioShape.XYFromPage(x, y, x, y);
//shapeCell := visioShape.get_CellsSRC(visXFormPinX, 1, 1);
Add('--------X:' + FloatToStr(x));
Add('--------Y:' + FloatToStr(y));
{visioShape.get_RowCount(shortSectionProp) 获得属性的个数,遍历属性}
// for I := 0 to visioShape.get_RowCount(visSectionProp) - 1 do
// begin
// shapeCell := visioShape.get_CellsSRC(visSectionProp, I, visCustPropsValue);
// Add('------------属性' + IntToStr(I) + ':' + shapeCell.Formula);
// shapeCell := visioShape.get_CellsSRC(visSectionProp, I, visCustPropsLabel);
// Add('------------RowNameU:' + shapeCell.RowNameU);
{
shapeCell := visioShape.get_CellsSRC(visSectionProp, I, visCustPropsFormat);
Add(shapeCell.FormulaU);
}
//shapeCell := visioShape.get_CellsSRC(visSectionProp, I, visCustPropsPrompt);
//Add(shapeCell.FormulaU);
// end;
//
// Add('------------NameID:' + visioShape.NameID);
// Add('------------NameU:' + visioShape.NameU);
// Add('------------Text:' + visioShape.Text);
{
shape 有FromConnects
FromSheet : 连接到本身的连接线
ToSheet : 图形自己
}
if visioShape.FromConnects <> nil then
shapeConns := visioShape.FromConnects;
for J := 1 to shapeConns.Count do
begin
ConnShape := shapeConns[J].FromSheet;
Add('------------连接线:' + ConnShape.Name);
//ConnShape := shapeConns[J].ToSheet;
//Add('------------ToSheet:' + ConnShape.Name);
shapeToCell := shapeConns[J].ToCell; //连接线连接的点
Add('------------连接在图形的点:' + shapeToCell.Name);
Add('------------ToCell:' + shapeToCell.Shape.Name);
shapeToCell := shapeConns[J].FromCell;
Add('------------FromCell:' + shapeToCell.Name);
Add('------------FromCell:' + shapeToCell.Shape.Name);
Add('--');
LineShape := shapeConns[J].FromCell.Shape;
if LineShape.Connects <> nil then
begin
for K := 1 to LineShape.Connects.Count do
begin
// ConnedShape := LineShape.Connects[K].ToCell;
Add('------------连接到的图形tocell:' + LineShape.Connects[K].ToCell.Shape.Name);
Add('------------连接到的图形tosheet:' + LineShape.Connects[K].ToSheet.Name);
Add('------------连接到的图形fromsheet:' + LineShape.Connects[K].FromSheet.Name);
Add('--');
end;
end;
end;
end;
{
连接线 有Connects
FromSheet : 连接线自己
ToSheet : 连接的两个图形
}
// if visioShape.Connects <> nil then
// shapeConns := visioShape.Connects;
// for J := 1 to shapeConns.Count do
// begin
// ConnShape := shapeConns[J].ToSheet;
// Add('------------ToSheet:' + ConnShape.Name);
// ConnShape := shapeConns[J].FromSheet;
// Add('------------FromSheet:' + ConnShape.Name);
// shapeToCell := shapeConns[J].ToCell;
// Add('------------ToCell:' + shapeToCell.Name);
// Add('------------ToCell:' + shapeToCell.Shape.Name);
// shapeToCell := shapeConns[J].FromCell;
// Add('------------FromCell:' + shapeToCell.Name);
// Add('------------FromCell:' + shapeToCell.Shape.Name);
// Add('');
// end;
{
Add('+++++' + visioShape.Data1);
Add('+++++' + visioShape.Data2);
Add('+++++' + visioShape.Data3);
}
//Add('--------' + visioShape.Master.Name);
end;
end;
end;
end;
//Add(FloatToStr(visioShape.CellsU['Height'].Result['mm']));
end;
function XYDrawingToScreen(visWindow: Window; visX, visY: Double): TPoint;
var
drawLeft, drawTop, drawHeight, drawWidth: Double;
screenLeft, screenTop, screenHeight, screenWidth: Integer;
screenX, screenY: Integer;
pt: TPoint;
begin
visWindow.GetViewRect(drawLeft, drawTop, drawWidth, drawHeight);
visWindow.GetWindowRect(screenLeft, screenTop,screenWidth, screenHeight);
screenX := Round(screenLeft + ((screenWidth / drawWidth) * (visX - drawLeft)));
screenY := Round(screenTop + ((screenHeight / drawHeight) * (drawTop - visY)));
pt := Point(screenX, screenY);
//ClientToScreen(GetDC(0), pt);
Result := Point(screenX, screenY);
end;
function XScreenToDrawing(visWindow: Window; screenX, screenY: Integer): Integer;
var
drawLeft, drawTop, drawHeight, drawWidth: Double;
screenLeft, screenTop, screenHeight, screenWidth: Integer;
visX, visY: Integer;
begin
visWindow.GetViewRect(drawLeft, drawTop, drawWidth, drawHeight);
visWindow.GetWindowRect(screenLeft, screenTop,screenWidth, screenHeight);
// visX := Round((screenX + (screenWidth / drawWidth) * drawLeft - screenLeft) / (screenWidth / drawWidth));
// visX := Round((screenY + (screenHeight / drawHeight) * drawTop - screenTop) / (screenHeight / drawHeight));
visX := Round(drawLeft + (drawWidth / screenWidth) * (screenX - screenLeft));
visY := Round(drawTop + (drawHeight / screenHeight) * (screenTop - screenY));
Result := visX;
end;
function YScreenToDrawing(visWindow: Window; screenX, screenY: Integer): Integer;
var
drawLeft, drawTop, drawHeight, drawWidth: Double;
screenLeft, screenTop, screenHeight, screenWidth: Integer;
visX, visY: Integer;
begin
visWindow.GetViewRect(drawLeft, drawTop, drawWidth, drawHeight);
visWindow.GetWindowRect(screenLeft, screenTop,screenWidth, screenHeight);
// visX := Round((screenX + (screenWidth / drawWidth) * drawLeft - screenLeft) / (screenWidth / drawWidth));
// visY := Round((screenY + (screenHeight / drawHeight) * drawTop - screenTop) / (screenHeight / drawHeight));
visX := Round(drawLeft + (drawWidth / screenWidth) * (screenX - screenLeft));
visY := Round(drawTop + (drawHeight / screenHeight) * (screenTop - screenY));
Result := visY;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -