Abstürze beim Löschen von Objekten auf einer Drawpage

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Abstürze beim Löschen von Objekten auf einer Drawpage

Beitrag von erikafuchs »

Hallo Leute,
ich habe Probleme beim Löschen von Objekten von einer Drawpage. Beim Googeln finde ich einige Hinweise, dass es hier zu Abstürzen kommen kann.
Bei mir passiert das reproduzierbar. Bei meinem Rechentrainer (den kennen ja wohl schon einige hier) füge ich Kreise mit verschiedenen Prozentanteilen per Makro auf einer Drawpage ein. Ein Ausschnitt aus dem Code:

Code: Alles auswählen

		oKreis= oDoc.createInstance("com.sun.star.drawing.EllipseShape")
			with oKreis
			.Position = erzeugePunkt(x0, y0)
			.Size=erzeugeSize(3000,3000)
			.FillStyle=com.sun.star.drawing.FillStyle.SOLID
			.FillColor=rgb(255, 255, 255)								
			end with
		oPage.add(oKreis)
		oWinkel= oDoc.createInstance("com.sun.star.drawing.EllipseShape")
			with oWinkel
			.Position = erzeugePunkt(X0, Y0)
			.Size=erzeugeSize(3000, 3000)
			end with 
		oWinkel.CircleKind=com.sun.star.drawing.CircleKind.SECTION
			with oWinkel
			.CircleStartAngle=(0)*100
			.CircleEndAngle=(aZ/aN*360)*100
			.FillStyle=com.sun.star.drawing.FillStyle.SOLID
			.FillColor=255  
		end with
		oPage.add(oWinkel)	
Anschließend wird die zeichnung wieder gelöscht. Das funktioniert auf der Tabellenseite 3, 7, 8 .... aber nicht auf der Seite 1. Wenn ich die Kreise dort erzeuge und anschließend lösche dann stürzt das Programm beim Speichern ohne Kommentar ab. Der Code:

Code: Alles auswählen

sub ZeichnungLoeschen (seite)
	oPage=ThisComponent.drawpages(seite)
	if seite=1 or seite =3 then
		do while oPage.count>0
	    	oGrafik=opage.getbyindex(oPage.count-1)
	    	oPage.remove(oGrafik)
		loop 

	else
		do while oPage.count>7
	    	oGrafik=opage.getbyindex(oPage.count-1)
	    	oPage.remove(oGrafik)
		loop 	
	end if		    	
end sub
Auf den Seiten 7 und 8 sind je 7 Buttons die nicht gelöscht werden. Auf der Seite 1 und 3 nicht. Nur bei Seite 1 gibt es einen Absturz.
... Hat irgendjemand eine Idee?
Pit
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abstürze beim Löschen von Objekten auf einer Drawpage

Beitrag von erikafuchs »

Ich hatte jetzt selbst eine Idee (allerdings bin ich nicht begeistert davon). Da das Programm abstürzt wenn ich alle Zeichenobjekte auf Tabellenblatt 1 entferne, habe ich unten auf der Seite sieben Kreise eingefügt und lösche nur bis "oPage.count>7" - das geht - keine Abstürze mehr!

Auf Seite 3 (die ja nicht abgestürzt ist) habe ich die sieben Kreise auch eingefügt, dadurch muss ich bei der Löschroutine nicht mehr unterscheiden. Wer mir jetzt erklärt, warum auf der Seite 1 die Kreise weg sind und auf Seite 3 nicht ...
Grüße
Pit
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Abstürze beim Löschen von Objekten auf einer Drawpage

Beitrag von balu »

Hallo Pit,

wie soll man dir helfen, wenn du nicht mal eine kleine abgespeckte Testdatei hier zur Verfügung stellst?
Ja, ich kenne noch so im ganz groben eine ältere Verrsion von deinem Rechentrainer, aber dein aktuelles Problem ist da ja noch nicht drin.

Wie auch immer, back-to-topic.

Also, ich hatte auch mal so meine Probleme mit dem löschen von Grafiken in Calc. Und da klappte dein Weg den Du gehst

Code: Alles auswählen

   	oGrafik=opage.getbyindex(oPage.count-1)
   	oPage.remove(oGrafik)
irgendwie auch nicht so recht.
Ich weiss jetzt nicht mehr ob ich mir für das Problem Hilfe ausm Forum geholt hatte, oder ob ich von alleine darauf gekommen bin, das es auch noch einen anderen Weg, eine andere Methode gibt.
Nun, für mein Problem ging diese andere Methode wohl, die aber auch eine gewisse Falle in sich birgt. Ich lösche nicht direkt die einzelnen Grafikelemente per Count, sondern einen Zellbereich.

Zellbereich löschen? Wirst Du dich jetzt sicherlich fragen.
Ja! Du liest richtig.
Denn mittels clearContents kann man nicht nur den direkten Zellinhalt einer Zerlle/Zellbereichs löschen, sondern auch deren Formatierungen, Notizen UND "Grafische-Elemente".
Bei mir sieht das beispielsawise so aus.

