none
Win Forms RRS feed

  • Frage

  • Hallo,

     

    entweder bin ich voll neben der kappe oder steh einfach nur auf dem Schlauch. Ich möchte ein Add in für PPT schreiben (vb.net), das soll ja nicht das problem sein. hab mit VS2010 auch prima das Addin (soll heissen die Ribbon-leiste mit Button) gebasteltund diverse Menübandrückrufe eingebunden. Nun hab ich extra noch eine Windows form erstellt (über Menüpunkt Hinzufügen) und fleissig mit Steuerelementen + dazugehörige Funktionen und Prozeduren gefüllt.... und jetzt kommt das problem -> es will nicht starten....soll heissen, ich hatte die WinForm vorher mal als eigenständiges Projekt getestet und da funktioniert alles wie es soll, daran kann es also nicht liegen, ich bekomm irgendwie den aufruf nicht hin das wenn auf Button5 in dem von mir erstellten Ribbon geklickt wird die winform aufgerufen wird (nicht die Winform.exe sondern die form die ich neu erstellt hab im Addin)

    kurze aufgliederung :

    Ribbon1.vb

    Ribbon1.xml

    ThisAddin.vb

     

    Form1.vb

    class1.vb

    class2.vb

    class3.vb

     

    in Form1.vb ist ja zum laden der Form : Privat sub Form1_Load(.......) handle as me.load

    Problem Nummero Uno : Muss ich im Menübandrückruf (Nothing, Nothing) als sender und e angeben?

     

    in Ribbon1.vb - Menübandrückruf folgender aufruf der Form :

    Privat Sub LadeForm()

    Dim frmForm as New Form1 'ist ja die Klasse die den Load-Event beinhaltet

    frmForm.Form1_Load() ' Nothing, Nothing ??

    Problem nummero due : Privat Sub LadeForm() <<-- right ??

    Habe über einzelschritt-debugging mal den ablauf verfolgt, anscheinend wird die Form unsichtbar geladen da der source ohne fehler durchlaufen wird. Bin mitlerweile am verzweifeln. Wer weiss rat bzw kann helfen das bei klick auf den Button im Ribbon (ist in der xml auch definiert mit verweis auf LadeForm() ) die Windows Form auch angezeigt wird?

    P.S. Office 2007 ... PowerPoint 2007

    Mittwoch, 18. August 2010 14:49

