Seite 1 von 1

Grafische Linien wieder entfernen

Verfasst: Mo 21. Okt 2019, 14:32
von Luftschraube
Guten Tag

Ich möchte für die Zeilen meiner Anwendung extra Linien farbig und in verschiedener Stärke erzeugen mit einem Makromodul, habe dazu bei Lenhardt ein ListingNr. 300 gefunden und damit experimentiert bis ich merkte dass das nicht das ist was ich eigentlich wollte.
Dieses Listing 300 Seite 321 handelt wenn ich das richtig sehe von grafisch erzeugten Linien, also keine Zellenlinien(links, rechts, oben, unten).
Hab mittlerweile das richtige gefunden, muss aber erst mal die grafischen Linien aus meinem Spalten/Zeilenbereich entfernen und weiss nicht wie ?? Hab schon in der API versucht was zu finden, hab leider noch nicht kapiert wie ich hier was finden soll !?
In dem von mir verwendeten obigen Listing werden die Linien erzeugt mit dem Befehl .getDrawPage.add(Linie). Wenn man in der API oder sonst wo die Funktion .getDrawPage() finden würde müsste neben .add doch aufgelistet sein welche Attribute hier noch angelegt sind, also z.B. .delete oder .purge o.ä.
Weiss bitte jemand Rat ?

vielen Dank

Re: Grafische Linien wieder entfernen

Verfasst: Di 22. Okt 2019, 13:48
von musikai
Nächstes Mal vielleicht ein Backup machen.

Code: Alles auswählen

sub delete_all_lineshapes_from_all_sheets
for i=0 to thiscomponent.getsheets().count-1
Tabelle = thiscomponent.getsheets().getbyindex(i)

oDrawpage=Tabelle.getdrawpage
k=oDrawpage.count-1
	for k=oDrawpage.count-1 to 0 step -1
	oGraphic=oDrawpage.getbyindex(k)
	if oGraphic.supportsService("com.sun.star.drawing.LineShape") then oDrawpage.remove(oGraphic)
	next k
next i
end sub

Re: Grafische Linien wieder entfernen

Verfasst: Di 22. Okt 2019, 16:48
von balu
Hallo Luftschraube,

viele Wege führen nach Rom. Die auch unterschiedliche Charakteristiken haben.

Du willst eine Linie löschen. Okay! Aber können sich auch noch andere "Grafische Elemente" auf der Drawpage in Calc befinden die Du vielleicht auch noch löschen willst?

Bei expilziet nur einer einzigen Linie könntest Du dem Beispiel von musikai folgen. Wobei man das auch anders angehen kann.

Wenn Du aber verschiedene Elemente zum löschen hast, dann muss ein anderes Verfahren her und das schon bei der Erstellung des Grafischen Elements.

Die Sache mit den "Grafischen Elementen" muss man wissen und auch berücksichtigen. Denn da steckt nämlich eine Stolperfalle drin, die für Anfänger nicht sofort ersichtlich und erkennbar ist.
Kreise, Qudrate oder sonstiges die Du mit der Zeichenfunktion zeichnen kannst, sind klar und eindeutig Grafische Elemente. Da denkt eigentlich jeder daran.
Aber!
Wenn Du dir nur mal so als ein Beispiel dir einen Button zeichnest;
-> Ansicht
-> Symbolleisten
---> Formular Steuerlement
(oder wie auch immer der Weg in deiner LO-Version lautet)
so ist dieser Button auch ein Grafisches Element.

Und was noch schlimmer ist, da sehr leicht zu übersehen ist, eine Notiz/Kommentar die an eine Zelle eingefügt wird, ist auch ein Grafisches Element. Wenn die Notiz nicht dauerhaft eingeschaltet ist, sieht man nicht immer sofort das kleine Rote Quadrat in der Zellecke.

Also auf der Drawpage können sich die unterschiedlichsten Elemente befinden. Aber eins haben sie gemeinsam, sie sind halt AUF der Drawpage und AUF der Zelle. Und das muss man immer bedenken.


Was ich als blödsinn halte ist, das Du deinen Code in ein Writer-Dokumen einfügst, und diese Writer-Datei hier anhängst. Um z.B. einen Code zu Posten gibt es extra dafür vorgesehene Tags, wenn man einen Beitrag erstellt. Also mach das bitte schön zukünftig. Denn so macht das helfen keinen großen Spaß, und es nervt gewaltig.

Eine sichere Methode nur das zu löschen was man auch wirklich löschen will ist, dem erstelltem Zeichenobjekt (Grafisches Element) einen Namen zu vergeben. Denn dann kann man beim löschen einfach den Namen suchen und vergleichen und bei Übereinstimmung das Objekt löschen.