Code: Alles auswählen

oDoc.Sheets(0).getCellRangeByName("A1:C400").clearContents(128)
Siehe hierzu auch bei Dannenhöfer: 7.1.19 Wie kann man den Inhalt einer Zelle löschen?
Oder dort alternativ: 7.1.4 Wie kann man den Inhalt von Zellen löschen?

Eine Falle bei dieser Lösung ist, es wird gnadenlos jede Grafik gelöscht die sich in dem Zellbereich befindet. Dazu zählen auch z.B. CommandButtons und ähnliches.

Eine weitere Falle, oder besser gesagt ein Stolperstein ist, man muss beim erstmal die genaue Position eines zu löschenden Grafikelemts wissen. Und das könnte ein wenig verwirrend sein. Denn selbst wenn man mit den eigenen Augen sieht das ein Grafikelement z.B. auf der Zelle B6 liegt, so kann es aber durchaus sein das die eigentliche Position schon in A6 anfängt, nur halt nicht sofort für das menschliche Auge sofort ersichtlich. Es würde also das Element in B6 nicht gelöscht, wenn man es mittels

Code: Alles auswählen

oDoc.Sheets(0).getCellRangeByName("B6").clearContents(128)
löschen möchte, weil es zu A6 gehört.

Also je nach dem wo Du was löschen willst, ist Vorsicht angesagt, damit z.B. nicht vielleicht versehentlich ein CommandButton gelöscht wird. Aber ansonsten funktioniert diese Löschmethode recht gut, und die darunter befindlichen Inhalte von Zellen bleiben unangetastet, selbst Formatierungen bleiben unberührt.


Das war jetzt aber nur mal so ein Vorschlag meinerseits, vielleicht kommen ja noch bessere Ideen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abstürze beim Löschen von Objekten auf einer Drawpage

Beitrag von erikafuchs »

Hallo Balu,
schön mal wieder von dir zu hören! Vielen Dank für deine Mühe. ich sehe aber hier keinen klaren Zusammenhang. Ich füge Elemente (geometrische Figuren aller Art) auf die Drawpage ein - und die sind (meines Wissens) keiner Zelle zugeordnet.
wie soll man dir helfen, wenn du nicht mal eine kleine abgespeckte Testdatei hier zur Verfügung stellst?
... mein Makro hat zwischenzeitlich etwa 15000 Zeilen - wenn du (oder sonstjemand) den Code haben will - ich schicke ihn gerne! Wenn ich die entsprechenden Codes in eine leere Datei kopiere funktionieren sie natürlich wunderbar - erst in der Gesamtversion klappt es nicht.
Ja, ich kenne noch so im ganz groben eine ältere Verrsion von deinem Rechentrainer, aber dein aktuelles Problem ist da ja noch nicht drin.
... doch, das Problem hatte ich früher schon. Da war es aber nicht so klar nachvollziehbar. Je nach Betriebssystem, Computerinstallation oder Openoffice bzw. LibreOffice Version die meine Schüler nutzten kam es immer wieder zu Abstürzen.
Zur Zeit läuft meine neueste Version mit der Krücke die ich oben beschrieben habe. Aber nochmal: Wenn jemand den ganzen Rechentrainer haben will: sagt Bescheid. Auf der Hompage unserer Schule habe ich sie noch nicht eingestellt, ich werde am Montag meine Schüler als Betatester einsetzen!
Pit
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Abstürze beim Löschen von Objekten auf einer Drawpage

Beitrag von balu »

Hallo Pit,
ich sehe aber hier keinen klaren Zusammenhang. Ich füge Elemente (geometrische Figuren aller Art) auf die Drawpage ein - und die sind (meines Wissens) keiner Zelle zugeordnet.
Jaeien!
Einerseits hast Du recht, aber anderseits auch wiederum nicht.
Ein Grafisches Element ist wohl nicht direkt einer ganz bestimmten Zelle zugeordnet, aber sie liegt auf dieser Zelle nun mal halt oben drauf.

Du hast es aber auch nicht wirklich ausprobiert, weil dir das wohl irgendwie unlogisch vorkommt. Und deshalb habe ich mal eben eine ganz simple Testdatei angehängt. In der befindet sich im Tabellenblatt *Start* ein Textfeld, welches ja auch ein Grafisches Element ist, auf dem/innerhalb des Zellbereich "G8:I11". Das Textfeld ist von der Größe her kleiner als der Zellbereich.

Und ferner ist dort auch noch ein CommandButton mit dem Text "Textfeld löschen" vorhanden, welches das folgende Makro ausführt.

Code: Alles auswählen