Alle Antworten

  • Hallo,

    in Form1.vb ist ja zum laden der Form : Privat sub Form1_Load(.......) handle as me.load

    Problem Nummero Uno : Muss ich im Menübandrückruf (Nothing, Nothing) als sender und e angeben?

    Nein.

    in Ribbon1.vb - Menübandrückruf folgender aufruf der Form :

    Privat Sub LadeForm()

    Dim frmForm as New Form1 'ist ja die Klasse die den Load-Event beinhaltet

    frmForm.Form1_Load() ' Nothing, Nothing ??

    Formulare werden über die Show- bzw. ShowDialog- Methode geladen und zur Anzeige gebracht. Form.Load stellt das Ereignis dar, das während der ersten Initialisierung des Formulars, vor dem Anzeigen durchlaufen bzw. ausgelöst wird.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    • Als Antwort vorgeschlagen Jan Tittel Mittwoch, 18. August 2010 19:33
    • Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 25. August 2010 08:10
    • Tag als Antwort aufgehoben RL-SM Mittwoch, 25. August 2010 12:38
    Mittwoch, 18. August 2010 15:31
  • Wenn ich im Menübandrückruf frmForm.Form1_Load() <<-- in den klammern nichts rein schreibe (also nicht mal Nothing, Nothing) mault VS2010 das inForm1.vb in der Sub Form1_Load sender und e nicht definiert wurden bzw der Fehler kommt in der Ribbon1.vb  für die Sub im Menübandrückruf " frmForm.Form1_Load()" ....von daher muss doch irgendwas die Klammer füllen ?!?

     

    oder lass ich das frmForm.Form1_Load() im Menübandrückruf weg und schreib statt dessen ShowDialog(frmForm) ?

     

    'Ribbon1.vb Menübandrückrufe'

    Privat Sub LadeForm()

    Dim frmForm as New Form1

    ShowDialog(frmForm)

    end Sub

     

    also so?

     

    und in Form1.vb die Form1_Load so beibehalten wie sie vom Designer erstellt wurde? Also:

    Privat Sub Form1_Load(ByVal sender as Object, e as SystemArgs) Handle Me.Load

    .....

    end Sub

     so?

     

     

    Mittwoch, 18. August 2010 18:19
  • Jepp, so sollte es funktionieren. Hast du es schon getestet?

    Nochmal etwas zur Erläuterung: ..._Load, ..._Click usw. sind alles Eventhandler. Was darin passiert kannst du natürlich beeinflussen, aber die ruft man in der Regel NIE direkt auf sondern die werden automatisch beim Eintreten des entsprechenden Ereignisses ausgelöst. Formulare werden mit Show bzw. ShowDialog angezeit (je nachdem, ob es modal oder nicht-modal sein soll).

    Viele Grüße

    Jan

    Bearbeitung: Ach ja, die _Load bleibt so bestehen, wie vom Designer erstellt. Außer du willst, das beim "Laden" etwas passieren soll wie z.B. das Abrufen von Daten aus einer Datenbank. Dann gehört der Code dafür dort hinein.

    • Bearbeitet Jan Tittel Mittwoch, 18. August 2010 19:32 Bearbeitung
    Mittwoch, 18. August 2010 19:30
  • Hallo,

    Wenn ich im Menübandrückruf frmForm.Form1_Load() <<-- in den klammern nichts rein schreibe (also nicht mal Nothing, Nothing) mault VS2010 das inForm1.vb in der Sub Form1_Load sender und e nicht definiert wurden bzw der Fehler kommt in der Ribbon1.vb  für die Sub im Menübandrückruf " frmForm.Form1_Load()" ....von daher muss doch irgendwas die Klammer füllen ?!?

    Ja, wenn Du die Methode Form_Load aufrufen möchtest, musst Du natürlich möglichst sinnvolle Parameter übergeben. Aber für den Zweck, Dein Formular anzuzeigen, musst Du nicht Form_Load aufrufen. Das war mit meinem "Nein" in meiner vorherigen Antwort gemeint.

    oder lass ich das frmForm.Form1_Load() im Menübandrückruf weg

    Ja.

    und schreib statt dessen ShowDialog(frmForm) ?

    Nein. Wie auch in der  Dokumentation zu lesen ist, ist ShowDialog eine Methode Deines Formulars. Der Aufruf gestaltet sich also so:

    frmForm.ShowDialog()

    und in Form1.vb die Form1_Load so beibehalten wie sie vom Designer erstellt wurde?

    Ja. Form_Load wird automatisch in Folge des ShowDialog Aufrufs ausgeführt.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Mittwoch, 18. August 2010 20:14
  • Hallo,

    Thorsten hat natürlich Recht! Das hatte ich übersehen. Ich hatte nur auf ShowDialog() geachtet und dann nicht weiter genau hingesehen. Sorry. Insofern stimmt meine vorherige Aussage nicht, dass es mit ShowDialog(frmForm) funktioniert.

    Viele Grüße

    Jan

    Mittwoch, 18. August 2010 22:36
  • Hallo,

     

    Danke euch beiden, hat prima funktioniert ... musste aber in der Rückruf-Sub innerhalb der Klammern noch eintragen (ByVal irgendwas As Office.IRibbonControl) .... leer darf die also nicht sein ... also nicht die showdialog sondern bei:

    Privat Sub LadeDialog(ByVal Variable as OfficeIRibbonControl) <<-- das mein ich ...

     

    Nun läd zwar meine erstellte Form aber die dynamisch zur Laufzeit zu erstellenden Inhalte in der Form werden nicht mitgeladen. So fern ich die Klassen rauslasse in denen diese definiert und instanziiert werden und nur die Klassen aktiv lasse in denen die statischen Steuerelemente vorhanden sind (zur Designzeit) läd die Form auch ziemlich schnell, aktiviere ich die Klassen wieder mit den dynamischen Geschichten drin dauert es eine ganze Zeit bis die Form erscheint aber dann halt ohne den dynamischen Inhalt *mecker* Eine Idee wie das klappt das auch dynamische Steuerelemente wie Pictureboxen mit angezeigt werden?

    Kurz mal eine Aufgliederung des ganzen :

     

    Ribbon1.vb -> ruft Form1.vb auf -> innerhalb _Load : Dim bla as new class1 .... bla() -> innerhalb class1 die Sub  bla() verweisst  auf 3 Klassen : dim blubb as new class2 ... dim peng as new class3 .... din boing as new class4 .... die damit erstellten objekte rufen  dann die entsprechenden sub's innerhalb ihrer klasse auf .... class2 und class3 behinhalten dynamisch erstellte controls (control-arrays)und deren Funktionen, class4 statische + deren Funktionen. (jede klasse bildet in der form irgendetwas auf einer nur für die klasse bestimmte registerkarte auf einem TabControl ab. Das TabControl ist statisch genau wie die Registerkarten)

    P.S. Ihr habt wohl auch kein Bett, wenn ich so die Uhrzeiten sehe wann ihr geantwortet habt ;)

    • Bearbeitet RL-SM Donnerstag, 19. August 2010 07:55 edit
    Donnerstag, 19. August 2010 07:32
  • Hallo,

    ich will Thorsten hier nicht die Butter vom Brot nehmen und überlasse ihm gerne die Antwort. Allerdings gibt es schon mal ein paar wesentliche Informationen, die zum Verständnis fehlen.

    Das ist jetzt nicht spöttisch gemeint, aber gerade die ganzen "bla, blubbs, peng, boing" usw. sind wichtig und vor allem auch die Vererbungshierarchie. Das fängt mit class1 an. Wovon erbt class1? Was wird in class1 erstellt?

    Wie erstellst du die PictureBox? Wird diese irgendwo in class3 erstellt, ist klar, dass sie auf dem Formular nicht angezeigt wird, auch wenn class3 aus dem Formular erzeugt wird. Hier müsste z.B. ein Verweis auf das Formular weitergereicht werden. All das sind wichtige Einzelheiten, die noch fehlen.

    Viele Grüße

    Jan

    Donnerstag, 19. August 2010 10:10
  • Hallo,

    Nun läd zwar meine erstellte Form aber die dynamisch zur Laufzeit zu erstellenden Inhalte in der Form werden nicht mitgeladen. So fern ich die Klassen rauslasse in denen diese definiert und instanziiert werden und nur die Klassen aktiv lasse in denen die statischen Steuerelemente vorhanden sind (zur Designzeit) läd die Form auch ziemlich schnell, aktiviere ich die Klassen wieder mit den dynamischen Geschichten drin dauert es eine ganze Zeit bis die Form erscheint aber dann halt ohne den dynamischen Inhalt *mecker* Eine Idee wie das klappt das auch dynamische Steuerelemente wie Pictureboxen mit angezeigt werden?

    es gibt eigentlich keinen Unterschied im Ladeverhalten des Formulars, wenn es von einem Ribbon bzw. VSTO Add-In aus aufgerufen wird. Was aber entscheidend anders in einem VSTO Add-In ist, dass Du keine Standardinstanz "Form1" hast, bzw. diese Standardinstanz, nichts mit Deiner im Add-In erstellten Instanz zu tun hat. Wenn Du also in Deinem Formular, oder Deinen Klassen auf "Form1" (Bsp. Form1.Controls.Add(...)) zugreifst, um Steuerelemente zu erstellen, werden diese in einer nicht sichtbaren Instanz erstellt, aber nicht in Deinem instantiierten 'frmForm', das Du nach dem Klick auf Deinen Ribbon siehst.

    Wäre zumindest eine mögliche Erklärung, aber nur eine Vermutung auf Basis der bisherigen Informationen.

    Grundsätzlich kannst Du innerhalb Deines Formulars über das Schlüsselwort "Me" auf die aktuelle Instanz zugreifen. Wenn es weitere Klassen gibt, die ebenso mit dieser Instanz arbeiten sollen, musst Du diesen die Referenz auf diese Instanz übergeben. Für weitergehende Hilfe, müsstest Du dann schon etwas Code zeigen, so dass wir hier die Zusammenhänge nachvollziehen können.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 19. August 2010 10:32
  • Hallo Jan,

    ich will Thorsten hier nicht die Butter vom Brot nehmen und überlasse ihm gerne die Antwort.

    welche Butter? Ich betrachte es nicht als Exklusivrecht zu antworten, nur weil ich initial auf den Beitrag des Fragestellers geantwortet habe. Jeder darf sich hier beteiligen. Im Fokus steht die Hilfe für den Fragesteller, der seine Frage effizient und sicher auch zeitnah beantwortet sehen möchte.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 19. August 2010 10:40
  • Public Class Start
    
     Public Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
      Dim frmMain As New Farben
      frmMain.Farben()
    
     End Sub

    Dies ist die Form Load-Klasse. gehört zwar noch bissle mehr zu aber das hat nichts mit dem prob zu tun. Hier wird folgende Klasse aufgerufen:

     

    Public Class Farben
    
     Sub Farben()
    
      Dim Standart As New StandartFarben.Standartfarben
      Dim Spezial As New SpezialFarben.SpezialFarben
      Dim Benutzer As New Benutzerfarben.Benutzerfarben
    
      Standart.ColorBoxArray()
      Spezial.ColorBoxArray()
      Benutzer.Benutzerfarben()
    
     End Sub
    
    End Class

     

    Benutzer enthält für den dritten Tab im TabControl statische Controls die auch wie gewünscht angezeigt werden und so funktionieren wie sie sollen. Ein Auszug aus einer der beiden anderen Klassen :

     

    Namespace StandartFarben
    
    
     Public Class Standartfarben
      Friend ColorBox_Array(29) As System.Windows.Forms.PictureBox
      Shared Standartfarben() As Color = {Color.Black, Color.DarkGray, Color.Gray, Color.LightGray, Color.DarkBlue, Color.Blue, Color.LightBlue, Color.DarkRed, Color.Red, Color.OrangeRed, _
               Color.DarkGreen, Color.Green, Color.LightGreen, Color.DarkCyan, Color.Cyan, Color.DarkMagenta, Color.Magenta, Color.Yellow, Color.LightYellow, Color.Orange, _
                Color.Brown, Color.BurlyWood, Color.Violet, Color.DarkViolet, Color.Purple, Color.DeepPink, Color.LightPink, Color.Silver, Color.White, Color.Beige}
    
    
    
      Public Sub ColorBoxArray()
    
       For i = 0 To Standartfarben.Length - 1
        Dim Start As New Start
        ColorBox_Array(i) = New System.Windows.Forms.PictureBox()
        AddHandler ColorBox_Array(i).Click, AddressOf Color_Array_Click
    
        Start.TabPage2.Controls.Add(Me.ColorBox_Array(i))
        Start.TabPage2.Controls.AddRange(New System.Windows.Forms.Control() {ColorBox_Array(i)})
    
        Select Case i
    
    ...
    
    End Select
    
    Next
    
    End Sub

     

    Aufbau der anderen Klasse ist ähnlich. Habe zum "testen" zwischen end select und dem next mal eine colorbox_array(i).show() ausprobiert, wurde zwar fehlerfrei kompiliert aber steuerelemnte wurden trotzdem nicht angezeigt.

     

    Gruss RL

     

     

    Donnerstag, 19. August 2010 10:52
  • Hallo,

    Public Class Start
    
     Public Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
      Dim frmMain As New Farben
      frmMain.Farben()
    
     End Sub
    [...]
       For i = 0 To Standartfarben.Length - 1
        Dim Start As New Start
     

    An dieser Stelle erstellst Du eine neue Instanz Deines Formulars "Start" (ich empfinde Deine Bezeichner als extremst gewöhnungsbedürftig. 'StartForm' wäre hier eindeutiger). Alles was Du mit dieser Instanz anstellst, hat keine Auswirkung auf die Formularinstanz aus der Du den Aufruf ausführst.

    Nur mal ganz grob als eine mögliche Variante:

    Public Class Start
    
     Public Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    
      Dim frmMain As New Farben
      frmMain.Farben(Me)
    
     End Sub
    
    Public Class Farben
    
     Sub Farben(ByVal form As Start)
    
      Dim Standart As New StandartFarben.Standartfarben
      Dim GfK As New GfKFarben.GfKFarben
      Dim Benutzer As New Benutzerfarben.Benutzerfarben
    
      Standart.ColorBoxArray(form)
      Spezial.ColorBoxArray()
      Benutzer.Benutzerfarben()
    
     End Sub
    
    End Class
    
    Namespace StandartFarben
    
     Public Class Standartfarben
    
      Public Sub ColorBoxArray(ByVal form As Start)
    
       For i = 0 To Standartfarben.Length - 1
        ColorBox_Array(i) = New System.Windows.Forms.PictureBox()
        AddHandler ColorBox_Array(i).Click, AddressOf Color_Array_Click
    
        form.TabPage2.Controls.Add(Me.ColorBox_Array(i))
        form.TabPage2.Controls.AddRange(New System.Windows.Forms.Control() {ColorBox_Array(i)})
    
        Select Case i
           '...
        End Select
       Next
      End Sub
     End Class
    End Namespace
    

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 19. August 2010 11:11
  • Aaaaahh endlich hat das geklappt. Besten Dank hierfür. Muss zwar nun einiges ergänzen/ändern wo ich statt form Start stehen hab und manche sub's nun umschreiben aber hauptsache es klappt nun. versteh ich das richtig das das (ByVal form ...) der sender ist ? Denn irgendwie klappt nun die ausgabe nicht mehr ... hatte auf den beiden Tab's mit den dynamischen Picturenboxen eine statische picturebox die bei klick auf einer der dynamischen picturebox deren farbe darstellt. die picturebox wird weiterhin angezeigt aber das klicken geht nun nicht mehr.
      Private Sub Color_Array_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    
       Dim i As Integer
       Dim Start As New Start
    
       For i = 0 To ColorBox_Array.Length - 1
        Start.pbxVorschauS.BackColor = (ColorBox_Array(i).BackColor)
       Next
    
       Color_Array_Index_Click(sender, e)
    
      End Sub
    
      Private Sub Color_Array_Index_Click(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    
       Dim Start As New Start
       Dim Mouse_Click_Color As PictureBox = DirectCast(sender, PictureBox)
    
       Start.pbxVorschauS.BackColor = Mouse_Click_Color.BackColor
    
      End Sub

    und zu guter letzt eine frage noch dazu dann : es ist ja viel im netz beschrieben zu vsto allerdings das meiste für excel
    outlook oder access. wie ja bestimmt bemerkt soll dieses addin u.a. text manipulieren (in powerpoint) so wie auch füll-
    und rahmenfarbe. ich kann aber nirgends etwas finden wie ich das anstellen kann. also so nach dem motto :

    ich erstelle eine folie (kein master) markiere zb. einen text , klicke auf das addin und selectiere daraus eine farbe
    , der markierte text nimmt diese farbe an ... oder der hintergrund wird eingefärbt oder oder oder ....

    das verhalten soll also explizit zu dem standart-color-dialog von powerpoint identisch sein.
    find in der intellisense aber sowas wie worksheet oder workbook nicht, bestimmt heisst das bei PPT anders. hatte es mal
    mit den codeschnippseln aus dem vsto-beispiel ribbonx für excel http://msdn.microsoft.com/en-us/magazine/cc163410.aspx
    ausprobiert aber da scheitert der menübandrückrüf FillColor ja bereits an sowas wie Application.Selection (Selection ist
    kein Member von Application)... und in selber zeile heisst es weiter Excel.Range (kann ich ja für PPT vergessen) genau wie
     (Interior.Color = Excel.Constants.xlNone)
    Davon abgesehen habe ich dieses beispiel auch mal versucht als Excel addin zu schreiben doch bei der oben genannten
    vorlage ist entweder ein fehler oder so:

    Public Application As Excel.Application
    ribbon.Application = Application

    egal wo ich die zweite codezeile in ribbon1.vb hinschreibe es kommt entweder ein fehler während der designzeit oder wenn
     da nicht dann beim start von Excel

    so der ein oder anderen rat bzw denkanstoss wäre bestimmt hilfreich.

    So, genug zugetextet. Ihr sollt euch ja nicht überarbeiten ;)

    Danke schon mal im vorraus
    Donnerstag, 19. August 2010 11:33
  • Hallo,

    einen kurzen Einstieg in PowerPoint findest du hier: http://msdn.microsoft.com/de-de/library/cc668192.aspx

    Die Dokumentation zu PowerPoint ist wie du schon selbst gemerkt hast bezüglich VSTO sehr dürftig. Wie aber auch in http://msdn.microsoft.com/de-de/library/bb772069.aspx erwähnt, ist die Vorgehensweise unter VSTO fast identisch mit der von VBA. Als Referenz kannst du daher die gut dokumentierte Referenz von VBA für PowerPoint heranziehen.

    @Thorsten: Ich sehe das so wie du, einige sehen das leider anders und fühlen sich auf den Schlips getreten...

    Viele Grüße

    Jan

    • Bearbeitet Jan Tittel Donnerstag, 19. August 2010 16:34 Fehler
    Donnerstag, 19. August 2010 16:32
  • viele der befehle sind ja nicht nach vb.net übertragbar, da wäre zB das Schlüsselwort SET. Hab ich das richtig verstanden das Set in VBA gleichbedeutend ist mit der Objektzuweisung ... also zb 

     

    SET Variable A = OBJEKT B 'VBA

     

    gleichbedeutend mit

     

    Dim Variable A AS NEW Objekt B 'VB.Net

     

    Man kann zwar VBA importieren aber trotz dessen keine "alten" vba befehle nutzen

    Freitag, 20. August 2010 06:25
  • Hallo,

    das Schlüsselwort 'Set' ist in VB.NET obsolet. In VBA musste man Set in Verbindung mit Objektreferenzen verwenden. Da in VB.NET alles ein Objekt ist, wird daraus eine einfache Zuweisung:

    'VBA
    Dim foo As ClassA
    Dim bar As ClassA
    
    Set foo = New ClassA
    Set bar = foo
    
    ' In VB.NET wird daraus:
    Dim foo As New ClassA()
    bar = foo
    
    Du kannst alle Befehle nutzen, die die Objektmodelle von Word, Excel und PowerPoint bereitstellen. Für die reinen VBA Befehle gibt es meist Ersatz in den vielen Klassen des .NET Framework, wenn es nicht von VB selber bereitgestellt wird. Es sind aber grundsätzlich zwei verschiedene Welten mit denen Du da zu tun hast.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 20. August 2010 06:45
  • Hallo Thorsten,

     

    ich merk das schon. Vor Verzweiflung beiss ich schon fast in meine Tastatur. für vb.net zu C# (und umgekehrt) gibts ja wenigstens Converter die es etwas vereinfachen den code umzuwandeln aber von vba zu vb.net gibts nix.

     

    Hast du dir mal das Beispiel für excel und ribbonX auf http://msdn.microsoft.com/en-us/magazine/cc163410.aspx angeschaut? habe es versucht nachzucoden (für excel....für ppt muss ich mir was einfallen lassen wegen der beiden rückrufprozeduren mit verweis auf excel) aber vs2010 meckert irgendwann immer rum wegen der anweisung ribbon.application = application. wo bitte soll ich das hinsetzen. zur entwicklungszeit kommt entweder application ist kein member von ribbon oder dekleration erwartet (ribbon unterringelt) wenn ich dann mal eine position gefunden habe wo vs nicht meckert gibts einen laufzeitfehler. verrat mir bitte mal wo das hin muss, dann kann ich das vielleicht irgendwie auf ppt umcoden, wenn ich dann auch schauen muss wie ich die anweisungen zB das die farbe übernommen wird auff die slides in ppt umsetzen kann

    Wäre nett wenn du noch bei der Umsetzung bei folgender Sache behilflich sein könntest. Wenn ich bei dem Addin welches eine Palette mit speziellen Farben aufruft auf eine der Farben klicke wird ja über die xml eine rückrufsub aufgerufen in ribbon1.vb. irgendwie bekomm ich das nicht auf die reihe das diese rückruf-sub dann auch zB die Schriftfarbe ändert oder den hintergrund(also die Folie)

     

    Dim App As New PowerPoint.Application
    Dim Workbook As PowerPoint.Presentation
    Dim Folie As PowerPoint.Slide
    Dim shap As PowerPoint.Shape

    hab in der ribbon1.vb ein Array mit den farben erstellt

    Privat Benutzerfarben as new color() = {color.FromArgb(123.123.123.123).......}

    Die Rückruffprozedur :

     

    Privat Sub WechselFarbe(ByVal control As Office.IRibbonControl, ByVal selectedId As String, ByVal index As Integer)
    
    end Sub
    irgendwie sind viele parameter wie .Font readonly. komme absolut nicht weiter und die vba-referenz ist da nicht wirklich eine hilfe. wie greif ich auf die Schrift, hintergrund etc. in ppt zu?

     

     

    Freitag, 20. August 2010 07:20
  • Soooo, nach langen Nächten am Wochenende und viel Probiererei und noch mehr Kaffee hab ich zumindest eine Sache gelöst bekommen.

     

    Über ActiveWindow.Selection.TextRange.Font lassen sich diverse Einstellungen der Schrift manipulieren. Was mir aber nun fehlt in den "Optionen" wie .size und .name ist eine Option zum einstellen der Schrifthintergrundfarbe. Die eigentliche Schriftfarbe lässt sich ja über color.rgb manipulieren allerdings scheint es keine Möglichkeit zu geben deren Hintergrund zu manipulieren (nicht Hintergrund des shapes/slides sondern so wie ein texthighlighting, also nur direkt hinter dem text/wort/zeichen).

     

    Hat einer vielleicht eine Idee dazu?

    Montag, 23. August 2010 13:46
  • Hallo,

    das Range-Objekt hat eine Eigenschaft "HighlightColorIndex". Damit lässt sich das einstellen. Siehe http://msdn.microsoft.com/en-us/library/ff841064.aspx.

    Leider verfügt das Range-Objekt der PIA nicht über diese Eigenschaft. Du musst also um das verwenden zu können, einen Verweis auf die COM-Komponente hinzufügen.

    Falls das keine Option ist, könntest du noch das XML der Datei untersuchen und gucken, welches Attribut dafür zuständig ist, und dieses entsprechend ändern.

    Viele Grüße

    Jan

    Montag, 23. August 2010 16:15
  • Das mit dem Range-Objekt hatte ich schon mal probiert, aber irgendwie gibt es das wohl nur für word .... in ppt gibt es nur textrange sliderange und shaperange...und bei denen leider unter selection kein highlight-property

     

    oder muss ich zuvor in den imports die word-optionen einbinden damit ich auf wd zugreifen kann und die highlight-propertys habe?

    Montag, 23. August 2010 16:26
  • Hallo,

    ja, mein Fehler, bin von Word ausgegangen, da ich das auch nur von da her kenne. In PowerPoint finde ich diese Möglichkeit nicht mal in der Oberfläche...

    Vielleicht kannst du ja mit dynamischen Textfeldern arbeiten und deren Hintergrundfarbe entsprechend festlegen. Der Aufwand ist aber hoch, da dann eine Logik programmiert werden muss für die Positionierung etc.

    Du könntest natürlich auch einzig zu diesem Zweck ein Word-Dokument über OLE einbinden... Das ist aber sicherlich auch nicht für jede Umgebung eine geeignete Lösung.

    Vielleicht habe ich ja auch etwas übersehen und es gibt doch eine einfache Lösung. Mal sehen, ob Thorsten etwas einfällt.

    Viele Grüße

    Jan

    Montag, 23. August 2010 18:13
  • Hallo,

     

    das muss ich mir noch schwer überlegen ob ich mir diesen Aufwand machen werde, hab ja jetzt schon ____ an den Fingerkuppen.

    Irgendwie ist PPT komisch. Über ActiveWindow.Selection.TextRange.Font hab ich Zugriff auf die Propertys für die Schrift, mit .SpaeRange.Fill zB auf die Box in der die Schrift ist aber mit .SlideRange.Background.Fill kann ich scheinbar nicht die Folie selber verändern:

    with .SlideRange.Background.Fill

          .BackColor.RGB = RGB(123,123,123)

          .ForeColor.RGB = RGB(10,10,10)

    End With

     

    funktioniert zwar, wird fehlerfrei kompiliert und ausgeführt, wende ich es in PPT an sagt mit PPT beim Schliessen auch das die Folie verändert wurde aber ich habe keinen optischen Effekt. Also keine Farbänderung (zumindest nicht sichtbar). Wie kann das sein bzw hab ich was übersehen oder falsch gemacht dabei? Oder manipulier ich damit gar nicht an der Folienfarbe?

     

    Grüßle

    Dienstag, 24. August 2010 07:25
  • Ähm wieso auf einmal WinForms als Thread-Überschrift. Es handelt sich um PPT-VSTO-AddIn-Programmierung
    Mittwoch, 25. August 2010 12:40
  • In meiner Erinnerung hieß der Thread von Anfang an so (oder zumindest ähnlich)... An PowerPoint im Namen kann ich mich nicht erinnern
    Mittwoch, 25. August 2010 13:28