7 Stimmen

Wie lasse ich programmgesteuert einen Meilenstein auf eine Block-Zeitachse in Visio fallen?

Ich versuche, programmatisch eine Zeitachse und Marker mit den Visio 2010 COM-Interops zu erstellen. Mein Code basiert auf Chris Castillos zweiteiligem Blog-Beitrag (Teil 1, Teil 2), der das einzige halbwegs vollständige Beispiel ist, das ich finden konnte, wie man das macht. Allerdings scheint sein Blog (aus dem Jahr 2004) nicht richtig zu funktionieren. Die Meilensteine sind nicht wirklich mit der Zeitachse verbunden, und wenn ihr Datum aktualisiert wird, bewegen sie sich nicht an die richtige Stelle.

Irgendwelche Vorschläge oder Fixes?

Bildbeschreibung hier eingeben

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

1voto

JohnGoldsmith Punkte 2498

Beim Ausführen von Chris' Code gegen die integrierte Schablone ("TIMELN_M.VSS") und das Template in Visio 2010 habe ich festgestellt, dass es einwandfrei funktioniert. Wenn Sie es jedoch gegen die integrierte Schablone mit einem leeren Dokument ausführen, werden die Beschreibung und das Datum der Formdaten nicht angezeigt. Die Sichtbarkeit dieser beiden Felder hängt von einer Benutzerzelle ("User.visTLShowProps") in der Dokument ShapeSheet ab, die entweder durch das Add-On hinzugefügt wird oder hinzugefügt wird, wenn einer der Master eingefügt wird.

Die Standardvorlage enthält zwei persistente Ereignisse, die Funktionalität im Add-On für DocumentCreated und DocumentOpened aufrufen und entweder ein paar andere Benutzerzellen hinzufügen, die verwendet werden, um den Wert des oben genannten ein- und auszuschalten, oder sie existieren in der Vorlage. Auf jeden Fall werden diese nicht zum Dokument ShapeSheet hinzugefügt, wenn Sie nicht die Originalvorlage verwenden.

Dies bedeutet, dass Sie den Wert selbst umschalten müssen. Zum Beispiel (ein schnelles VBA-Beispiel):

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

Oder natürlich könnten Sie diese 'Push'-Zellen auch in Ihre eigene Dokumentvorlage im ShapeSheet hinzufügen:

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

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

Ein letzter Punkt, wenn das Ihr Problem nicht löst: Verwenden Sie eine andere oder abgeleitete Schablone ("Timeline Shapes.vss")?

1voto

Tom Halladay Punkte 5541

Also habe ich einen viel besseren Leitfaden zur programmatischen Hinzufügung von Visio-Objekten gefunden, den @JohnGoldsmith in einigen seiner anderen Antworten zu verwandten Fragen verlinkt hat, und einen besseren Weg gefunden, um die Schablonen und Seite zu erstellen, und es funktioniert!

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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X