Stichworten mit Hyperlink

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

Moderator: Moderatoren

martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Stichworten mit Hyperlink

Beitrag von martin11 »

Ich könnte gut ein Makro gebrauchen, mit dem ich den Stichworten einen Hyperlink einbinden kann.
So wie das beim Inhaltsverzeichnis oder bei den Fußnoten vorhanden ist.
Martin
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

Folgendes funktioniert bei mir seit Jahren in OO:

Code: Alles auswählen

Dim tt
dim startzeit
Dim fehler_log

Dim warten_model
Dim oMod_warten

Dim bereinigte_eintraege(0) 'array mit Seitenzahlen (ReDim im Code beachten)
Dim eintraege_zusatz(0) 'array mit Zusätzen f. oder ff. wenn zutreffend
Dim akt_zusatz 'der jeweils aktuelle Zusatz
Dim weiter 'Fehlerspeicher für Einträge
Dim nummer_untereintrag 'Zähler für Stichwortverzeichniseintrag mit mehreren Seitenzahlen
Dim anzahl_seiteneintraege 'Anzahl der Seiteneinträge für aktuelles Stichwort im Verzeichnis

Dim abbruch_durch_benutzer 'kennzeichnet das Benutzer manuell abgebrochen hat
Dim raus 'beendet Hauptschleife Do-Loop