sub GrafikenLoeschen
dim oDocGL as object
oDocGL = thisComponent
oDocGL.Sheets(0).getCellRangeByName("G8:I11").clearContents(128)
end sub
Wenn Du also auf den Button drückst, dann wird das Textfeld im, oder besser gesagt auf dem angegebenen Zellbereich gelöscht.

Einfach mal ausprobieren!

Du kannst ja auch den Zellbereich auf das hier ändern: getCellRangeByName("A1:I13"), und schauen was passiert.

Aber Achtung!
Wenn gelöscht, dann ist es gelöscht. Ich habe nix eingebaut um das gelöschte Textfeld per Button wieder neu zu zeichnen.
Mittels "Rückgängig" kann das gelöschte Textfeld aber wieder zurückgeholt werden.

Ja, ich kenne noch so im ganz groben eine ältere Verrsion von deinem Rechentrainer, aber dein aktuelles Problem ist da ja noch nicht drin.
... doch, das Problem hatte ich früher schon. Da war es aber nicht so klar nachvollziehbar. Je nach Betriebssystem, Computerinstallation oder Openoffice bzw. LibreOffice Version die meine Schüler nutzten kam es immer wieder zu Abstürzen.
Ich weiss es wirklich nicht ob es mittlerweile eine andere/bessere/einfachere oder was auch immer Methode gibt um Grafische Elemente zu löschen. Ich habe aber das Makro unter OO.o 3.2.1 erstellt und unter LO 5.1.5.2 so wie unter AOO 4.1.3 getestet. Und es funktioniert überall so wie es soll.

Wenn ich die entsprechenden Codes in eine leere Datei kopiere funktionieren sie natürlich wunderbar - erst in der Gesamtversion klappt es nicht.
Ja, das dein Code verdammt lang ist, das weiss ich noch. Aber wenn ich das lese, dann muss da aber was sehr im Argen liegen. Ich zumindest würde da auf ein Problem mit den vergebenen Variablen tippen, entweder falsch oder gar nicht deklariert, oder aber eine Doppelbelgegung, mal wird sie so deklariert und defeniert, und dann wieder anders.

Ich weiss ja nicht in wie weit Du das überarbeitet hast, aber ich habe hier ja noch eine Version von April 2012, in der Du im Modul *AnfangEnde* die Variablen wie folgt deklariert hattest, beispielweise.

Code: Alles auswählen

dim  hoch, probe, abbr, TestErst, flag as boolean
dim Beginn, Ende, Zwischen, ZeitB, LstgB, LstgG, ZeitL, LstgS, LstgL, LstgH, DatumL as date
dim i, m, n, z, Zeitraum as integer
Und von den gezeigten sind nur insgesamt 3 Variablen richtig deklariert, alle anderen sind Falsch. Findest Du die richtigen?

Und auch wenn es noch so bequem ist Variablen einfach automatisch auf Variant setzen zu lassen, so wie zu sehen, so kann sich das früher oder Später unangenehm bemerkbar machen. Jede Variable muss absolut eindeutig deklariert werden, da führt kein Weg drunherum, grad in deinem Mamut-Code (nicht negativ gemeint).
Das ist bei mir immer die erste Anlaufstelle, wenn es irgendwo hakt: Sind alle Variablen richtig deklariert?


So, und nun gehts ab ins Bett.



gruß
balu
Dateianhänge
test-textfeld-löschen.ods
(22.87 KiB) 151-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Abstürze beim Löschen von Objekten auf einer Drawpage

Beitrag von erikafuchs »

Hallo Balu,
also erstmal
Und von den gezeigten sind nur insgesamt 3 Variablen richtig deklariert, alle anderen sind Falsch. Findest Du die richtigen?
,
jawohl, das habe ich geändert. Nicht alles was du mir damals empfohlen hast habe ich geändert (never change a running system) aber das schon. Ich glaube auch dass bei diesem Löschproblem ein oO Problem leigt, da ich beim Suchen (auch hier im Forum) zu diesem Thema (eigentlich immer) eine Bemerkung gefunden habe, dass die Routinen zum Löschen der Objekte zu Programmabstürzen führen können.
Ein Grafisches Element ist wohl nicht direkt einer ganz bestimmten Zelle zugeordnet, aber sie liegt auf dieser Zelle nun mal halt oben drauf.
... da weiß ich nicht so recht ob ich dieses Fass aufmachen soll. Bei meinen Fragen zur Geometrie erzeuge ich auf einem größtenteils leeren Tabellenblatt eine weiße Fläche auf der ich geometische Figuren erzeuge, die aus zig Objekten bestehen. z.B. Dreiecke mit Winkeln, Maßlinien und Benennungen. Da das auf allen Seiten außer der Seite 1 funktioniert lasse ich da lieber die Finger von. Mit dem Trick, dass ich auf der Seite 1 sieben Elemente eingefügt habe und nur die weiteren Objekte außer diesen lösche funktioniert das bis jetzt einwandfrei. Mal sehen,was passiert, wenn unsere Schüler damit arbeiten.
Antworten