2012-09-25 29 views
6

Tôi đang cố tạo lập trình thời gian và điểm đánh dấu bằng cách sử dụng Interio 2010 COM Interops. Mã của tôi dựa trên bài đăng trên blog 2 phần của Chris Castillo (Part 1, Part 2), là ví dụ duy nhất hoàn chỉnh mà tôi đã có thể tìm thấy về cách thực hiện việc này. Tuy nhiên, blog của anh (từ năm 2004) dường như không hoạt động đúng. Các cột mốc không thực sự được kết nối với dòng thời gian và việc cập nhật ngày của chúng không khiến chúng di chuyển đến đúng vị trí.Làm thế nào để tôi lập trình thả mốc thời gian vào một mốc thời gian khối trong Visio

Bất kỳ đề xuất hoặc bản sửa lỗi nào?

enter image description here

Imports Microsoft.Office.Interop.Visio 
Imports System.Diagnostics.CodeAnalysis 
Imports System.Runtime.InteropServices 

...

Dim VisioApp As New Application 

Dim myDoc As Document = VisioApp.Documents.Add("") 
Dim myPage As Page = myDoc.Pages.Item(1) 

Dim TimelineStencils As Document = 
    VisioApp.Documents.Add("Timeline Shapes.vss") 

Dim theTimeline As Shape 
Dim theMilestone As Shape 

VisioApp.AlertResponse = 1 

theTimeline = myPage.Drop(
    TimelineStencils.Masters.ItemU("Block timeline"), 5.610236, 5.511811) 

theTimeline.CellsU("User.visBeginDate").FormulaU = _ 
     VisioApp.ConvertResult(
      "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches) 

theTimeline.CellsU("User.visEndDate").FormulaU = _ 
    VisioApp.ConvertResult(
     "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches) 

VisioApp.Addons("ts").Run("/cmd=3") 

theMilestone = myPage.Drop(_ 
    TimelineStencils.Masters.ItemU("Line milestone"), _ 
    5.610236, 5.511811) 

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _ 
    VisioApp.ConvertResult(
     "7/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches) 

VisioApp.AlertResponse = 0 

Trả lời

2

Vì vậy, tôi đã tìm thấy một much better walk-through của các đối tượng Visio thêm lập trình bổ sung mà @JohnGoldsmith liên kết đến trong some of his other answers cho các câu hỏi có liên quan và tìm ra cách tạo giấy nến và trang tốt hơn.

Dim VisioApp As New Application 

Dim myDoc As Document = VisioApp.Documents.Add("Timeline.vst") 
Dim myPage As Page = myDoc.Pages.Item(1) 

Dim TimelineStencilName As String = "TIMELN_M.VSS" 
Dim TimelineStencilDoc As Document 

For Each Doc As Document In VisioApp.Documents 
    If Doc.Name = TimelineStencilName Then 
     TimelineStencilDoc = Doc 
     Exit For 
    End If 
Next 

Dim TimelineMaster As Master = 
    TimelineStencilDoc.Masters.ItemU("Block timeline") 

Dim MilestoneMaster As Master = 
    TimelineStencilDoc.Masters.ItemU("Line milestone") 

Dim theTimeline As Shape 
Dim theMilestone As Shape 

theTimeline = myPage.Drop(TimelineMaster, 5.610236, 5.511811) 

theTimeline.CellsU("User.visBeginDate").FormulaU = _ 
    VisioApp.ConvertResult(
      "1/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches) 

theTimeline.CellsU("User.visEndDate").FormulaU = _ 
    VisioApp.ConvertResult(
     "12/31/2004", VisUnitCodes.visDate, VisUnitCodes.visInches) 

theMilestone = myPage.Drop(_ 
    MilestoneMaster, _ 
    5.610236, 5.511811) 

theMilestone.CellsU("User.visMilestoneDate").FormulaU = _ 
    VisioApp.ConvertResult(
     "10/1/2004", VisUnitCodes.visDate, VisUnitCodes.visInches) 
+0

Và đối với bất kỳ ai đang đấu tranh với tất cả điều này, đây là hướng dẫn bật Chế độ nhà phát triển, cho phép ShapeSheets http://www.visguy.com/2008/08/04/top-9-reasons-for-turning -trình phát triển-chế độ –

2

Chạy mã Chris' chống lại việc xây dựng trong stencil ("TIMELN_M.VSS") và mẫu trên Visio 2010 tôi thấy nó làm việc một cách hoàn hảo. Tuy nhiên, nếu bạn chạy nó với stencil được tạo sẵn bằng một tài liệu trống, trường dữ liệu Mô tả và Ngày tháng sẽ không được hiển thị. Khả năng hiển thị của hai trường này phụ thuộc vào một ô Người dùng ("User.visTLShowProps") trong Document ShapeSheet hoặc được thêm bởi addon hoặc được thêm khi một trong các chủ nhân bị loại bỏ.

Mẫu chuẩn chứa hai persistent events chức năng gọi đó trong phần bổ trợ cho DocumentCreated và DocumentOpened và, một lần nữa, hoặc thêm một vài ô Người dùng khác được sử dụng để chuyển đổi giá trị của và tắt ở trên hoặc chúng tồn tại trong mẫu. Trong mọi trường hợp, chúng không được thêm vào Document ShapeSheet nếu bạn không sử dụng mẫu gốc.

Điều này có nghĩa là bạn cần tự mình chuyển đổi giá trị. Ví dụ (một VBA ví dụ nhanh):

Private Sub SetTlShowProps(ByRef vDoc As Visio.Document) 
If (Not vDoc Is Nothing) Then 
    Dim docShp As Visio.Shape 
    Set docShp = vDoc.DocumentSheet 
    If (docShp.CellExistsU("User.visTLShowProps", 0)) Then 
     docShp.CellsU("User.visTLShowProps").FormulaU = 1 
    End If 
End If 
End Sub 

Hoặc, tất nhiên bạn có thể thêm những tế bào 'đẩy' vào bạn mẫu tài liệu riêng trong ShapeSheet:

User.visTLShowPropsOn = SETF(GetRef(User.visTLShowProps),1) 

User.visTLShowPropsOff = SETF(GetRef(User.visTLShowProps),0) 

Một điểm cuối cùng nếu điều này không giải quyết được vấn đề của bạn là, bạn đang sử dụng một stencil khác nhau hoặc có nguồn gốc ("Timeline Shapes.vss")?

+0

Cảm ơn sự giúp đỡ của bạn John. Khi bạn chạy mã của Chris và nó hoạt động, đó là từ một ứng dụng độc lập, hoặc từ bên trong Visio trong một số loại bàn điều khiển VBA? Tôi đã thay đổi stencil Timeline thành "TIMELN_M.VSS" nhưng vẫn nhận được kết quả tương tự. Tôi đã được ấn tượng rằng họ giống nhau. –

+0

Ngoài ra, có cái gì tôi có thể thay đổi Dim myDoc Như tài liệu = VisioApp.Documents.Add ("") để có thể nạp tài liệu dòng thời gian thay vì một tài liệu trống? –

Các vấn đề liên quan