Sub verweise_setzen()
	'Autor: www.jm-schmidt.de
	startzeit = time()
	fehler_log = ""
	abbruch_durch_benutzer = 0
	raus = 0
	
	rueck = 0
	rueck = Msgbox("Wollen Sie die Einträge im Stichwortverzeichnis verlinken? " & _
		CHR(13) & CHR(13) & "ACHTUNG das Stichwortverzeichnis muss unmittelbar vor " & _
		"dem Start des Makros hier, aktualisiert worden sein. Ansonsten klicken Sie bitte ab ""Abbrechen"" " & _
		" und aktualisieen das Stichwortverzeichnis und starten Sie danach das Makro neu." & CHR(13) & " ", 33, "Stichwortverzeichnis bearbeiten")
	
	If Not(rueck = 1) Then Exit Sub
	
	cur = ThisComponent.Text.createTextCursor
	
	indexes = ThisComponent.getDocumentIndexes()
	For i = 0 To Indexes.getCount() - 1
		oIndex = Indexes.getByIndex(i)
		If oIndex.supportsService("com.sun.star.text.DocumentIndex") Then

			cur.gotoRange(oIndex.getAnchor, false)
			cur.CollapseToStart 'vorderste Position im Verzeichnis
			
			'warten-Dialog--------------------------
			warten_model = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
			warten_model.setPropertyValue("Width",  200) '343
			warten_model.setPropertyValue("Height", 65) '65
			warten_model.SetPropertyValue("Title","Bitte etwas Geduld")
		
			oMod_warten = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
			With oMod_warten
				.setPropertyValue("Name","warten1")
				.setPropertyValue("PositionX",5) '192
				.setPropertyValue("PositionY",5) 
				.setPropertyValue("Width",180)
				.setPropertyValue("Height",15)
				.setPropertyValue("MultiLine", True)
				.setPropertyValue("Label","Querverweise werden erstellt ...")
			End With
			warten_model.insertByName("warten1", oMod_warten)

			oMod_warten2 = warten_model.createInstance("com.sun.star.awt.UnoControlButtonModel")
			With oMod_warten2
				.setPropertyValue("Name","but1")
				.setPropertyValue("PositionX",70)
				.setPropertyValue("PositionY",45) '45
				.setPropertyValue("Width",60)
				.setPropertyValue("Height",16)
				.setPropertyValue("Label", "Stop")
				.setPropertyValue("DefaultButton", True)
				'.setPropertyValue("Enabled", False)
			End With
			warten_model.insertByName("but1", oMod_warten2)
			
			oListbut = createUnoListener("butlist_","com.sun.star.awt.XActionListener")
			
			oMod_warten3 = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
			With oMod_warten3
				.setPropertyValue("Name","warten3")
				.setPropertyValue("PositionX",5) '192
				.setPropertyValue("PositionY",20) 
				.setPropertyValue("Width",180)
				.setPropertyValue("Height",15)
				.setPropertyValue("MultiLine", True)
				.setPropertyValue("Label","")
			End With
			warten_model.insertByName("warten3", oMod_warten3)
			 
			warten_dialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
			warten_dialog.setModel(warten_model)
			
			warten_dialog.getControl("but1").addActionListener(oListbut)
			
			oWin2 = CreateUnoService("com.sun.star.awt.Toolkit")
			warten_dialog.createPeer(oWin2, null)
			warten_dialog.setVisible(True)

			'#Anzahl Einträge ermitteln
			anzahl_eintraege = 0
			Do
				IF cur.ParaStyleName = oIndex.ParaStyleLevel1 OR cur.ParaStyleName = oIndex.ParaStyleLevel2 OR _
					cur.ParaStyleName = oIndex.ParaStyleHeading Then
						anzahl_eintraege = anzahl_eintraege + 1
						cur.GotoNextParagraph(False)
					Else
						Exit Do
				End If
			Loop	
			
			cur.gotoRange(oIndex.getAnchor, false)
			cur.CollapseToStart
			
			
			Do While raus = 0
				dd = dd + 1
				cur.GotoEndOfParagraph(False)
				IF cur.ParaStyleName = oIndex.ParaStyleLevel1 OR cur.ParaStyleName = oIndex.ParaStyleLevel2 Then
						cur.GotoStartOfParagraph(False)
						cur.GotoEndOfParagraph(True)
						tmp = Split(cur.String, CHR(9)) 'es wird das Vorhandensein eines Tabulators je Eintrag vorausgesetzt
						'#
						If LEN(tmp(0)) > 0 Then 
								warten_dialog.getControl("warten3").Text = "Aktuelles Stichwort ... " & tmp(0) 
							Else
								warten_dialog.getControl("warten3").Text = "Bookmarks werden geprüft ..."
						End If
						Wait 100
						
						tmp2 = Split(tmp(1), ", ") 
						
						weiter = 0
						If UBOUND(tmp2()) = 0 Then
								If teilen(tmp2(0)) = "nOK" Then
									'####--------------------->ernster Fehler
									'weiter = 0
									'bereinigte_eintraege(0) = teilen(tmp2(0)) 'überflüssig da ohnehin nur ein Eintrag zu bearbeiten
								Else
									weiter = 1
									'geprüft und OK
									ReDim bereinigte_eintraege(0)
									bereinigte_eintraege(0) = teilen(tmp2(0))
									ReDim eintraege_zusatz(0)
									eintraege_zusatz(0) = akt_zusatz
								End If
								If weiter = 1 Then
									'-->Hauptroutine für eine Seitenzahl-------------------------------
									erg = finden(tmp(0), dd)
									If erg <> "OK" Then 
											'Msgbox "Fehler bei: " & tmp(0)
											'Exit Sub
											fehler_log = fehler_log & tmp(0) & CHR(13)
										Else
											'aktueller Textmarke entspricht: "x_" & dd
											'cur hinter Tabulator und Seitenzahlen weg
											cur.GotoStartOfParagraph(False)
											cur.goRight(LEN(tmp(0))+1, False)
											cur.GotoEndOfParagraph(True)
											cur.String = ""
											
											oReference = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
											oReference.SourceName = "x_" & tmp(0) & "-" & dd
		  									oReference.SequenceNumber = 0
		  									oReference.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.PAGE
		  									oReference.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.BOOKMARK
		   									ThisComponent.getText.insertTextContent(cur, oReference, False)
		   									
		   									cur.GotoEndOfParagraph(False)
		   									cur.CollapseToEnd()
		   									cur.String = eintraege_zusatz(0)
		   									
		   									warten_dialog.getControl("warten1").Text = "Einträge wurden bearbeitet ... " & dd & " von " & anzahl_eintraege
		   									'warten_dialog.model.getByName("progress1").setPropertyValue("ProgressValue", dd)

		   									Wait 150
		   									
									End If
									'---------------------------------------------------------------<--
								End If
							Else 'mehr als ein Eintrag
								ReDim bereinigte_eintraege(UBOUND(tmp2()))
								ReDim eintraege_zusatz(UBOUND(tmp2()))
								anzahl_seiteneintraege = UBOUND(tmp2()) 'Anzahl-1 der vorhandenen Seitenzahlen bei aktuellem Eintrag
								for ii = LBOUND(tmp2()) To UBOUND(tmp2())
									If teilen(tmp2(ii)) = "nOK" Then
										'####--------------------->ernster Fehler
										'weiter = 0 '-->darf nicht verwendet werden, wegen Konflikt mit anderen Einträgen
										 bereinigte_eintraege(ii) = teilen(tmp2(ii)) 'entspricht "nOK", essentiell für Hauptroutine
										 fehler_log = fehler_log & tmp(ii) & CHR(13)
									Else
										weiter = 1
										'geprüft und OK
										bereinigte_eintraege(ii) = teilen(tmp2(ii))
										eintraege_zusatz(ii) = akt_zusatz
									End If
								Next ii
								'Hinweis zu "weiter":
								'durch weiter = 1 im Else-Teil wird sichergestellt das auch
								'bei nur einer 'funktionierenden' Seitenzahl später die Hauptroutine aufgerufen wird
								If weiter = 1 Then
									'-->Hauptroutine für mehrere Seitenzahlen--------------------------
									'Hinweis: es gibt hier nur ein dd für mehrere Seiteneinträge
									nummer_untereintrag = 0
									erg2 = finden2(tmp(0), dd) 'erg2 ist "OK" wenn MINDESTENS ein Durchlauf OK war
									If erg2 <> "OK" Then 
											fehler_log = fehler_log & tmp(0) & CHR(13) 'kein einziger Untereintrag war OK
										Else
											'einzelne Untereinträge könnentrotzdem nicht OK sein
											'nummer_untereintrag enthält den akt. Zählerstand für Untereinträge
											
											'aktueller Textmarke entspricht: 
											'"x_" & eintrag & "-" & aktuelle_Nummer & "-" & nummer_untereintrag
											'cur hinter Tabulator und Seitenzahlen weg
											cur.GotoStartOfParagraph(False)
											cur.goRight(LEN(tmp(0))+1, False)
											cur.GotoEndOfParagraph(True)
											cur.String = ""
											
											'alle Seitenzahlen durchprüfen:
											for jj = 0 To anzahl_seiteneintraege
												If bereinigte_eintraege(jj) = "nOK" Then
														'nichts tun
													Else
														'alle relevanten Bookmarks durchlaufen:
														For jjj = 0 To nummer_untereintrag
															cur.GotoEndOfParagraph(False) : cur.CollapseToEnd() 'zur Sicherheit
															
															oReference = ThisComponent.createInstance("com.sun.star.text.textfield.GetReference")
															oReference.SourceName = "x_" & tmp(0) & "-" & dd & "-" & jjj
						  									oReference.SequenceNumber = 0
						  									oReference.ReferenceFieldPart = com.sun.star.text.ReferenceFieldPart.PAGE
						  									oReference.ReferenceFieldSource = com.sun.star.text.ReferenceFieldSource.BOOKMARK
						   									ThisComponent.getText.insertTextContent(cur, oReference, False)
						   									
						   									cur.GotoEndOfParagraph(False)
						   									cur.CollapseToEnd()
						   									
						   									'letztes Textfeld des aktuellen Eintrags verweist auf aktuelle Bookmark
						   									'die Seitennummer dieses Textfeld/Querweis sichtbar machen und vergleichen:
						   									oReference.update()
						   									
						   									hh = ""
						   									yy = 0
						   									Do
						   									'Wait 500 '! 'reicht 200 in allen Situationen?
						   									Wait 10
						   									yy = yy + 1
						   									hh = oReference.CurrentPresentation()
						   									If yy > 100 Then hh = "mach Weiter" 'zur Sicherheit
						   									Loop While hh = ""
						   									
						   									If oReference.CurrentPresentation() = bereinigte_eintraege(jj) Then
						   										'#
						   										'Msgbox oReference.CurrentPresentation() & "|" & bereinigte_eintraege(jj)
						   										'der richtige Verweisist gesetzt, Zusatz ggf. egänzen
						   										cur.String = eintraege_zusatz(jj) & ", "
						   										Exit For
						   										
						   										Else
						   											'Eintrag ist nicht der Richtige, deshalb entfernen
						   											cur.goLeft(1, True)
						   											cur.String =""
						   									End If
						   									
														Next jjj
												End If
											Next jj
											
											'alle SEiteneinträge/Querverweise sind gesetzt, aber Ende ist: ", "
											cur.GotoEndOfParagraph(False)
				   							cur.CollapseToEnd()
				   							cur.goLeft(2, True)
				   							If cur.String = ", " Then 
				   								cur.String =""
				   							End If
				   							cur.GotoEndOfParagraph(False)
				   							
				   							warten_dialog.getControl("warten1").Text = "Einträge wurden bearbeitet ... " & dd & " von " & anzahl_eintraege
		   									Wait 150 
											
									End If	
									'---------------------------------------------------------------<--
									
								End If
						End If
					ElseIf cur.ParaStyleName = oIndex.ParaStyleHeading Then
						'Überschrift
						'cur.GotoNextParagraph(False) 'weiter	
					Else
						raus = 1
						cur.GotoPreviousParagraph(False)
				End If
				cur.GotoNextParagraph(False)
			Loop
		End If
	Next i
	
	On Error Resume Next '#!
	

	ThisComponent.getTextfields.refresh()
	
	warten_dialog.setVisible(False)
	
	'Cursor richtig positionieren:
	vCur = ThisComponent.getCurrentController().getViewCursor()
	cur9 = vCur.Text.CreateTextCursor()
	
	indexes = ThisComponent.getDocumentIndexes()
	For i = 0 To Indexes.getCount() - 1
		oIndex = Indexes.getByIndex(i)
		If oIndex.supportsService("com.sun.star.text.DocumentIndex") Then
			cur9.gotoRange(oIndex.getAnchor, false) 'hier Fehler?
			cur9.CollapseToStart
			cur9.GotoEndOfParagraph(False)
			cur9.GotoNextParagraph(False)
			vCur.gotoRange(cur9, false)
		End If
	Next i
	Wait 500
	
	if fehler_log <> "" Then
		fehler_log = "Fehler bei: " & CHR(13) & fehler_log
	End If
	
	If abbruch_durch_benutzer = 1 Then
			Msgbox "Bearbeitet wurden " & dd-1 & " Einträge."  & CHR(13) & CHR(13) & "Start: " & startzeit & CHR(13) & _
		"Ende: " & time() & CHR(13) & CHR(13) & fehler_log, 16, "Abbruch durch Benutzer"  
		Else
			Msgbox "Bearbeitet wurden " & dd-1 & " Einträge."  & CHR(13) & CHR(13) & "Start: " & startzeit & CHR(13) & _
		"Ende: " & time() & CHR(13) & CHR(13) & fehler_log, 64, "Fertig"
	End If
	
	
	
	
	