Im Anhang ist eine leicht modifizierte Version von deinem gefundenen Code.
-> Drück den Button "Zeichnen" und es wird eine Linie mit Pfeilen gezeichnet.
-> Drück den Button "Löschen" und es wird nur die Linie gelöscht, die Buttons, Notiz so wie das Schwarze Rechteck bleiben aber unberührt.
-> Schau dir die beiden BASIC-Module in der Datei an.

Ach was solls!
Hier meine Löschroutine die nur die Linie löscht. Sie funktioniert nur im Zusammenhang mit dem Code im Module1.

Code: Alles auswählen

sub ZeichnungLoeschen
	oPage=ThisComponent.drawpages(0)
	for ip = 0 to oPage.count
    	oGrafik=opage.getbyindex(ip)
		if oGrafik.getName() = "xxx_Pfeile" then
    	oPage.remove(oGrafik)
		exit for
		end if		
	next ip 
end sub


Gruß
balu

Re: Grafische Linien wieder entfernen

Verfasst: Di 22. Okt 2019, 19:55
von musikai
balu hat geschrieben:
Di 22. Okt 2019, 16:48
Bei expilziet nur einer einzigen Linie könntest Du dem Beispiel von musikai folgen. Wobei man das auch anders angehen kann.
Mein Code löscht alle Linien.

balu hat geschrieben:
Di 22. Okt 2019, 16:48
Eine sichere Methode nur das zu löschen was man auch wirklich löschen will ist, dem erstelltem Zeichenobjekt (Grafisches Element) einen Namen zu vergeben.
Das ist auf jeden Fall eine gute Idee!!!
balu hat geschrieben:
Di 22. Okt 2019, 16:48

Code: Alles auswählen

sub ZeichnungLoeschen
	oPage=ThisComponent.drawpages(0)
	for ip = 0 to oPage.count
    	oGrafik=opage.getbyindex(ip)
		if oGrafik.getName() = "xxx_Pfeile" then
    	oPage.remove(oGrafik)
		exit for
		end if		
	next ip 
end sub
Cool, wußte nicht, dass man auch direkt auf die drawpages zugreifen kann.
Beim Löschen von Objekten per getbyindex sollte man immer rückwärts vorgehen und als Maximum nur bis count-1 gehen, dann gibt's auch keinen Fehler, wenn man den löschen Button einmal zu oft drückt.

Code: Alles auswählen

sub ZeichnungLoeschen
	oPage=ThisComponent.drawpages(0)
	for ip = oPage.count-1 to 0 step -1
    	oGrafik=opage.getbyindex(ip)
		if oGrafik.getName() = "xxx_Pfeile" then
    	oPage.remove(oGrafik)
		exit for
		end if		
	next ip 
end sub

Re: Grafische Linien wieder entfernen

Verfasst: Mi 23. Okt 2019, 12:18
von balu
Mahlzeit musikai,
dann gibt's auch keinen Fehler, wenn man den löschen Button einmal zu oft drückt.
Stimmt! Da geb ich dir recht. Getestet, und funktioniert.

Ich hatte den Code vor ein paar Wochen erst selbst zusammengeschustert, und da war er für eine einfachere Sache. Aber so haben wir beide was dazu gelernt, und das ist doch voll in Ordnung :-)



Gruß
nalu

Re: Grafische Linien wieder entfernen

Verfasst: Do 24. Okt 2019, 12:17
von Luftschraube
Hallo,

vielen Dank für die umfassende Antwort.
Mit sub delete_all_lineshapes... von musikai konnte ich die grafischen Elemente auf Anhieb löschen nachdem die Variablen angelegt waren, vielen Dank.
Das Notizen auch grafische Elemente sind und man grafischen Elementen auch einen Namen geben kann("xxx_Pfeile") ist allerdings sehr interessant !!
Dass ich meinen code in Writer beigefügt habe finde ich selber sehr umständlich, weiss blos nicht wie's anders geht. Vermute mal über das Icon '<> code anzeigen' , beim nächsten mal ausprobieren !?

gruss Luftschraube :)

Re: Grafische Linien wieder entfernen

Verfasst: Fr 8. Nov 2019, 15:26
von Luftschraube
Hallo
Grafischen Elementen einen Namen geben kann man ja auch wenn man das Element mit der rechten Maustaste anklickt und im sich öffnenden Menue den Punkt 'Namen' anwählt !

ThemenEnde

gruss Luftschraube