Seite 1 von 1

Wie löscht man Button/Felder?

Verfasst: Fr, 14.01.2011 12:35
von Steppenwolf
Hallo zusammen,
schon wieder hab ich ein Problem. Ich versuche gerade via makro odt Dateien in docs umzuspeichern. Problem ist: Das sieht Bescheiden aus ^^
Ich hab in meiner odt mehrere versteckte Felder die beim umspeichern sichtbar werden und buttons die natürlich ihre funktion in der doc verlieren. Also möchte ich diese Elemente vor dem speichern aus der odt entfernen.
Es ist für mich kein problem mit Makro die Namen abzufragen und hab daraufhin versucht mit der deleteByName() Methode den Kram zu entfernen. Die Methode sagt mir aber das es unter dem Namen nichts zu löschen gäbe. Es ist anzunehmen das das auch die falsche methode ist, da ich die einfach blind mit Xray aus "ThisComponent" rausgesucht habe.
Aber wie lösch ich jetzt die Felder und buttons wenn ich nur den Namen habe?

Gruß Steppenwolf

Re: Wie löscht man Button/Felder?

Verfasst: Fr, 14.01.2011 23:54
von clag
Hallo Steppenwolf,

diesen Code

Code: Alles auswählen

sub ButtonEntfernen
  oDoc = thisComponent
  REM entfernt die Zuordnung zur Drawpage
  odoc.drawpage.forms.getByIndex(0).removeByName("Schaltfläche 1") 
  REM  entfernt den Button (die Zeichnung) aus dem Dokument
'  for i = 0 to oDoc.drawpage.getCount -1
'       if odoc.Drawpage.getByIndex(i).control.name = "Schaltfläche 1" then
'          odoc.Drawpage.remove(odoc.Drawpage.getByIndex(i))
'       end if
'  next
end sub
habe ich mal aufgeschnappt und dann erfolgreich angewendet um Button zu löschen :)

Re: Wie löscht man Button/Felder?

Verfasst: So, 16.01.2011 14:26
von Steppenwolf
Danke für die antwort,
die removebyName methode kannte ich ja schon, allerdings ist mir jetzt aufgefallen das diese tatsächlich das tut, was ich gerne möchte. Nur werden die docs die anschliessend immer noch mit den Buttons und feldern gespeichert. Führt man das Maykro dann noch einmal aus erkenne ich an den gespeicherten odts das die Buttons und Felder tatsächlich weg sind.
Das bedeutet dann wohl, das nach dem Löschen so ne Art "Artefakte" von den Feldern übrig sind die immer noch in den docs mitgespeichert werden aber bei der odt speicherung tatsächlich gelöscht werden.
Ich glaub ich hab schon eine Lösung dafür mal gucken,

Falls jemand das Problem kennt oder eine Lösung weiß würde ich mich natürlich trotzdem freuen ^^

Edit :
Also zur meiner Idee. Ich dachte mir ich speicher das Dokument ohne Felder und buttons, öffne es danach und speichere von diesem Dokument aus die Docs.
Leider bekomme ich das nicht hin weil OpenOffice ständig abstürzt

Code: Alles auswählen

        rem Hier war der Code für die odt speicherung - Das funktioniert

	Rem deletefunktion
	deleteButtons()
	
	Dim Dummy2()
	sURL = sourcePath & "temp.odt"
	thisDoc.StoreToURL(sUrl, Dummy2())
	
	dim myFileProp2() as new com.sun.star.beans.PropertyValue
	thisDoc2 = StarDesktop.loadComponentFromURL(sURL,"_blank",0,myFileProp2)
	
	REM Init next step "Doc-Speicherung"	
	counter = 0
	testOfStop = oDataArray(counter)(0)
	
	Dim oMediaDescriptor(0) As new com.sun.star.beans.PropertyValue
	oMediaDescriptor(0).Name = "FilterName"
	oMediaDescriptor(0).Value = "MS Word 97"
	
	Form = thisDoc2.Drawpage.Forms.GetByindex(0)
	While (testOfStop <> "Stop")
		oFeld = Form.getbyName("IT-Investnr")
		oFeld.text = testOfStop
	
		sDateiName = testOfStop & "_" & sErhebung & ".doc"
		sURL = sourcePath & testOfStop & "/" & sDateiName
		sURL = ConvertToURL(sURL)
		
		thisDoc2.StoreToURL( sURL , oMediaDescriptor() ) 'weiter brauch ich den Code nicht kopieren da dort OpenOffice abstürzt