End Sub	
	

'unterscheidet und teilt Ausdrücke der Form:
'123
'123f.
'123ff.
Function teilen(xx)
	On Error Resume Next
	teilen = ""
	akt_zusatz = ""
	
	tmp_l = LEN(xx) 
	lmp_l2 = tmp_l-2 '2-->f.; 3-->ff.
	lmp_l3 = tmp_l-3 '2-->f.; 3-->ff.
	
	'Fehler vermeiden der durch Resume Next entsteht:
	If lmp_l2 < 0 Then lmp_l2 = 0
	If lmp_l3 < 0 Then lmp_l3 = 0
	
	If IsNumeric(Left(xx, lmp_l2)) AND Right(xx, 2) = "f." Then
		'eine Zahl mit f.
		teilen = Left(xx, lmp_l2)
		akt_zusatz = "f."
	ElseIf IsNumeric(Left(xx, lmp_l3)) AND Right(xx, 3) = "ff." Then
		'eine Zahl mit ff.
		teilen = Left(xx, lmp_l3)
		akt_zusatz = "ff."
	ElseIf IsNumeric(xx) Then
		'nur eine Zahl
		teilen = xx
	Else
		'irgendwas Anderes
		 teilen = "nOK"
	End If
	On Error Goto 0
End Function


Function finden(eintrag, aktuelle_Nummer)
'Msgbox "|" & eintrag & "|"
finden = "nOK"
indexes = ThisComponent.getDocumentIndexes()
'For a = 0 To 260
for i=0 to indexes.count-1
		index = indexes(i)
		if index.supportsService("com.sun.star.text.DocumentIndex") then
		
	    marks = index.DocumentIndexMarks

	    for j=uBound(marks()) to lBound(marks()) Step -1
	    	If marks(j).getAnchor.getString() <> "" Then 'dbg_properties
	    		kk = marks(j).getAnchor.getString()
	    		Else
	    		kk = marks(j).MarkEntry()
	    	End If
	    	
	    	'doppelte Leerzeichen entfernen
	    	mm = Split(kk, " ")
	    	
	    	
	    	tmp_m = ""
	    	For m = LBOUND(mm()) To UBOUND(mm())
	    		If mm(m) <> "" Then
	    			If tmp_m = "" Then
	    				tmp_m = mm(m)
	    			Else
	    				tmp_m = tmp_m & " " & mm(m)
	    			End If
	    		End If
	    	Next m
	    	kk = tmp_m
	    	 
	    	If kk = eintrag Then 
	    	finden = "OK"
	    	
	    	'nur gültig für Einträge mit nur einer Seitenzahl:
	    	oDoc = ThisComponent
			oText = oDoc.getText()
			oControlelr = oDoc.getCurrentController()
			oViewCursor = oControlelr.getViewCursor()
			
			f = marks(j).getAnchor
			oViewCursor.gotoRange(f, false) '??
			
			cur1 = oViewCursor.Text.CreateTextCursor
			cur1.gotoRange(f, false)
			
			oBookmark = ThisComponent.createInstance("com.sun.star.text.Bookmark")
	      	oViewCursor.gotoRange(cur1, false)
	      	oBookmark.setName("x_" & eintrag & "-" & aktuelle_Nummer)
	      	oViewCursor.Text.insertTextContent(cur1, oBookmark, False)
	      	
	    	Exit For
	    	End If
	    Next j
	    End If
