[gelöst] Kann Grafik aus Zelle nicht per Makro löschen

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

Moderator: Moderatoren

LeverAction
*
Beiträge: 17
Registriert: Di, 05.12.2006 22:26
Wohnort: Schiffdorf

[gelöst] Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von LeverAction »

Hallo allerseits,

ich habe nach langer Zeit 'mal wieder meine Druckvorlage für Ordner-Etiketten benutzt, und festgestellt, dass diese
nicht mehr richtig funktioniert; Die Grafik wird beim Abwählen per Checkbox nicht mehr aus der Zelle entfernt.
Zur Erklärung sei noch erwähnt, dass das Makro vor Jahren mit der Version 2.4 erstellt wurde.
Wenn man die Checkbox anwählt, wird in der Zelle darunter ein Logo eingefügt, und drei waagerechte Rahmenlinien
werden aktiviert.
Mir ist auch noch nicht ganz klar, warum ich die Grafik über die DrawPage einfüge und das Entfernen über die Flags
der Methode ClearContent geschieht, zumindest hat es so schon funktioniert.
Kann mir jemand einen Tipp geben, wie man eine Grafik anspricht, die man über die DrawPage eingefügt hat?

Bitte um Vorschläge.

Gruß,
Matthias
Dateianhänge
OrdnerRücken-4761.ots
Druckvorlage für Ordner-Etiketten
(14.94 KiB) 48-mal heruntergeladen
Zuletzt geändert von LeverAction am Do, 29.03.2012 09:41, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von F3K Total »

Hallo,
bei mir funktioniert Dein Makro.
Haken drin, Grafik einfügen, Haken raus, Grafik weg.
Natürlich nur, wenn sich hinter dem Link: file:///G:/Grafiken/Logo.jpg auch eine Datei verbirgt.

Gruß R

Edit: Du hast 4x das nahezu gleiche Marko in 4 Modulen gehabt, anbei das Makro etwas kompakter (1x für alle 4 Checkboxen)
Dateianhänge
OrdnerRücken-4761.ots
(11.26 KiB) 50-mal heruntergeladen
LeverAction
*
Beiträge: 17
Registriert: Di, 05.12.2006 22:26
Wohnort: Schiffdorf

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von LeverAction »

Hallo R,

zunächst einmal vielen Dank für die reduzierte Version.
Sie funktioniert bei mir aber leider genauso wenig wie meine.
Natürlich liegt meine Grafik am richtigen Ort, bzw. der Pfad ist entsprechend angepasst.
Einfügen kann ich sie ja auch, aber sie bleibt in der Zelle, wenn ich den Haken rausnehme.
Was sich inzwischen geändert hat ist das Betriebssystem (Win 7 statt Win XP) und die OpenOffice Version.

Hat vielleicht noch Jemand eine Idee?

Gruß,
Matthias
LeverAction
*
Beiträge: 17
Registriert: Di, 05.12.2006 22:26
Wohnort: Schiffdorf

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von LeverAction »

Hallo Waldschrat,

an den "Basics" liegt es nicht, glaube mir. Trotzdem vielen Dank für deine Unterstützung.
Es war ja auch nur eine Vermutung von mir, dass es an den "Veränderungen" liegen könnte.

Vielleicht kann man ja auch das Entfernen der Grafik anders umsetzen, z.B. wieder über die DrawPage die Grafik ansprechen?
Oder das Ein- und Ausblenden ganz anders realisieren, z.B. einfach nur die Größe der Grafik ändern, sprich Size.Widht=0 und Size.Height=0 oder die gewünschte Größe.
Bitte um gute Ratschläge.

Gruß,
Matthias
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von F3K Total »

LeverAction hat geschrieben:... Ein- und Ausblenden ...
Genau, einfach Ein- oder Ausblenden.
Dazu das Logo 4 mal einfügen, und dem jeweiligen Logo über das Kontextmenü diese Namen geben:
LogoA
LogoC
LogoE
LogoG
Dann geht dieses Makro:

