Optimierung im Release-Build für einzelne Funktionen ausschalten / Thread-Problem
-
Hmm, sach mal, wieso kannst Du eigentlich die 'Size'-Eigenschaft der Schriftart direkt setzen? Das dürfte gar nicht klappen, da die Eigenschaft 'readonly' ist. Da ist also ganz gehörig der Wurm drin.
-
Wie kommst du darauf, dass sie readonly sein soll?
http://msdn.microsoft.com/en-us/library/aa212954(office.11).aspx
-
Dein Code liest sich seltsam an, vor allem die Schleife. Ich konnte Dein Problem einfach nicht nachvollziehen.
Willst Du sagen, dass "textRange.Font.Size = 24;" aus irgendeinem Grund nicht das tut, was es tun sollte? Warum brauchst Du denn die Zeitverzögerung überhaupt? Greifst Du über verschiedene Threads auf das PPT-Dokument zu? Verwendest Du die Referenzen Microsoft.Office.Interop.PowerPoint + Office? In welcher Version? Kannst Du mal den Code unten ausführen und sagen ob's klappt?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using PPT = Microsoft.Office.Interop.PowerPoint; namespace PowerPointDoc { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonCreatePptDoc_Click(object sender, EventArgs e) { PPT.ApplicationClass powerPointApplication = new Microsoft.Office.Interop.PowerPoint.ApplicationClass(); powerPointApplication.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; PPT.Presentations presentations = powerPointApplication.Presentations; PPT.Presentation presentation = presentations.Add(Microsoft.Office.Core.MsoTriState.msoTrue); PPT.Slides slides = presentation.Slides; PPT.Slide slide = slides.Add(1, Microsoft.Office.Interop.PowerPoint.PpSlideLayout.ppLayoutBlank); PPT.Shape textShape = slide.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, 50, 50, 450, 120); PPT.TextRange textRange = textShape.TextFrame.TextRange; textRange.Text = "Mein Name sei Gantenbein"; textRange.Font.Name = "Arial"; textRange.Font.Size = 28; } } }
-
Natürlich liest sich das seltsam!
Die MessageBox ist nur zu Testzwecken da.Das Problem, dass die Größe der Schriftart nicht korrekt gesetzt wird, kann ich nur nachvollziehen, wenn ich eine neue Slide hinzufüge, dann den Text der Überschriftentextbox setze die schon automatisch auf dem Slide ist und dann die Größe setze. Meistens wird sie richtig gesetzt, aber manchmal nicht, für mich total undeterministisch.
Der Sleep und die Schleife sind einfach dafür da die Größe so oft zu setzen, bis sie 24 ist. Ich habe durch Testen herausgefunden, dass es klappt, wenn man ein wenig wartet und dann die Größe einfach nochmals setzt. Das Sleep ist dazu da, dass ich die CPU nicht zu sehr unter Stress setze, da ich ja sowieso etwas warten muss, bis es korrekt gesetzt wird.
Ich greife nur mit einem Thread darauf zu.
Ich verwende die Interops in der Version 11.0, sprich ich verwende Office 2003.
So sieht das Hinzufügen komplett aus:
protected virtual PowerPoint._Slide InitSlide(string slideTitle) { PowerPoint._Slide slide; slide = presentation.Slides.Add(presentation.Slides.Count + 1, Microsoft.Office.Interop.PowerPoint.PpSlideLayout.ppLayoutTitleOnly); Microsoft.Office.Interop.PowerPoint.TextRange textRange = slide.Shapes[1].TextFrame.TextRange; textRange.Text = slideTitle; textRange.Font.Name = "Arial"; textRange.Font.Size = 24; Thread.Sleep(100); while(textRange.Font.Size != 24) { Thread.Sleep(100); textRange.Font.Size=24; } return slide; }
-
Ich blick's nicht. Folgender Code tut einwandfrei:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using PPT = Microsoft.Office.Interop.PowerPoint; namespace PowerPointDoc { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonCreatePptDoc_Click(object sender, EventArgs e) { PPT.ApplicationClass powerPointApplication = new Microsoft.Office.Interop.PowerPoint.ApplicationClass(); powerPointApplication.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; PPT.Presentations presentations = powerPointApplication.Presentations; PPT.Presentation presentation = presentations.Add(Microsoft.Office.Core.MsoTriState.msoTrue); PPT.Slides slides = presentation.Slides; PPT.Slide slide = slides.Add(1, Microsoft.Office.Interop.PowerPoint.PpSlideLayout.ppLayoutBlank); PPT.Shape textShape = slide.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, 50, 50, 450, 120); PPT.TextRange textRange = textShape.TextFrame.TextRange; textRange.Text = "Mein Name sei Gantenbein"; textRange.Font.Name = "Arial"; textRange.Font.Size = 28; for (int i = 0; i < 100; i++) { PPT._Slide newSlide = InitSlide("Test" + i.ToString(), presentation); if (newSlide.Shapes[1].TextFrame.TextRange.Font.Size != 10) System.Diagnostics.Debug.Print("Error"); } } protected virtual PPT._Slide InitSlide(string slideTitle, PPT._Presentation presentation) { PPT._Slide slide; slide = presentation.Slides.Add(presentation.Slides.Count + 1, Microsoft.Office.Interop.PowerPoint.PpSlideLayout.ppLayoutTitleOnly); PPT.TextRange textRange = slide.Shapes[1].TextFrame.TextRange; textRange.Text = slideTitle; textRange.Font.Name = "Arial"; textRange.Font.Size = 10; //Thread.Sleep(100); //while (textRange.Font.Size != 24) //{ // Thread.Sleep(100); // textRange.Font.Size = 24; //} return slide; } } }
Es wird kein "Error" protokolliert.
-
Tja. Ich verstehe es auch nicht.
-
dEUs, willst du dann nicht sicherheitshalber noch eine Zeitbegrenzung einbauen, damit das Ding nicht in eine Endlosschleife fährt? Ich weiß, es ist äußerst unwahrscheinlich, aber trotzdem evtl möglich, dass die Schriftart mal überhaupt nicht auf 24 gesetzt werden kann, mir jedenfalls wäre das glaubich zu riskant.
-
Wäre es ein Programm das oft und von Endbenutzern ausgeführt wird, würde ich das natürlich machen. Weder das eine noch das andere ist aber hier der Fall.
-
dEUs schrieb:
Tja. Ich verstehe es auch nicht.
Ich meinte, auch mit Deinem Beispiel konnte ich das von Dir genannte Verhalten nicht nachvollziehen.
Ich habe die Anwendung 500 Mal ausgeführt und jedes Mal wurden 100 neue Slides erstellt. Kein einziges Mal kam es zum gemeldeten Fehlverhalten. Deshalb neige ich dazu, das Verhalten im Ausführungs-Kontext zu suchen. Läuft denn das Ganze über ein Netzwerk, oder gar in einem Internet-Szenario?
-
Weder noch. Möglicherweise liegt es an der Länge des Textes.
Ich versuche das mal herauszufinden.
-
Es scheint am Zeilenumbruch zu liegen.
Mit dieser Zeile ist das Problem auch in deiner Test-Anwendung reproduzierbar:PPT._Slide newSlide = InitSlide("Test"+Environment.NewLine+"Test", presentation);
Toll, nicht?
-
dEUs schrieb:
Es scheint am Zeilenumbruch zu liegen.
Mit dieser Zeile ist das Problem auch in deiner Test-Anwendung reproduzierbar:PPT._Slide newSlide = InitSlide("Test"+Environment.NewLine+"Test", presentation);
Toll, nicht?
Der Zeilenumbruch bringt bei mir keine Änderung des Testergebnisses. Alles läuft so, wie es soll.
Testsystem:
XP Pro SP2
MS Office PowerPoint 2003 (11.8169.8172) SP3
Microsoft.Office.Interop.PowerPoint 11.0.0.0
-
Der einzige Unterschied den ich jetzt noch sehe ist die Office-Version.
Ich verwende die Release-Version ohne SPs: 11.5529.5606
-
dEUs schrieb:
Der einzige Unterschied den ich jetzt noch sehe ist die Office-Version.
Ich verwende die Release-Version ohne SPs: 11.5529.5606Seit der Originalversion wurden verschiedene Fehler verbessert. Einiges geht in die Richtung des von dir beschriebenen Fehlverhaltens:
http://support.microsoft.com/kb/885260/
Text verschwindet möglicherweise aus Slide Titles bei Verwendung benutzerdefinierter TrueType-Schriftarten in PowerPoint 2003http://support.microsoft.com/kb/897243/en-us
When you open a presentation in PowerPoint 2003, some of the characters in a line of text may disappear. Or, some of the characters may appear to be overlapped by other characters. Additionally, text in a text box may wrap
more tightly than expected. This causes the characters in the text to be crowded together. This issue occurs because PowerPoint 2003 does not enumerate the fonts that are available on the computer until it is absolutely necessary. PowerPoint 2003 assumes that the fonts that are used in a presentation use standard widths and standard heights. If a font uses non-standard widths and non-standard heights, some of the characters in the font will be truncated, will disappear, or will wrap more tightly than expected.Wenn es Word wäre, könnte ich das Ganze ja noch verstehen, weil mit den Absatzmarken in Word auch Formatierungen mitgespeichert werden, abers so...
-
Naja... Wie du siehst verwende ich Arial. Noch mehr Standard-Schriftart geht ja garnicht...