Hallo Niels,
Irgend etwas mache ich jedoch noch falsch. Er formatiert immer meinen Rahmen um, in dem ich mich gerade befinde. Das kann ich ja auch verstehen, da mein dispatcher ja auf formFrame zugreifen muss, und nicht auf CurrentController.Frame, nur wie muss ich das formulieren?
Du erkennst das schon in etwa, das grundlegende Prinzip ist eigentlich:
Es gibt immer einen sichtbaren Cursor und es kann zusätzlich einen (oder mehrere) "virtuellen" Cursor geben. Du kannst beide benutzen um notwendige Aufgaben zu erledigen, es ist nur die Frage was optisch sichtbar sein soll. Da die Art Makros über die wir hier sprechen so schnell ablaufen das der Benutzer das nicht (am Bildschirm) verfolgen kann reicht der virtuelle Cursor aus, die Position des sichtbaren Cursors bleibt hierbei völlig unverändert, weshalb ich schrieb:
(*)der (sichtbare) Cursor kann zu diesem Zeitpunkt im Text oder in einem Rahmen stehen, die Position dieses Cursors bleibt unverändert erhalten
Du kannst das alles gleichwertig auch mit dem sichtbaren Cursor durchführen, dann steht dieser nach Beendigung des Makros an der Stelle "wo das Makro endet", das kann erwünscht sein. Oder Du kannst die Anfangsposition des sichtbaren Cursors speichern, dann mit dem sichtbaren Cursor arbeiten und ihn anschließend wieder in Anfangsposition bringen - nur ist es dann logischer gleich einen virtuellen Cursor zu verwenden. Also: es kommt eigentlich nur darauf an wo Dein Cursor nach Abarbeitung des Makros sichtbar sein soll.
Wenn das jetzt zu verwirrend war siehe das Dokument "StarBasicFAQ", der link ist hier
viewtopic.php?t=1553 aufgeführt, dort gibt es eine Beschreibung zum Einfügen von Text an Textmarken einmal mit virtuellem und einmal mit sichtbarem Cursor, diese sollte verständlich sein.
Ansonsten ist hier ein Code für Dich:
Code: Alles auswählen
Public formFrame
Public formCursor
Sub Faxlayout
formCursor = ThisComponent.Text.createTextCursor()
formCursor.gotoStart (false)
formFrames = ThisComponent.getTextFrames()
for i = 0 to formFrames.Count -1
formFrame = formFrames(i)
if formFrame.Name = "Absender" then SW()
next i
'der Cursor steht schon vorne, sonst:
'formCursor.gotoStart (false)
formCursor.gotoEnd (true)
formCursor.ParaStyleName = "PT-Fax"
End Sub
sub SW()
FrameCursor = formFrame.createTextCursor()
FrameCursor.gotoStart (false)
FrameCursor.gotoEnd (true)
FrameCursor.CharColor = RGB(0,0,255) 'blau
end sub
Was passiert?
Code: Alles auswählen
formCursor = ThisComponent.Text.createTextCursor()
formCursor.gotoStart (false)
-->es wird ein 'virtueller' (Text)cursor erzeugt und dieser an den Anfang des Textbereiches des aktuellen Dokuments gesetzt, falls hierbei Text quasi "überstrichen" werden sollte wird dieser nicht markiert wegen (false)
Code: Alles auswählen
formFrames = ThisComponent.getTextFrames()
for i = 0 to formFrames.Count -1
formFrame = formFrames(i)
if formFrame.Name = "Absender" then SW()
next i
-->der richtige Rahmen wird gesucht (*), wenn er gefunden ist ist er der aktulle inhalt der Objektvariable formFrame (Du kannst Dir vorstellen der Rahmen wäre virtuell markiert) und das ist der Grund das Dein Code nicht arbeitet:
Dein Code nutzt den sichtbaren Cursor, der Zugriff auf den Rahmen ist jedoch mit dem virtuellen Cursor erfolgt UND bisher ist nur der Rahmen gewählt der virtuelle Cursor steht noch nicht im Textbereich des Rahmens, das erledigt:
(*)
da Du VBA programmierst: das ThisComponent.getTextFrames() ist in diesem Sinne eine Objektauflistung wo Du in VBA sinngemäß schreiben könntest:
For each Frame in ThisComponent.getTextFrames()
'...
Next Frame
-->Zugriff auf den Text im Rahmen ist möglich, FrameCursor ist genau so ein virtueller Cursor wie FormCursor beide existieren im Moment, nach Abarbeitung von sub SW() hört jedoch FrameCursor auf zu existieren da er nicht modulweit deklariert ist wie FormCursor (--> Public formCursor)
Code: Alles auswählen
FrameCursor.gotoStart (false)
FrameCursor.gotoEnd (true)
FrameCursor.CharColor = RGB(0,0,255) 'blau
-->an den Anfang des Textbereich des Rahmens springen (ich bin nicht sicher ob das zwingend erforderlich ist, aber sicher ist sicher), dann zum Ende des Textbereichs gehen und hierbei den Überstrichenen Text markieren (true), somit enthält FrameCursor.String den gesamten Text des Rahmens und diesem kann nun die Schriftfarbe zugewiesen werden
Code: Alles auswählen
formCursor.gotoEnd (true)
formCursor.ParaStyleName = "PT-Fax"
-->das Gleiche wie im Rahmen nur wird keine Schriftfarbe sondern eine Absatzvorlage zugewiesen (eleganter wäre es durch alle Absätze zu interieren)
sondern kann den Rahmen sicher auch direkt über seinen Namen ansprechen, oder?
Ich denke ja, bin aber zu blöd dafür, es ist möglicherweise nur eine Kleinigkeit aber ich weiß nicht wie. Meine Vermutung war:
formFrame = formFrames().GetByName("Absender")
das funktioniert jedoch nicht, liefert aber auch keine Fehlermeldung.
Gruß
Stephan