Next i
End Function


Function finden2(eintrag, aktuelle_Nummer)
	finden2 = "nOK"
	indexes = ThisComponent.getDocumentIndexes()
	for i=0 to indexes.count-1
		index = indexes(i)
		if index.supportsService("com.sun.star.text.DocumentIndex") then
		
	    marks = index.DocumentIndexMarks
		
	    for j=uBound(marks()) to lBound(marks()) Step -1
	    	If marks(j).getAnchor.getString() <> "" Then 'dbg_properties
	    		kk = marks(j).getAnchor.getString()
	    		Else
	    		kk = marks(j).MarkEntry()
	    	End If
	    	
	    	'doppelte Leerzeichen entfernen
	    	mm = Split(kk, " ")
	    	
	    	
	    	tmp_m = ""
	    	For m = LBOUND(mm()) To UBOUND(mm())
	    		If mm(m) <> "" Then
	    			If tmp_m = "" Then
	    				tmp_m = mm(m)
	    			Else
	    				tmp_m = tmp_m & " " & mm(m)
	    			End If
	    		End If
	    	Next m
	    	kk = tmp_m
	    	 
	    	If kk = eintrag Then 
		    	finden2 = "OK" 
		    	
		    	'nur gültig für Einträge mit nur einer Seitenzahl:
		    	oDoc = ThisComponent
				oText = oDoc.getText()
				oControlelr = oDoc.getCurrentController()
				oViewCursor = oControlelr.getViewCursor()
				
				f = marks(j).getAnchor
				oViewCursor.gotoRange(f, false) '??
				
				cur1 = oViewCursor.Text.CreateTextCursor
				cur1.gotoRange(f, false)
				
				oBookmark = ThisComponent.createInstance("com.sun.star.text.Bookmark")
		      	oViewCursor.gotoRange(cur1, false)
		      	oBookmark.setName("x_" & eintrag & "-" & aktuelle_Nummer & "-" & nummer_untereintrag)
		      	oViewCursor.Text.insertTextContent(cur1, oBookmark, False)
		      	
		      	nummer_untereintrag = nummer_untereintrag + 1
	      	
	    	End If
	    Next j
	    End If