Code: Alles auswählen

sub S_Logo(Event)
rem ----------------------------------------------------------------------
rem Variablen definieren

	dim oDoc   as object
	dim oBlatt as Object
	dim oForm as Object
	dim iState as Integer
	dim Grafik as Object
	dim Page as Object
	dim myImage as String
	dim oZelle1 as Object
	dim oZelle2 as Object
	dim oSel as Object
	dim oRanges as Object
	dim oLinie as new com.sun.star.table.BorderLine
	dim oRahmen1 as new com.sun.star.table.TableBorder
	dim oRahmen2 as new com.sun.star.table.TableBorder

rem ----------------------------------------------------------------------
rem Prüfen ob das Macro in einem Calc-Dokument ausgeführt wird

	If NOT ThisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
		MsgBox "Dieses Makro funktioniert nur mit einen OpenOffice.org-Calc", 48, "Fehler"
		Exit Sub
	End if

rem ----------------------------------------------------------------------
rem Checkbox abfragen und Aktionen ausführen
    ochkbox = event.source.model
    S = ochkbox.tag 'Zusatzinformation der Checkbox auslesen
	oDoc = ThisComponent
	oBlatt = oDoc.Sheets(0)
	oZelle1 = oBlatt.getCellRangeByName(S+"2")
	oZelle2 = oBlatt.getCellRangeByName(S+"4")
	iState = ochkbox.state
	Page = oBlatt.drawPage
    for i = 0 to Page.count-1
	  oShape = Page(i)
	  if oShape.name = "Logo"+S then exit for
	next
	if iState = 1 then
	
	'Grafik in Zelle einblenden
		oShape.Visible = true

	'Horizontale Rahmenlinien aktivieren	
		oLinie.Color = rgb(0, 0, 0)
		oLinie.outerLineWidth = 25

		With oRahmen1
			.TopLine = oLinie
			.isTopLineValid = True
			.BottomLine = oLinie
			.isBottomLineValid = True
		End with
	
		With oRahmen2
			.BottomLine = oLinie
			.isBottomLineValid = True
		End with
	
	elseif iState = 0 then
	'Rahmenlinien entfernen	
		With oRahmen1
			.TopLine = oLinie
			.isTopLineValid = 1
			.BottomLine = oLinie
			.isBottomLineValid = 1
		End with
	
		With oRahmen2
			.BottomLine = oLinie
			.isBottomLineValid = 1
		End with
		
	'Logo ausblenden
     oShape.Visible = false
		
	end if

	oZelle1.TableBorder = oRahmen1
	oZelle2.TableBorder = oRahmen2
		
'Cursor zur Texteingabe auf Zelle setzen
	oSel = oDoc.CurrentController
	oSel.Select(oZelle2)
	oRanges = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
	oSel.Select(oRanges)
	oFrame = ThisComponent.CurrentController.Frame
	oFrame.ContainerWindow.setFocus

end sub
Viel Erfolg Gruß R
LeverAction
*
Beiträge: 17
Registriert: Di, 05.12.2006 22:26
Wohnort: Schiffdorf

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von LeverAction »

Hallo R,

vielen Dank für den Vorschlag, ich habe allerdings momentan wenig Zeit mich damit intensiv zu beschäftigen.
Ein erster schneller Test ist fehlgeschlagen. In der Einzelschrittausführung tritt der Fehler bei der Zeile
"ockbox = event.source.model" auf. Basic-Laufzeitfehler: Argument ist nicht optional.
Muß mich erst einmal schlau lesen, wie man mit dem event.source.model arbeitet.

Gruß,
Matthias
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von F3K Total »

Hallo,
der Fehler weist darauf hin, dass Du das Makro nicht an die Checkbox gehängt und von dort gestartet hast, sondern es über Extras/Makros ... ausgeführt hast.
Da das Makro die Quelle seines eigenen Aufrufs (event.source) benötigt, kann es auf diese Art nicht funktionieren.