ach ich was Falsch? Sollte ich mit dem "Temporären" Dokument anders umgehen?

Re: Wie löscht man Button/Felder?

Verfasst: So, 16.01.2011 20:04
von DPunch
Aloha

Das hört sich fast haargenau an, wie das Problem, das Clag in diesem Thread schonmal geschildert hatte.
Die Code zum "wirklichen" Löschen der Schaltflächen findet sich dort.

Re: Wie löscht man Button/Felder?

Verfasst: Mo, 17.01.2011 19:11
von Steppenwolf
Hi, also ich hab mir das mal angesehen mit dem "wirklichen Löschen".

Allerdings muss ich sagen, das ich das schon auspropbiert habe. Habs zwar nochmal mit diesem Code versucht:

Code: Alles auswählen

Function deleteButtons rem thisDoc As Object)
	Dim I As Integer
	drawp = ThisComponent.Drawpage
	Form = drawp.Forms.GetByIndex(0)
	I = Form.Count-1
	While (I <> -1)
		Temp = Form.getbyIndex(I)
		sname = Temp.getName
		If (hier steht meine elendig lange bedingung für die Namen der Felder)Then
			Form.RemoveByName(sname)
			For n = drawp.Count-1 To 0 Step -1
      			oThisShape = drawp.getByIndex(n)
      			If NOT isNull(oThisShape.Control) Then <---- HIER kommt es zum Fehelr mit der Message
         			sControlName = oThisShape.Control.Name
         			if (sControlName = sname) Then
         				drawp.remove(oThisShape)
         			End If
      			End If
   			Next n
			'for x = 0 to drawp.getCount -1
       		'	if drawp.getByIndex(x).control.name = sname then
          	'		drawp.remove(drawp.getByIndex(i))
       		'	end if
			'next
		End If
		I = I -1
	WEND
End Function
Leider bekomm ich immer wieder gesagt:
BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: Control.
Deswegen habe ich es ja versucht die datei OHNE Buttons zu speichern und neu zuu laden. Um dann "schöne docs daraus zu speichern. Jetzt bin ich ganz verwirrt. Iwie funktioniert alles nicht so wie ich es gerne hätte. Vor allem macht der Fehler überhaupt keinen Sinn. Schliesslich prüft die If Bedingung, ob da ein Control existiert, aber es meint ja lieber abzubrechen und zu schreien das es das Control nicht gibt -.- Seltsam Seltsam.

Was mach ich jetzt? Wäre cool, wenn mir jemand einen funktionierenden Code für eine Button-lösch-Methode , schicken könnte. (Am besten mit einem String Parameter, der der Name des Buttons sein sollte) Damit könnte ich dann mal überprüfen, ob es nicht vll am Dokument selbst liegt

Re: Wie löscht man Button/Felder?

Verfasst: Mo, 17.01.2011 22:33
von DPunch
Aloha

Code: Alles auswählen

Sub RemoveControl(sControlName as String)
	If Len(sControlName) = 0 Then Exit Sub
	bRemoved = False
	oDoc = thisComponent
	oDoc.lockControllers
	oDrawPage = oDoc.Drawpage
	oForm = oDrawPage.Forms.getByIndex(0)
	If oForm.hasByName(sControlName) Then
		oForm.removeByName(sControlName)
		bRemoved = True
	End If
	If NOT bRemoved Then oDoc.unlockControllers : Exit Sub
	For n = oDrawpage.Count-1 To 0 Step -1
		oThisShape = oDrawpage.getByIndex(n)
		If oThisShape.supportsService("com.sun.star.drawing.ControlShape") Then
			If oThisShape.Control.Name = sControlName Then
				oDrawpage.remove(oThisShape)
				Exit For
			End If
		End If
	Next n
	Do While oDoc.hasControllersLocked
		oDoc.unlockControllers
	Loop
End Sub