Next i

'um 1 reduzieren
If nummer_untereintrag >= 1 Then 'diese Prüfung ist eigentlich überflüssig, es muss mindestens 2 Seitenzahlen/Untereinträge geben
	nummer_untereintrag = nummer_untereintrag - 1
End If

End Function


Sub butlist_ActionPerformed()
	abbruch_durch_benutzer = 1
	raus = 1
End Sub


Gruß
Stephan
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Stichworten mit Hyperlink

Beitrag von martin11 »

Guten Tag Stefan,
ich danke dir von Herzen. :lol:
Martin
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Stichworten mit Hyperlink

Beitrag von martin11 »

Zur Verdeutlichung,
Dieses Eingabe Feld soll aufgerufen werden.
Komm der gleiche Eintrag mehrfach vor, stehen dort mehrere Seitenzahlen.
Es soll von denen nur eine angeklickt werden.
Insofern ist die Meldung ein Eintrag gefunden, also nicht bearbeitet,
das ist aber nur ein Wort in einer Meldung
Wurde der Eintrag editiert, soll, der von mir unter neuem Stichwort gespeichert werden.
Martin
Dateianhänge
Hyperlink_Ruft_Maske.jpg
Hyperlink_Ruft_Maske.jpg (51.72 KiB) 5075 mal betrachtet
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