Gruß R
LeverAction
*
Beiträge: 17
Registriert: Di, 05.12.2006 22:26
Wohnort: Schiffdorf

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von LeverAction »

Hallo R,

ich hatte das Makro schon an die Checkbox gehängt, ich glaube bei Statusänderung wird es aufgerufen.
Mir wird die ganze Fehlersuche aber nun zu zeitraubend, inzwischen habe ich eine ganze Reihe von Dokumenten aus unterschiedlichsten Quellen eingesammelt.
Überwiegend beschäftigen sich die Beiträge/Dokumente immer nur mit dem Einfügen von Grafiken, und nicht mit dem Entfernen. Das scheint in Calc nicht so einfach zu sein.
Auch mit dem Handling von eingefügten Grafiken muß ich mich intensiver beschäftigen, z.B. warum ich eine Grafik, die ich über Page.add(...) eingefügt habe, nicht auch wieder mit Page.remove(...) entfernen kann.
Auch das Ein- oder Ausblenden hat nicht funktioniert, Eigenschaft "Visible" war nicht bekannt.
Das sind noch zuviele Baustellen für mich.

Vielen Dank noch einmal für deine Unterstützung, vielleicht kann ich sie im kommenden Herbst/Winter wieder gebrauchen ;-)

Gruß,
Matthias
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von balu »

Hallo

anfang des Jahres stand ich vor dem gleichem Problem: Grafiken löschen. Ich habe da wohl auch eine Methode gefunden sie zu löschen, die aber nicht ganz ungefährlich ist.

Die Methode sieht wie folgt aus.

Code: Alles auswählen

sub GrafikenLoeschen
dim oDocGL as object
	oDocGL = thisComponent
	oDocGL.Sheets(0).getCellRangeByName("B1:F5").clearContents(128)
end sub
Dadurch werden alle Zeichenobjekte im Zellbereich B1:F200 gelöscht, praktisch theoretisch.
Die Probleme dabei sind folgende.
Wenn sich in der Spalte B (Zelle B1) eine Grafik befindet, so MUSS die X-Position der Grafik auch wirklich in der Spalte B beginnen.
Beispiel:
Spalte A ist 2,58 cm breit. Position X der Grafik mus mindestens 2,58 sein.
Warum betone ich das?
Weil eine Grafik so rein Optisch sich wohl in der Spalte B befindet, aber die Fläche kann eventuell schon in der Spalte A bei Position 2,57 anfangen -{kommt auf die Grafik drauf an}-. Und dadurch wird ja die Grafik nicht der Spalte B, sondern A zugeordnet. Folglich wird sie beim löschen nicht erfasst, und auch nicht gelöscht.

Okay, ich denk mir das kann man noch so einigermaßen verstehen und auch nachvollziehen. Aber richtig verwirrend wird es erst jetzt.

Angenommen in den Zellen A1 bis F1 sind Grafiken die bis in die Zeile 3 hineinragen, und diese will man nun mit .clearContents löschen. So reicht es nicht aus einfach zu sagen:.getCellRangeByName("B1:F1").clearContents(128). Das Ergebnis ist nämlich; es werden keine Grafiken gelöscht! :shock:

Warum ist das so?
Keine Ahnung!
Denn Sinn versteh ich auch nicht, aber die Ursache dafür habe ich herausgefunden.
Vielleicht habt ihr das schon mal gesehen, und euch nichts dabei gedacht. Es kann schon mal vorkommen wenn eine Datei mit Grafiken geöffnet/geladen wird, dann sieht man unter Umständen ganz kurz anstelle der Grafiken einen Platzhalter und Senkrecht darunter einen Text. Und wenn die Datei fertig geöffnet/geladen ist, dann sieht man nur noch die Grafik.
Hier mal ein Screenshot was ich meine.
Grafikpfade.png
Grafikpfade.png (15.03 KiB) 2312 mal betrachtet
Und die Länge dieses Textes, genauer gesagt die Pfadangabe, muss nun berücksichtigt werden. In diesem Falle bedeutet das, das die Code-Zeile wie folgt aussehen müsste.