Wenn ich den Code richtig verstehe, wird per Code ein Dialog erstellt.
Dieser wurde bei mir jedoch erst sichtbar, als ich ein
Wait 3000 eingegeben hatte:
Die Sichtbarkeit dieses Dialogs ist unwesentlich, weil der nur den Fortschritt anzeigt. Mutmaßlich ist auf Deinem System irgendeine Besonderheit die dazu führt das die Anzeige nicht richtig aktualisiert wird, wodurch der Dialog nicht sichtbar wird. Ich kenne aus meiner täglichen Praxis dutzende Fälle wo sowas passiert ohne das eine konkrete Ursache feststellbar wäre.
der 'übliche' Workaround ist dann ein "wait..." einzufügen, so wie Du es getan hast, es sollte praktisch aber bereits ein kleiner Wert genügen, z.B. "wait 10". Lediglich gehört das "wait" dann dorthin wo sich der Inhalt der Anzeige dieses Dialogs ändert ... Moment, da ist ja bereits Eines, nämlich "Wait 150".

Somit: ich kann leider keinen konkreten Grund angeben warum der Dialog nicht angezeigt wird.
Jetzt weiß ich aber auch nicht, ob ich es richtig verstanden habe.
Soll der Code im gesamten Stichwortverzeichnis Hyperlinks erstellen,
um von hier aus zu den Textsektionen zu springen?
Ja. Genau gesagt erzeugt der Code Querverweise die zu den Stichwörtern im Text springen.

Ansonsten tut es mir leid, ich werde ich diesem Falle keine Hilfe leisten, denn das Makro ist extrem komplex und in mehrtätiger Arbeit für ein Kundenprojekt entstanden.
Ich habe es hier im Forum nur gepostet weil ich weiß das das was der Frager wollte nur sehr kompliziert zu erreichen ist und das nicht mit einigen Worten zu erklären gewesen wäre.

Natürlich habe ich das Makro aktuell getestet bevor ich es hier im Forum postete und habe es jetzt, auf Deine Fehlermeldung hin, nochmals speziell mit AOO 4.1.6. In Beiden Fällen war die Funktion fehlerfrei.

Einen Tipp kann ich geben: ich weiß das das Makro in seltenen Fällen Probleme macht wenn sich die Stichwörter nicht im Fließtext befinden. Möglicherweise ist auch das hier die Ursache.
(Das Makro ist so konzipiert das es alle Stichwörter im Fließtext und in Fußnoten bearbeiten können soll, Weiteres war nicht Ziel und ist nie explizit geprüft worden.)



Gruß
Stephan
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Stichworten mit Hyperlink

Beitrag von martin11 »

Stephan,
Wenn das Makro bei dir läuft, ergibt sich die Frage, ob man das ganze nicht kompilieren kann?
Dann müsste es ja auch hier laufen.
Denn Win 10 soll ja Win 10 sein, hoffentlich.
Kann man das nach Java konvertieren?
Ich habe gelesen, dass in OP und Lo viel mit Java erstellt wurde.
Und Basic kann man doch auch kompilieren.
Dann hätte man zwei oder mehr Exen die sich aufrufen.

Nur mal zur Erklärung,
Ich bin Schriftstelle und kein Logiker, das muss man als Programmierer ja sein.
In Lauf der Jahrzehnte erfährt man eben das eine und das andere.

Martin
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

Wenn das Makro bei dir läuft, ergibt sich die Frage, ob man das ganze nicht kompilieren kann?
Nein, eigentlich nicht.
Ein Makro ist ja gerade ein Makro weil es zur Laufzeit interpretiert wird[1] und nicht vorher kompilliert, denn sonst wäre es ein Programm und kein Makro.

[1]
ja, "Faol" äußert sich dazu etwas anders, das aber wäre dann eine Diskussion unter Experten, denn es geht dabei quasi um den Unterschied zwischen Interpreter und Laufzeitkompiler


Anderserseits sei angemerkt das es irgendwo im Internet (ich weiß gerade nicht wo) es tatsächlich ein Projekt gibt das eine Software erstellt hat mit der man OO-Makros kompilieren kann. Ich weiß aber nicht einmal ob das Projekt noch aktiv ist.

Ich selber schreibe seit mehr als 10 Jahren beruflich Makros für OO und habe noch nie eines kompiliert, weil das völlig, völlig unüblich ist.

(wohlgemerkt, ich rede hier nicht über Basic, sondern über Basic-Makros. Natürlich kompiliere auch ich VisualBasic oder VisualBasic .Net Code, nur das sind keine Makros.)
Kann man das nach Java konvertieren?
Ja sicher, aber dazu fehlen mir persönlich die Kenntnisse, denn ich programmiere kein Java.
Dann hätte man zwei oder mehr Exen die sich aufrufen.
Da ich erahne wohin das zielt, will ich betonen: der einzige Grund ein kompilliertes Programm einzusetzen (und das wäre wohl eher eine dll und keine exe) sind hier, meiner Meinung nach, Geschwindigkeitsfragen, denn strenggenommen ist ein Basic-Makro für das Verlinken des Stichwortverzeichnisses recht langsam, man würde also z.B. Python oder Java bevorzugen, nur beide Programmiersprachen kann ich persönlich nicht und habe deshalb Basic genutzt.

Ich kann Dir hingegen garantieren, das es kein Grund ist eine Exe deshalb einzusetzen weil es bei Extensions Probleme mit Menüs oder dem Aufruf einzelner Makros gäbe.

Nur mal zur Erklärung,
Ich bin Schriftstelle und kein Logiker, das muss man als Programmierer ja sein.
In Lauf der Jahrzehnte erfährt man eben das eine und das andere.
Es ist allen In Ordnung, Du darfst auch gerne als Nicht-Programmierer Gedanken zur Programmierung äußern oder Fragen stellen oder Antworten in Zweifel ziehen. Das stört oder ärgert niemanden, denn im Kern ist das ja hier ein Forum für Endanwender und nicht für den Meinungsaustausch zwischen Experten.



Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

wie es z.B. bei Fußnoten und Einträgen im Inhaltsverzeichnis der Fall ist.
Keine klaren Sprungziele weil:
Beispiel:
Seite 20ff
Ja, das stimmt. Im geposteten Makro ist das für "ff" so gelöst das an die erste Fundstelle verlinkt wird.
Fortfolgend per Makro im Text zu finden, nun ja.
Ich erinnere mich nicht ob im Makro alle 'Treffer' bei "ff" durchlaufen werden (oder nach dem ersten zum nächsten Stichwort verzweigt wird), genutzt wird letztlich nur der jeweils Erste.

Vielleicht muss ich an der Stelle dazu sagen das es noch eine Hilfsroutine für das Makro gibt die alle gesetzten Textmarken nachträglich entfernen kann, damit das Makro mehrfach auf ein Dokument angewendet werden kann wenn das Dokument durch Bearbeitung wächst.
Zwar kannst Du das Makro auch so mehrfach anwenden, nur irgendwann dürfte der Punkt erreicht sein wo OO wegen zu vieler Textmarken 'aussteigt'.

kann es eigentlich nur an der Struktur des Dokuments liegen.
Ja, natürlich.
Es handelt sich um ein Buch mit ca. 240 Seiten. Hierin sind neben dem Fließtext,
auch mehrere Texttabellen (inklusive der Stichwörter) enthalten, Grafiken, Bilder.
Das Makro, wie ich es hier gepostet habe, ist Teil einer Fachanwendung die ich für einen Verlag programmiert habe und für die Tests stand mir ein Dokument mit ca. 500 Seiten und ca. 3000 Stichworteinträgen (200 Abbildungen, 15 Tabellen) zur Verfügung (habe gerade in mein Archiv geschaut).
Das Makro ist also in der Lage mit recht großen Dokumenten zu laufen, allerdings ist die Laufzeit auch entsprechend hoch, ich glaube um 30 Minuten für das erwähnte Dokument.
Nun ich habe beim Programmieren auch die Erfahrung gemacht, dass man nicht alle Eventualitäten voraussehen kann.
Gerade bei komplexeren Aufgaben tritt dieses Problem häufiger auf.
Genau so ist es. z.B. habe ich bei diesem Makro das erste Mal in Praxis erlebt das Textmarken (die ja unsichtbar sind) wenn sie gehäuft auftreten nicht keine Breite haben, sondern tausende Textmarken dazu führen das sich der Textfluss geringfügig ändert und dadurch sich natürlich auch Seitenzahlen etc. verschieben, was dann auch wieder berücksichtigt werden muss.
Du wirst, wenn Du selbst programmieren kannst an vielen Stellen des Makros merken, das nachgebessert wurde und teilweise nur workarounds verwendet wurden, das sind die Stellen wo bei realen Tests bzw. auch beim Produktiveinsatz einzelne Probleme auftraten wo sich aber keine konkrete Ursache finden lies. (in Praxis ist das auch immer eine Kostenfrage)


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