Code: Alles auswählen

sub GrafikenLoeschen
dim oDocGL as object
	oDocGL = thisComponent
	oDocGL.Sheets(0).getCellRangeByName("B1:F31").clearContents(128)
end sub
Das wäre für die Endzeile ein mindestmaß (31). Besser ist es wenn es sogar erhöht wird. Und erst jetzt lassen sich die Grafiken wie gewünscht löschen.

Wie man nun aber allerdings am einfachsten und schnellsten die End-Adressierung herausbekommt, weiß ich nicht, das muss man irgendwie austesten.

Es besteht aber noch ein gewisses Gefahrenpotenzial. Denn nicht nur Grafiken, nein, auch Formulare-Steuerelemente die sich innerhalb des Adressbereichs befinden, werden Gnadenlos gelöscht.


Bitte verzeiht wenn ich jetzt meine Idee mit .clearContents nicht in die Beispieldatei(en) eingebaut habe, aber ich durchblicke momentan die Makros nicht so recht.

Jedoch ist mir grad eben noch etwas aufgefallen.

Code: Alles auswählen

   oZelle1 = oBlatt.getCellRangeByName(S+"2")
   oZelle2 = oBlatt.getCellRangeByName(S+"4")
Muss das so sein?

Ich würde das z.B. so schreiben.

Code: Alles auswählen

   oZelle1 = oBlatt.getCellRangeByName(S&2)
   oZelle2 = oBlatt.getCellRangeByName(S&4)

Gruß
balu
Dateianhänge
grafiken_löschen_1.ods
(18.08 KiB) 90-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
LeverAction
*
Beiträge: 17
Registriert: Di, 05.12.2006 22:26
Wohnort: Schiffdorf

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von LeverAction »

Hallo Balu,

meine Hochachtung! Das war genau der entscheidende Hinweis.
Nachdem ich den Wert für die X-Position der Grafik ein wenig erhöht hatte, funktionierte es einwandfrei.
Alternativ hätte ich auch den Löschbereich erweitern können, wie Du bereits erwähnt hast. Auch das habe ich mit Erfolg überprüft.

Ob der Code, der dir aufgefallen war, auch auf deine Art geschrieben werden kann, weiß ich auch nicht genau, der wurde von "R" beigesteuert.

Nun kann ich ja beruhigt in die "Sommerpause" gehen.
Vielen Dank noch einmal an alle Helfer, vielleicht kann ich mich ja irgendwann revanchieren.

Gruß,
Matthias
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von F3K Total »

Hallo Balu,
balu hat geschrieben:Jedoch ist mir grad eben noch etwas aufgefallen.

Code: Alles auswählen

       oZelle1 = oBlatt.getCellRangeByName(S+"2")
       oZelle2 = oBlatt.getCellRangeByName(S+"4")
Muss das so sein?
Ich würde das z.B. so schreiben.

Code: Alles auswählen

       oZelle1 = oBlatt.getCellRangeByName(S&2)
       oZelle2 = oBlatt.getCellRangeByName(S&4)

Du hast je Ausdruck zwei Zeichen eingespart. Das ist eleganter.
Das Ergebnis von S+"2" und S&2 ist gleich: Ein String, der aus dem Inhalt des tags und einer Zahl zusammengesetzt ist.
Gruß R
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Kann Grafik aus Zelle nicht per Makro löschen

Beitrag von balu »

Hallo,

@Matthias
Freut mich zu hören, dass ich helfen konnte :D.


@R
Also ist es reine Geschmacksache. Danke.



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
Antworten