Resultat:
Sobald sich Texttabellen im Dokument befinden,
funktioniert das Makro bei mir nicht.
Es muss noch weitere Nebenbedingungen geben, denn in meinem damaligen Testdokument gibt es Texttabellen und ich habe jetzt kurz drei davon kontrolliert, das sind 08/15 Texttabellen, also nicht Tabelle in Rahmen oder sowas.

Aktuell getestet hatte ich hingegen auch nur mit einem kurzen, schnell erstellen Dokument.


Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

Es muss noch weitere Nebenbedingungen geben, denn in meinem damaligen Testdokument gibt es Texttabellen
Ich habe jetzt ein Testdokument mit Tabelle erstellt, wo das Makro bei mir durchläuft.



Gruß
Stephan
Dateianhänge
Testdokument mit Tabellle.odt
(24.97 KiB) 109-mal heruntergeladen
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Stichworten mit Hyperlink

Beitrag von martin11 »

Guten Abend Stephan,
kannst Du, würdest Du was daran machen können, wollen?
Das Stichwortverzeichnis darf nicht alphabetisch formatiert sein.
Menü Einfügen → Verzeichnisse → Stichwortverzeichnis
Register Einträge → Rubrik „Formatierung“ → Alphabetisches Trennzeichen.
Sollte das viel sein, dann muss das nicht für Gotteslohn sein.
Ich könnte Dir das gesamte Buch schicken.
Albert
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

martin11 hat geschrieben: Do, 14.02.2019 18:19 Guten Abend Stephan,
kannst Du, würdest Du was daran machen können, wollen?
Das Stichwortverzeichnis darf nicht alphabetisch formatiert sein.
Menü Einfügen → Verzeichnisse → Stichwortverzeichnis
Register Einträge → Rubrik „Formatierung“ → Alphabetisches Trennzeichen.
Sollte das viel sein, dann muss das nicht für Gotteslohn sein.
Ich könnte Dir das gesamte Buch schicken.
Albert
Ich hatte ja gleich in den Thread geschrieben das ich zu diesem Makro keine weitere Hilfe leisten möchte, weil das Makro sehr komplex ist und mir noch aus einem Kundenprojekt in unliebsamer Erinnerung, des Aufwands wegen.
Trotzdem habe ich mir jetzt angeschaut was "Faol" zu dem Problem in dem zip hochgeladen hat und eine Stunde einige Dinge ausprobiert. Ohne Erfolg.

Wenn Dir mein Wort hier genügt, das ich Deine Datei vertraulich behandeln werde, kannst Du mir über das Forum hier eine persönliche Nachricht schicken und die Datei anhängen. Dann würde ich einmal draufschauen (aber natürlich ohne jede Zusage eine Lösung zu finden).


Gruß
Stephan
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Stichworte mit Hyperlink

Beitrag von martin11 »

Hallo Stephan,
ich komme auf deinen Eintrag vom 14.2. zurück.
Private Nachricht das verstehe ich nicht.
Ich schicke Dir hier das Dokument.
Leide ist auch die Zip zugroß, was tun?
Gruß
Martin
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Stichworten mit Hyperlink

Beitrag von Stephan »

Private Nachricht das verstehe ich nicht.
wenn Du angemeldet bist ist bei jedem registrierten Forumsteilnehmer ein 'Button' zu sehen wo Du draufklicken und zwischen Email und Privater Nachricht wählen kannst. Eine Private Nachricht ist technisch nichts Anderes als ein nicht-öffentlicher Forumspost/Thread.
Leide ist auch die Zip zugroß, was tun?
Wie groß ist die denn? Hoffentlich nicht größer als einige MB?


Gruß
Stephan
martin11
*****
Beiträge: 237
Registriert: Do, 30.03.2017 16:07

Re: Stichworten mit Hyperlink

Beitrag von martin11 »

Hallo Stephan < 3 Mb
Martin
Antworten